Jmeterで簡単負荷試験


ダウンロード

https://jmeter.apache.org/download_jmeter.cgi に行きBinariesから解凍可能な形式のバイナリをダウンロードします。

起動

WindowsとMac, Linuxで少々違うようです。

Windows

ダウンロードした apache-jmeter-5.2.1(2020/2/28時点) ディレクトリを開きます。
binディレクトリ内の jmeter.bat をダブルクリックし起動してください。
GUIが開いたら起動完了です。

Mac, Linux

ターミナルを起動します。
ダウンロードした apache-jmeter-5.2.1(2020/2/28時点)に移動します。
bin/jmeter.shを実行します。
GUIが開いたら起動完了です。

負荷試験

さて本題です。
あるAPIに対しての性能試験をする事を想定してJmeterの設定をしていきます。
APIの定義をいくつかしておきましょう。

API定義

POST /api/v1/login

header
{
  "Content-Type": "Application/json",
}
request
{
  "username": "jmeter",
  "password": "apache"
}
response
{
  "token": "bhknFCZWaCDME1KhGz5wdbBx"
}

GET /api/v1/users

header
{
  "Authorization": "bhknFCZWaCDME1KhGz5wdbBx",
}
request
{}
response
{
  "users": [
    {
      "username": "Aさん"
    },
    {
      "username": "Bさん"
    }
  ]
}

シナリオ作成

/api/v1/loginでログインし、/api/v1/usersにアクセスすることにします。
/api/v1/loginでアクセストークンを取得し、そのアクセストークンを使って/api/v1/usersにアクセスします。

  1. スレッドグループを作成します。
  2. ログイン処理のために「一度だけ実行されるコントローラ」を追加します。
  3. /api/v1/loginのHTTPリクエストを追加します。
  4. HTTPリクエストに後処理を追加し、アクセストークンを抽出します。
  5. /api/v1/usersのHTTPリクエストを追加します。

画像を添付しつつ説明します。

1. スレッドグループを作成

「テスト計画」を右クリックし「追加」→「Threads(Users)」→「スレッドグループ」をクリックします。

2. ログイン処理のために「一度だけ実行されるコントローラ」を追加

「スレッドグループ」を右クリックし「追加」→「ロジックコントローラ」→「一度だけ実行されるコントローラ」をクリックします。

3. /api/v1/loginのHTTPリクエストを追加

「一度だけ実行されるコントローラ」を右クリックし「追加」→「サンプラー」→「HTTPリクエスト」をクリックします。
追加できたら、追加した「HTTPリクエスト」を選択し内容を入力します。

プロトコル

httphttpsを入力します。(サーバーにあったものを入力してください)

サーバ名またはIP

ホストネームを入力します。

ポート番号

サーバーがバインドしているポートを入力します。

メソッド

HTTPメソッドを選択します。

パス

APIのパスを入力します。

Parameters

リクエストで送るパラメータ。いわゆるクエリパラメータ。
今回は定義に合わせて、usernamepasswordを含めます。

4. HTTPリクエストに後処理を追加しアクセストークンを抽出

ログイン処理のレスポンスにアクセストークンが含まれていますが、このままでは次のアクセスにアクセストークンを含めることができません。
レスポンスを抽出して保存する必要があります。

3で追加した「HTTPリクエスト」を右クリックし「追加」→「後処理」→「正規表現抽出」をクリックします。
追加した「正規表現抽出」を選択し内容を入力します。
それぞれの入力内容についてはこちらを参照ください。

参照名

抽出した値を呼び出すための名前。好きな名前でOKです。
今回はわかりやすくパラメータと同じ名前をつけています。

正規表現

抽出するパラメータの正規表現を入力します。()で囲っている部分を抽出します。

テンプレート

正規表現にマッチした値グループの内どれを使用するかを指定します。$n$でグループを選択する。先頭は1。


5. /api/v1/usersのHTTPリクエストを追加

「スレッドグループ」を右クリックし「追加」→「サンプラー」→「HTTPリクエスト」をクリックします。
追加した「HTTPリクエスト」を選択し内容を入力します。
接続先情報は3と一緒ですので割愛します。
/apiv1/usersへアクセスするにはヘッダにアクセストークンを含める必要があるのでヘッダ情報を追加します。
「HTTPリクエスト」を右クリックし「追加」→「設定エレメント」→「HTTPヘッダマネージャ」をクリックします。
「HTTPヘッダマネージャ」を選択しパラメータを追加します。
今回は{Authorization: Token ${token}}を追加します。入力の仕方は画像を参照ください。


試験

負荷レベル

「スレッドグループ」を選択すると以下の項目が表示されます。

  • スレッド数
  • Ramp-Up期間(秒)
  • ループ回数
スレッド数

実行数。ユーザー数のように捉えたら良いです。
同時接続件数を指定する場合はここを調整します。

Ramp-Up期間(秒)

指定した秒数をかけてスレッドを立ち上げます。
例えば、スレッド数が5、Ramp-Up期間が5の時
1秒あたり1スレッドが実行されることになります。

ループ回数

名前の通りです。
このスレッドグループのシナリオを繰り返す回数です。

実行

▶︎ボタンを押してRunしましょう。

おまけ

「スレッドグループ」を右クリックし「追加」→「リスナー」→「統計レポート」を追加すると、シナリオのスループットやエラー件数のレポートを確認できるようになります。

参考

Jmeter簡易リファレンス http://sy5.sakura.ne.jp/jmeter/ref/postprocessors/regularexpressionextractor.html