ダウンロード・起動
GUI 起動まで
$ wget http://www-eu.apache.org/dist/jmeter/binaries/apache-jmeter-3.1.tgz
$ tar xvzf apache-jmeter-3.1.tgz
$ cd apache-jmeter-3.1
$ bin/jmeter
GUI mode should only be used for creating the test script, NON GUI mode must be used for load testing
とある通り、GUI モードはテストスクリプトを生成するためだけに使う。実際に負荷テストを行う際には CUI から。
※ JVM のパラメータを指定して実行することもできる。
$ JVM_ARGS="-Xms1024m -Xmx1024m" bin/jmeter -t bin/examples/CSVSample.jmx
クイックスタート
GUI で
- 「テスト計画」を右クリック→「追加」→「スレッドグループ」
- 「スレッドグループ」を選択し、スレッド数、Ramp-Up期間(秒)、ループ回数を設定
- 「スレッドグループ」を右クリック→「追加」→「サンプラー」→「HTTP リクエスト」
- 「HTTP リクエスト」を選択し、編集
- 「スレッドグループ」を右クリック→「追加」→「リスナー」→「統計レポート」
- 「開始」
スレッドグループの定義
項目 | 内容 | 備考 |
---|---|---|
サンプラーエラー後のアクション | サンプラー = HTTP リクエストなど、クライアントからの何らかのアクション。これがエラーになった際の挙動を定義 | ・「Start Next Thread Roop」と「続行」の違い: 前者はそのスレッドを中断して次のスレッドループを開始する。後者は(おそらく)スレッドの処理を継続する ・「テスト停止」と「Stop Test Now」の違い:前者はいずれかのサンプルの終了を待って、後者は即座にテストを停止 |
スレッド数 | 同時に何スレッド動かすか(最大同時セッション数)。1スレッドはブラウザの1つのタブに相当 | |
Ramp-Up 期間 | このスレッドグループのテストを1回回すのに何秒かけるか(スレッドの起動間隔を調整)。 | ex. スレッド数30、Ramp-Up 期間120であれば、 各スレッドはおおむね4秒おきに起動される |
ループ回数 | テストの実行回数 | |
Delay Thread creation untill needed | ||
スケジューラ | これを有効にすると、「指定のループ回数終了時、」「終了時刻に達した時」「持続時間に達した時」のうち一番早いものに達した時点でテストが終了する | 応答を待っているサンプラーへの割り込みは行われないため、終了時刻は状況次第で遅れることがある |
持続時間 | この時間だけテストを実施する(終了時刻よりもこちらが優先される???) | |
(??)起動遅延 | この秒数だけテストの実行を遅延する | |
開始時刻 | この時刻が来るまでテストの実施を待つ | |
終了時刻 | この時刻までテストを実施する | |
【スレッド数・Ramp-Up 期間・ループ回数】 | スレッド数 | Ramp-Up | ループ回数 | 結果 | | :– | :– | :– | :– | | 5 | 10 | 3 | 2秒ごとにスレッド起動、ループ開始(次のスレッドが起動するより先に前のスレッドのループ3回が終了している) | | 2 | 10 | 3 | 5秒ごとにスレッド起動、ループ開始(同上) | | 5 | 0 | 3 | 同時に全てのスレッドが起動、3回数ループして即時終了 |
定数スループットタイマー
これを追加することで、負荷テストのスループットを指定できる。
項目 | 説明 |
---|---|
ターゲットスループット(サンプル数/分) | 1分あたりのリクエスト数を指定 |
Calculate Throughput based on | 上記の指定値をどう解釈するか |
「Calculate Throughput based on」の設定の違いについて実験:
- スレッド数: 6
- Ramp-Up: 0
- 無限ループ
- 持続時間: 60
- ターゲットスループット/分: 60 | 設定 | 総リクエスト数 | 特徴の考察 | | :– | :– | :– | | this thread only | 366 | 各スレッドそれぞれが指定したスループットでリクエストを投げようとする(全体のスループットは指定した値にスレッド数をかけると出てくる) | | all active threads | 66 | ・スレッド数がいくらであっても、全体のスループットが指定した値になるよう調整される。
・各スレッドが同じタイミングでリクエストして1秒休むので、全体で見ると「6件連続リクエスト→1秒休み」が繰り返される | | all active threads (shared) | 66 | ・スレッド数がいくらであっても、全体のスループットが指定した値になるよう調整される。
・スレッドどうしが連携して、全体として均等なペースでリクエストを投げようとする(毎秒1件ずつリクエストが飛ぶ) |
サンプラーの定義
Http Request
項目 | 内容 | 備考 |
---|---|---|
Implementation | ||
プロトコル | HTTP, HTTPS, FILE | デフォルトは HTTP |
Content encoding | 文字のエンコーディングとして使われ、HTTP の Content-Encoding ヘッダには影響しない | |
リスナーの追加
結果を見るためにリスナーを追加する。
スレッドグループを右クリック >「追加」>「リスナー」>「結果を表で表示」/「グラフ表示」など
NON-GUI モード
-n
オプションを使うと NON-GUI モードで起動する。その他、必要な設定ファイルをオプションで指定する。
オプション | 説明 |
---|---|
-n | JMeter を非 GUI モードで起動 |
-t [ファイル名] | テスト計画の JMX ファイル名を指定 |
-l [ファイル名] | テスト結果を格納する JTL ファイル名を指定 |
-j [ファイル名] | JMetter の実行ログファイル名を指定 |
設定ファイル
JMX
テスト計画本体。GUI で作成して CUI で実行するのが良さそう?
テストレポート作成
- 実行時オプションで
-l hoge.jtl
のようにして JTL ファイル(↓)を作成する cf. JTLFiles
# unixtime[ms], ...
1503484686997,19,HTTP リクエスト,200,OK,スレッドグループ 1-1,text,true,194,3,3,19
1503484686997,22,HTTP リクエスト,200,OK,スレッドグループ 1-2,text,true,194,3,3,22
1503484687004,20,HTTP リクエスト,200,OK,スレッドグループ 1-3,text,true,194,1,1,20
1503484687174,30,HTTP リクエスト,200,OK,スレッドグループ 1-4,text,true,194,1,1,30
...
- これを使って
Tips
外部ファイルに書かれたパラメータを順に使ってリクエスト
- スレッドグループを右クリック >「追加」>「前処理」>「ユーザーパラメータ」
- 「変数の追加」> 適当なパラメータ名(!= リクエストパラメータ名)と読み込むファイルのパスを設定
- ex. 名前:
query
- ex. ユーザー_1:
${_StringFromFile(queries.txt)}
- ex. 名前:
指定するファイルパスは以下のいずれか
- 絶対パス
- (要確認)jmx ファイルのパス or jmeter 実行ディレクトリからの相対パス
- スレッドグループを右クリック >「追加」>「サンプラー」>「HTTP リクエスト」
- 「追加」> 2で設定したパラメータ名をリクエストパラメータの値に設定
- ex. 名前:
q
- ex. 値:
${query}
- ex. 名前:
ファイルの上から順にパラメータに代入してリクエストが実行される
- リクエストの合計回数がファイルの行数に満たない場合、それ以降の行は読み込まれない
- リクエストの合計回数がファイルの行数を超える場合、再びファイル先頭から読み込まれる