2つのスレッドグループを使用したJMeterテストがあります。1つ目は単一のスレッド(インベントリを作成)、2つ目は複数のスレッド(すべてのインベントリを購入)です。 BeanShellアサーションとXPathエクストラクターを使用して、返された値(XML)を解析し、変数(購入するアイテムのIDなど)を保存します。
ただし、標準の_${jmeter}
_型変数または${__BeanShell(vars.get("jmeter"))}
型変数に抽出された最初のスレッドグループで作成された値は、2番目のスレッドグループでは使用できません。とにかく、最初のスレッドグループに変数を作成し、2番目のスレッドグループにそれを表示する方法はありますか?
変数を使用してこれを行うことはできませんでした(変数は個々のスレッドに対してローカルであるため)。ただし、プロパティを使用してこの問題を解決できました。
繰り返しますが、最初のThreadGroupがすべての設定を行い、2番目のThreadGroupの各スレッドで利用できるようにするために、その作業からの情報が必要です。最初のThreadGroupに次のBeanShellアサーションがあります。
${__setProperty(storeid, ${storeid})};
$ {storeid}はXPath Extractorで抽出されました。 BeanShellアサーションは、storeidが前の呼び出しから返されたことを確認するなど、他の処理を行います。
とにかく、2番目のThreadGroupでは、サンプラーの「storeid」プロパティの値を次のように使用できます。
${__property(storeid)}
チャームのように機能します!
JMeterのドキュメントによると:
16.12スレッドとスレッドグループ間で変数を共有する
変数はスレッドに対してローカルであり、あるスレッドで設定された変数を別のスレッドで読み取ることはできません。これは仕様です。テストを開始する前に決定できる変数については、テストのパラメーター化(上記)を参照してください。テストが開始されるまで値がわからない場合、さまざまなオプションがあります。
- 変数をプロパティとして保存します-プロパティはJMeterインスタンスに対してグローバルです
- ファイルに変数を書き込み、それらを再読み取りします。
- Bsh.shared名前空間を使用します- 16.8.2変数の共有 を参照してください
- 独自のJavaクラスを書く
スレッド間で変数を渡す別の方法は、jmeter-pluginsを Andrey Botalovが後述 として使用することです。
しかし、最初に使用するのは少し混乱することがわかりましたが、スレッドからスレッドに渡すときに変数を完全に制御できます。 BeanShellを使用した私の例に従うと、それがいかに簡単かがわかります。
次に、以下の図のセクションを参照します。
(1.1)ここで、ユーザー定義変数にカスタム変数を作成しました(または、BSFプロセッサでこの変数を作成できます-この例では無効になっています(1.2))
(2.1)(2.4)最初のスレッドで変数を正常に使用しました-特別なものはありません:)
(2.2)BeanShell PostProcessorを追加し、変数をカスタマイズしました
(2.3)キューに追加
(3.1)2番目のスレッド-変数はキューから取得されます-任意の名前で。ただし、このスレッドは変更された変数を取得できるように前の終了まで待機するので、賢明にタイムアウトを使用してください(長い応答を伴う実験)
(3.2)(3.3)(3,4)変数の使用と変更の繰り返し手順
(3.5)変数は新しいキューでもう一度送信されるため、変数に新しい名前を付けます
(4.1)(4.2)(4.3)新しいキューから変更された変数を取得してチャームのように動作する
警告
さらにスレッドを追加する場合は、変数を使用してスレッドグループにカウンターを追加し、この変数名をキュー名に追加します-キューをキャッチしようとするスレッドグループで同じことを行い、キューが各スレッドに一意の名前を持つようにします(より明確な説明が必要です)
1つのスレッドグループに複数のhttpリクエストがある場合は、最後の子としてスレッド通信プリプロセッサを追加します(カスタムの何かを達成したい場合は他のもの)httpリクエスト
最適な結果を得るための再生、変更、カスタマイズ:)スレッドを追加すると、望ましくない動作が発生する可能性があるため、注意する必要があります。
これを実現する最も簡単な方法だと思います。
つかいます
Bean Shell PostProcessor
変数を設定する( http://jmeter.Apache.org/usermanual/best-practices.html#bsh_variables )
import org.Apache.jmeter.util.JMeterUtils;
JMeterUtils.setProperty("PC_CREATED_PROMO_CODE", "value");
または、変数から読み取る場合
import org.Apache.jmeter.util.JMeterUtils;
JMeterUtils.setProperty("PC_CREATED_PROMO_CODE", vars.get("Extracted_PC_CREATED_PROMO_CODE"));
そして、他のスレッドグループから、( http://jmeter.Apache.org/usermanual/functions.html#__property )でそれを読んでください
${__property(PC_CREATED_PROMO_CODE)}
JMeterプラグインには、この目的のために スレッド間通信 があります。
使用するには2つの方法があります。
__fifoPut
および__fifoPop
私の意見では、PostProcessor/PreProcessorの方が使いやすいです。
これは通常のクライアントの動作(スレッド間でパラメーターを共有)ではないため、JMeterでは不可能です。これの代わりに、コントローラを持つ1つのスレッドグループを使用します。
Thread Group
+ Create inventory
+ + XPath
+ Loop
+ + Purchase inventory
さて、これはそれを行う1つの方法です。これらの手順に従ってください。機能しますが、後で必要に応じて調整できます。変数はスレッド間で共有されません(JMeterはこれをおそらく機能と呼びます:))。しかし、プロパティは!そのため、変数をプロパティとして次のように設定します。
1)テストプランをクリックし、「スレッドグループを連続して実行する」を有効にします->これにより、スレッドグループがランダムではなく順序どおりに実行されます。 (後で調整できますが、今のところは動作させるために..)
2)たとえば、「setup」というスレッドグループを作成します。そのスレッドグループに、次のコードでBeanShellサンプラーを追加します。
import org.Apache.jmeter.util.JMeterUtils;
JMeterUtils.setProperty("theNameOfYourNewProperty", "theValueOfYourPropery");
これでプロパティが設定されました!プロパティとして保存する値が既に変数(たとえば、ユーザー定義変数またはreqex変数)である場合は、次の操作を実行できます。
JMeterUtils.setProperty("theNameOfYourNewProperty", vars.get("theNameOfYourVariable"));
3)たとえば、1を超えるスレッド数を持つテストグループ「実際のテスト」を追加します。テストを追加し、そのテストに次のコードでBeanShellプリプロセッサを追加します。
import org.Apache.jmeter.util.JMeterUtils;
vars.put("theNameOfYourNewProperty", JMeterUtils.getProperty("theNameOfYourNewProperty"));
これで、システムプロパティtheNameOfYourNewPropertyの値を持つtheNameOfYourNewPropertyと呼ばれるスレッドに変数を作成しました。テストでは、次のようにアクセスできます。
${theNameOfYourNewProperty}
そして、最初のスレッドだけでなく、各スレッドでも機能します。
トピックに第二の人生を与えましょう:)スレッド間で変数を転送するもう1つの方法は、ファイルへの書き込み/読み取りです。 スレッド間で変数を渡す
別の解決策は、Simple Table Serverを使用してデータセットを管理することです。この機能は1.2 JMeterプラグインを追加しました。
「主なアイデアは、JMeterプラグインの小さなhttpサーバーを使用して、get/addへの簡単なコマンドでデータセットファイルを管理することです。ファイル内のデータの行」
ドキュメントを見てください: http://jmeter-plugins.org/wiki/HttpSimpleTableServer/
よろしく。
Beanシェルアサーションを追加するだけで、プロパティ関数を使用して、値を変数(グローバル変数など)に割り当てます。変数は、他のスレッドに移動した後でも値を保持します。
スレッドグループ>>追加>>アサーション>> Bean Shellアサーション
${__setProperty(Global_variable_Name,${Variable_name_whose_Value_to_be_Passed})}
そして、他のスレッドでこのグローバル変数を呼び出して使用できます
以下は、保存された値を呼び出すために使用する必要がある関数です。
${__property(global_variable_name)}
https://medium.com/@priyank.it/jmeter-passing-variables-between-threads-a4dc09903b59