Dmitri Tikhanski is a Contributing Writer to the BlazeMeter blog.

Learn JMeter in 5 Hours

Start Learning
Slack

Run massively scalable performance tests on web, mobile, and APIs

Jul 12 2016
En

JMeter での While コントローラの使用

JMeter の While コントローラについて

 

複雑なロジックを前提にした高度な JMeter 負荷テスト シナリオを作成するときは、一定の条件によりますが、サンプラの実行順序を変更することが必要になる場合があります。通常、JMeter はすべてのサンプラを上から下に実行しますが、デフォルトの動作が適さないシナリオも存在します。

 

この記事では、JMeter による while ループの実装である While コントローラについて説明します。while ループの概念になじみがない読者に向けて簡単に言うと、while ループは「if->then」ステートメントの繰り返しです。

 

  • If で指定した条件が true の場合、直前のアクションを繰り返します

 

JMeter では基本的に、あらかじめ設定した「条件」が「true」になるまで、コントローラが子サンプラを実行します。「条件」は次のいずれかにすることができます。

 

  1. - この場合、While コントローラはループ内の最後のサンプラが失敗したときに終了します。

  2. LAST - と同じですが、ループの結果が決まるに、最後のサンプラに対する追加チェックを行います。先行するサンプラが成功しなかった場合、While コントローラとその子は実行されません。

  3. JMeter 関数または変数 - 変数または関数の評価結果が「true」になるまで、While コントローラの子が実行されます。

  4. JMeter プロパティ - 関数または変数と同じですが、代わりにプロパティが想定されます。

 

関数または変数とプロパティの両方の方法で、ループ内のどこかまたはループの外側で「条件」が「false」に設定されると想定します。プロパティの場合、その設定は別のスレッド グループから行うか、JMeter の外部から(たとえばBeanshell Server を通じて)行うことができます。

 

最初の 2 つ(「空」と「LAST」)は、わかりやすいケースです。「条件」を空にするか LAST に設定した場合、While コントローラの最後のサンプラが成功しなかったときは、ループは中断します。変数とプロパティの場合も同じです。[Condition]に指定した変数またはプロパティの結果が「true」になるまで、While コントローラが子をループ処理します。

 

While コントローラでの関数の使用

 

 

次に示す While コントローラの GUI のかっこ内に示されているとおり、条件は[function or variable]とする必要があります。

 

JMeter の While コントローラ

 

「条件」を JavaScript として自動的に解釈する If コントローラとは異なり、While コントローラには「true」または「false」の条件を指定する必要があります。したがって、次のようになります。

 

  • "${myVar}" != "some value" - 無効です。これは関数でも単一の変数でもありません。

  • ${__javaScript("${myVar}" != "some value",)} - 有効です。この式は「true」または「false」に解決されます。

 

また、絶対的に多くのケースで JMeter 変数は文字列として格納されるため、変数の値を何かと比較するために __javaScript() または類似した関数を使用する場合は、双方が同じ型であることを確認してください。たとえば、JavaScript では変数と予想される値の両方を引用符で囲むだけで、文字列として解釈されます。

 

以上、While コントローラの使用方法について説明しました。次に使用事例をいくつか見てみましょう。

 

考えられる使用事例

 

 

応答に指定した行が見つかるまでループ処理する

 

たとえば、最終的な一貫性を原則として構築されたシステムや、応答が即時でない複数コンポーネント システムをテストする場合、続行するために何かが使用可能になるまで待つことが必要になることがあります。このようなシナリオでは、While コントローラの使用が最も適しています。続行するかどうかを、あるテキストが応答に含まれているかどうかによって決定する必要がある場合は、次のようにすることができます。

 

  1. テスト プランに While コントローラを追加します。

  2. HTTP リクエスト サンプラまたはその他のサンプラ(別のプロトコルを使用している場合)を While コントローラに追加します。

  3. 応答の一部分または全体を JMeter 変数に保存します。これは Regular Expression Extractor を使用して行うことができます。

  4. While コントローラで次の条件を使用します。

 

${__javaScript("${response}".indexOf("string") == -1,)}

 

