JMeterは性能試験において、ほぼ必須とも言えるツールです。ただ、数年に1回程度しか使わないため、毎回操作方法を忘れてしまい、調べ直す羽目になります。
そこで今回は、個人的によく使う機能を備忘録としてまとめておきます。
前提
以下の環境で動作確認を行っています。
os | windows11(4cpu、16GB) |
Jmeter | 5.5 |
.NET | 8.0.304 |
IDE | Visual Studio 2022 Community |
変数の利用
ユーザー定義変数
HTTPリクエストでポート番号やパスなどの共通値を毎回入力するのは手間です。
そのようなときは変数として定義して使い回すのが便利です。変数を自由に定義できます。
「Add > Config Element > User Defined Variables」を追加します。

使用時は${変数名}で参照します。

カウントアップ
1から順に数字をカウントアップしたい場合に便利です。デフォルトでCounterが用意されていますのでこれを利用します。「Add > Config Element > Counter」で追加します。

リクエストボディに設定して試します。なお、文字列(ダブルクォーテーション)の中でも展開可能です。API側でcountとnameプロパティをログに出して確認します。


最大値を設定すると、最大値に達した後は初期値から再スタートします。
ランダムな数値
「Add > Config Element > Random Variable」で、ランダムな値を生成できます。
フォーマットも指定できます。以下の例では1~9の1桁のランダムな数値を生成しますが、フォーマットを指定すると最終的には「A03」のような出力になります。

埋め込み関数
事前設定なしで使える関数も用意されています。以下はよく使う関数の例です。
内容 | 使用方法 | 出力例 |
スレッド番号 | ${__threadNum} | 1(スレッドグループのNumber of Threadsに対応) |
時間 | ${__time(yyyy/MM/dd hh:mm:ss,)} | 2025/04/27 03:09:16 |
ランダム数値 | ${__Random(0,10)} | 3 |
ランダム文字列 | ${__RandomString(5)} | dgfbf |
カウンター | ${__counter(False)} | 1(Falseを指定するとスレッド間で共有される) |
UUID | ${__UUID()} | 10bc6464-959e-45e7-b54d-37b7b22657ad |
TPS設定
性能試験で最も重要なのは、想定通りの負荷を出せるかどうかです。様々な方法がありますので、いくつかのパターンを紹介します。
○○tpsでx分間
まずはシンプルな設定例です。例として、「5 TPSで3分間負荷をかける」ケースを紹介します。
スレッドグループの設定
Number of Threads (users) | 5 |
Ramp-up period (seconds) | 30 ※この値は無関係 |
Loop Count | infinite |
Duration (seconds) | 180 |

定数スループットタイマーの設定
Target throughput | 300.0 |
Calculate Throughput based on: | all active threads (shared) |

Target throughputは1分間の値を指定するので、60s × 5tpsで300となります。
これを実行すると、以下のように5tsで負荷をかけられます。

定数スループットタイマーに180を指定すれば3tpsを、420を指定すれば7tpsの負荷をかけることができます。
複数のAPIを実行する
性能試験では複数のシナリオを想定して負荷をかけます。目的に応じて様々な方法があります。
ランダムコントローラー
「6 TPSで3分間」テストし、2つのAPIに3 TPSずつ分散させたい場合を想定します。
「Add > Logic Controller > Random Controller」から追加します。そしてランダムコントローラーの下にHTTP Requestを2つ作成します。それぞれAPI1、API2を実行します。

以下のように概ね想定通りの負荷がかけられています。

ランダムコントローラーは完全な50%分散ではありません。
ざっくり分散できればOKという場面で有効です。正確な割合を求める場合は別の方法を使いましょう。
スループットコントローラーの利用
スループットコントローラーを使うことで、より柔軟に制御できます。ここでは全体で5tpsの負荷をかけます。その中で、API1に60%(3tps)、API2に40%(2tps)の割合でリクエストを分散させることを想定します。
まずは5tpsになるよう定数スループットタイマーを設定します。詳細は割愛しますが、1分当たりのリクエスト数に300を指定します。そして次にスループットタイマーを2つ作成します。それぞれAPI1、API2用です。API1用の設定を以下に示します。Based onに「Percent Executions」、Throughputに「60(%)」を指定します。API2は40%を指定します。

別の結果も含まれていますが、FirstとSecondに着目すると、それぞれのAPIが想定する負荷で実行されています。

スレッドグループで分ける
先ほどまでは1つのスレッドグループの中で2つのシナリオを作成ました。今回はスレッドグループを2つに分けて、それぞれのグループごとに定数スループットタイマーで負荷を設定します。
この時、「Calculate Throughpu based on」の設定値を「all active threads in currrent thread group (shared)」にします。これでスレッドグループごとに任意の負荷をかけることができます。

こちらもそれぞれ想定する負荷がかけられています。

API間の連携
1つ目のAPI実行結果の値を2つ目のAPIのインプットにするための設定です。
JSON Extractor
JSON Extractorを利用することで、簡単にAPI間でデータを引き継げます。
APIの結果が以下のJsonであり、idを次のAPIに利用したいとします。
{
"id": 0,
"count": 0,
"name": "test"
}
JSON Extractorは1つ目のHTTP Requestに「Add > Post Processor > JSON Extractor」から追加します。設定は簡単で、「JSPN Path expressions」に「$」を起点としてプロパティを「.(ドット)」でつなげる形で指定します。
抽出した結果は「Names of created variables」に指定した変数に格納されるので、「${id}」のように2つ目のAPIのリクエストボディに指定すればOKです。

Insertが1つ目のAPI、deleteが2つ目のAPIになります。
まとめ
JMeterは高機能ですが、操作がやや独特で忘れやすい部分も多いです。
本記事が、次回の性能試験時の助けになれば幸いです。
コメント