説明:

 

  • ${response} - 応答の一部分または全体を格納する JMeter 変数

  • string - 検索する文字のシーケンス

 

${response} 内に string が見つかると、ループは終了し、テストは続行(または終了)します。

 

${response} 内に string が見つからない場合、リクエストは永遠に繰り返されます。

 

このアプローチでは、Regular Expression Extractor と __javaScript() 関数の組み合わせを想定し、String.indexOf() で JavaScript メソッドを使用して、検索条件が応答に含まれているかどうかを確認します。

 

JMeter の While コントローラ

 

応答に指定した行が見つかるまでループ処理する(ただし X 回まで)

 

この使用事例は前述の事例と似ていますが、探しているテキストがいつまでたっても出現しない場合のエンドレス ループを避けるため、ある「対策」が取られています。

 

5 回トライしても string が応答に見つからない場合は、ループを終了するとしましょう。実装に必要な手順は次のとおりです。

 

  1. While コントローラにカウンタ テスト要素を追加します。

  2. カウンタを次のように設定します。

    • 1 から開始

    • 1 ずつインクリメント

    • カウンタ参照名を指定

  3. 次のように、カウンタの値も考慮するように While コントローラの条件を変更します。

 

${__javaScript(("${response}".indexOf("string") == -1 && ${counter} < 5),)}

 

JMeter の While コントローラ

 

ご覧のように、while ループは 5 回の試行後に停止し、永遠に実行を続けることはありません。

 

CSV からすべての値を読み込み、続行する

 

このシナリオでは、[CSV Data Set Config]を使用してパラメータ化を行うことを想定しています。ほとんどの場合、ファイルの末尾に達したときに JMeter スレッドを再利用または停止するために使用されます。CSV ファイルからすべての値を読み込み、後でテストを続行する方法は次のとおりです。

 

CSV ファイルに含まれている行が 5 行だけだとします。

 

行 1
行 2
行 3
行 4
行 5

 

次の CSV データ セット設定を使用します。

 

JMeter の While コントローラ

 

While コントローラで条件を空にした場合、どうなるかを見てみましょう。

 

JMeter の While コントローラ

 

このように、テストは際限なく続行され、以降の呼び出しごとに 値が返されます。EOF は End Of File (ファイルの終わり)の略ですが、必要に応じて csvdataset.eofstring プロパティで任意の文字列に変更できます。

 

この "" を While コントローラの条件で次のように使用できます。

 

    ${__javaScript("${myVar}" != "",)}

 

結果は次のようになります。

 

JMeter While コントローラ

 

もう少しで終わります。この ビットはまったく必要ないと思われるかもしれません。これがそこにある理由は、CSV データはループ内で While コントローラの条件が評価される前に読み込まれるので、While コントローラが常に 1 ステップ後になるためです。次のように、If コントローラを使用してこれを削除できます。

 

 

  1. If コントローラを CSV Data Set Config に追加します。

  2. ${myVar} 変数を使用するすべてのサンプラを If コントローラに追加します。

  3. If コントローラの条件として "${myVar}" != "" を使用します。

 

結果はどうなったでしょうか。

 

JMeter While コントローラ

 

意図したとおりになったようです。

 

If コントローラを使用するとした場合、While コントローラの条件を空にすることもできるのが面白いところです。

 

以上、While コントローラについて説明しました。不明な点がある場合や、これら以外のシナリオについて情報が必要な場合は、以下のコメント フォームからお知らせください。

 

一対一のデモセッションを予約いただくと、BlazeMeter の機能について説明を受けることができます。

詳細を知るには

 

経験豊富な JMeter ユーザは、オンデマンドの Web キャスト「How to Create Advanced Load Testing Scenarios with JMeter (JMeter による高度な負荷テスト シナリオの作成方法)」をご覧ください。

 

JMeter を使ったことがなく、詳細を知りたい場合は、無料のオンライン JMeter トレーニング コースにサインアップしてください。

Interested in writing for our Blog?Send us a pitch!

Your email is required to complete the test. If you proceed, your test will be aborted.