16. ベストプラクティス

16.1 常に最新バージョンの JMeter を使用する

JMeter のパフォーマンスは常に改善されているため、ユーザーは最新バージョンを使用することを強くお勧めします。
常に変更リストを読んで、新しい改善点とコンポーネントを確認してください。最後のバージョンより 3 つ前のバージョンよりも古いバージョンを使用することは絶対に避けてください。

16.2 正しいスレッド数の使用

ハードウェアの機能とテスト計画の設計の両方が、JMeter で効果的に実行できるスレッドの数に影響を与えます。この数は、サーバーの速度にも依存します (サーバーが高速であるほど、応答が速く返されるため、JMeter の作業が難しくなります)。他の負荷テスト ツールと同様に、スレッドの数を正しくサイズ設定しないと、間違った結果や不正確な結果をもたらす可能性がある "調整された省略" の問題に直面します。大規模な負荷テストが必要な場合は、分散モードを使用して (または使用せずに) 複数のマシンで複数の CLI JMeter インスタンスを実行することを検討してください。分散モードを使用する場合、結果ファイルはコントローラー ノードで結合されます。複数の自律型インスタンスを使用する場合は、サンプルの結果ファイルを結合して後続の分析を行うことができます。特定のプラットフォームで JMeter がどのように動作するかをテストするには、JavaTest サンプラーを使用できます。ネットワーク アクセスを必要としないため、達成可能な最大スループットに関するアイデアを得ることができます。

JMeter には、スレッドがサンプリングを開始するまで、つまりスレッド グループの遅延とスレッド自体のランプアップ時間が経過するまで、スレッドの作成を遅らせるオプションがあります。これにより、同時にアクティブなスレッドが多すぎない限り、非常に多くのスレッドの総数が可能になります。

16.3 Cookie Manager を配置する場所

詳細については、Web テストのビルドを参照 してください。

16.4 Authorization Manager の配置場所

詳細については、「高度な Web テストの構築」を参照してください。

16.5 HTTP(S) テストスクリプトレコーダーの使用

レコーダの設定の詳細については、HTTP(S) テスト スクリプト レコーダを参照してください最も重要なことは、関心のないすべてのリクエストを除外することです。たとえば、画像リクエストを記録しても意味がありません (JMeter は、ページ上のすべての画像をダウンロードするように指示できます - HTTP リクエストを参照してください)。これらはテスト計画を混乱させるだけです。ほとんどの場合、.jsp.asp.php.htmlなど、すべてのファイルが共有する拡張子があります。これらは、「インクルード パターン」として「.*\.jsp 」と入力して「インクルード」する必要があります。

または、「 .*\.gif」を「除外パターン」として入力して、画像を除外することもできます。アプリケーションによっては、これがより良い方法である場合とそうでない場合があります。スタイルシート、javascript ファイル、およびその他の含まれるファイルを除外する必要がある場合もあります。設定をテストして、必要なものを記録していることを確認してから、消去して最初からやり直してください。

HTTP(S) テスト スクリプト レコーダーは、HTTP 要求を記録する記録コントローラーがその下にある ThreadGroup 要素を見つけることを想定しています。これにより、すべてのサンプルが 1 つのコントローラーの下に便利にパッケージ化され、テスト ケースを説明する名前を付けることができます。

次に、テスト ケースの手順を実行します。定義済みのテスト ケースがない場合は、JMeter を使用してアクションを記録し、テスト ケースを定義します。明確な一連の手順が完了したら、テスト ケース全体を適切な名前のファイルに保存します。次に、きれいに拭き取り、新しいテスト ケースを開始します。こうすることで、大量のテストケースの「ラフ案」を素早く記録することができます。

HTTP(S) Test Script Recorder の最も便利な機能の 1 つは、記録されたサンプルから特定の共通要素を抽出できることです。テスト計画レベルまたは ユーザー定義変数要素でいくつかのユーザー定義変数を定義することにより 記録したサンプルの値を JMeter に自動的に置き換えることができます。たとえば、サーバー " xxx.example.com " でアプリをテストしている場合、" xxx.example.com "の値を持つ" server "という変数を定義できます。サンプルは「 ${server} 」に置き換えられます。

マッチングでは大文字と小文字が区別されることに注意してください。

JMeter がサンプルを記録しない場合は、ブラウザが実際にプロキシを使用しているかどうかを確認してください。JMeter が実行されていなくてもブラウザが正常に動作する場合、ブラウザはプロキシを使用できません。一部のブラウザは、 localhostまたは127.0.0.1のプロキシ設定を無視します。代わりに、ローカルのホスト名または IP を使用してみてください。

エラー「unknown_ca」は、HTTPS を記録しようとしており、ブラウザが JMeter プロキシ サーバー証明書を受け入れていないことを意味している可能性があります。

16.6 ユーザー変数

一部のテスト計画では、ユーザー/スレッドごとに異なる値を使用する必要があります。たとえば、ユーザーごとに一意のログインが必要なシーケンスをテストする場合があります。これは、JMeter が提供する機能を使用して簡単に実現できます。

例えば:

  • コンマで区切られたユーザー名とパスワードを含むテキスト ファイルを作成します。これをテスト計画と同じディレクトリに配置します。
  • テスト計画に CSV DataSet 構成要素を追加します。変数にUSERおよびPASSという名前を付けます。
  • 適切なサンプラーで 、ログイン名を${USER}に、パスワードを${PASS}に置き換えます。

CSV データ セット要素は、スレッドごとに新しい行を読み取ります。

16.7 リソース要件の削減

リソース使用量を削減するためのいくつかの提案。

  • CLI モードを使用します: jmeter -n -t test.jmx -l test.jtl
  • できるだけ少ない Listener を使用します。上記のように-lフラグを使用すると、それらをすべて削除または無効にすることができます。
  • 負荷テスト中に「View Results Tree」または「View Results in Table」リスナーを使用しないでください。スクリプトをデバッグするスクリプト作成段階でのみ使用してください。
  • 類似したサンプラーを多数使用するのではなく、同じサンプラーをループで使用し、変数 (CSV データ セット) を使用してサンプルを変化させます。[インクルード コントローラーは、ファイル内のすべてのテスト要素をテスト計画に追加するため、ここでは役に立ちません。]
  • 機能モードを使用しない
  • XML ではなく CSV 出力を使用する
  • 必要なデータだけを保存
  • できるだけ少ないアサーションを使用する
  • 最もパフォーマンスの高いスクリプト言語を使用する (JSR223 セクションを参照)

テストに大量のデータが必要な場合、特にランダム化が必要な場合は、CSV データセットで読み取ることができるファイルにテスト データを作成します。これにより、実行時のリソースの浪費を回避できます。

16.8 BeanShell サーバー

BeanShell インタープリターには非常に便利な機能があります。telnet または http でアクセスできるサーバーとして機能できます。

セキュリティはありません。ポートに接続できる人は誰でも任意の BeanShell コマンドを発行できます。これらは、JMeter アプリケーションとホストへの無制限のアクセスを提供できます。 ファイアウォールなどによってポートがアクセスから保護されていない限り、サーバーを有効にしないでください。

サーバーを使用する場合は、jmeter.propertiesで次のように定義します。

beanshell.server.port=9000
beanshell.server.file=../extras/startup.bsh

上記の例では、サーバーが起動され、ポート9000および9001でリッスンします。ポート9000は、http アクセスに使用されます。ポート9001は telnet アクセスに使用されます。startup.bshファイルはサーバーによって処理され、さまざまな関数の定義や変数の設定に使用できます。スタートアップ ファイルは、JMeter およびシステム プロパティを設定および出力するためのメソッドを定義します。JMeter コンソールには次のように表示されます。

起動スクリプトの実行
起動スクリプトが完了しました
ポート: 9000 で開始された Httpd
セッションはポート: 9001 で開始されました

サーバーのテストに使用できる サンプル スクリプト ( extras/remote.bsh ) があります。[それがどのように機能するかを見てください。]
JMeter のbinディレクトリで起動すると (他の場所から実行している場合は、必要に応じてパスを調整します)、出力は次のようになります。

$ java -jar ../lib/bshclient.jar localhost 9000 ../extras/remote.bsh
localhost:9000 の BSH サーバーへの接続
サーバーからの応答を読み取っています…
BeanShell 2.0b5 - Pat Niemeyer 著 (pat@pat.net)
bsh % remote.bsh 開始
user.home = C:\Documents and Settings\User
user.dir = D:\eclipseworkspaces\main\JMeter_trunk\bin
プロパティ「EXAMPLE」を「0」に設定しています。
プロパティ 'EXAMPLE' を '1' に設定します。
プロパティ 'EXAMPLE' を '2' に設定します。
プロパティ 'EXAMPLE' を '3' に設定します。
プロパティ 'EXAMPLE' を '4' に設定します。
プロパティ 'EXAMPLE' を '5' に設定します。
プロパティ 'EXAMPLE' を '6' に設定します。
プロパティ 'EXAMPLE' を '7' に設定します。
プロパティ 'EXAMPLE' を '8' に設定します。
プロパティ 'EXAMPLE' を '9' に設定します。
例 = 9
remote.bsh 終了
bsh % … サーバーから切断されました。

実際の例として、CLI モードで長時間実行される JMeter テストがあり、テスト中のさまざまな時点でスループットを変化させたいとします。テスト計画には、 ${__P(throughput)}などのプロパティに関して定義される定数スループット タイマーが含まれています。次の BeanShell コマンドを使用して、テストを変更できます。

printprop("スループット");
curr = Integer.decode(args[0]); // 開始値
inc = Integer.decode(args[1]); // インクリメント
end = Integer.decode(args[2]); // 最終値
secs = Integer.decode(args[3]); // 変更の間待機
while(curr <= end) {
  setprop("スループット",curr.toString()); // ここは文字列である必要があります
  Thread.sleep(秒*1000);
  通貨 += 株式会社;
}
printprop("スループット");

スクリプトはファイル (たとえば、 throughput.bsh ) に保存し、 bshclient.jarを使用してサーバーに送信できます。例えば:

java -jar ../lib/bshclient.jar localhost 9000 スループット.bsh 70 5 100 60

16.9 BeanShell スクリプト

JMeter 3.1 以降では、BeanShell から JSR223 テスト要素 (詳細については、以下の JSR223 セクションを参照) に切り替え、 __Beanshell関数から__groovy関数に切り替えることをお勧めします。

16.9.1 概要

各 BeanShell テスト要素には、(スレッドごとに) 独自のインタープリターのコピーがあります。テスト要素がループ内などで繰り返し呼び出される場合、「各呼び出しの前に bsh.Interpreter をリセットする」オプションが選択されていない限り、インタープリターは呼び出し間で保持されます。

一部の長時間実行されるテストでは、インタープリターが大量のメモリを使用する場合があります。この場合は、リセット オプションを使用してみてください。

コマンドライン インタープリターを使用して、JMeter の外部で BeanShell スクリプトをテストできます。

$ java -cp bsh-xxx.jar[;必要に応じて他の jar] bsh.Interpreter file.bsh [パラメータ]
また
$ java -cp bsh-xxx.jar bsh.Interpreter
bsh% source("file.bsh");
bsh% exit(); // または EOF キーを使用 (例: ^Z または ^D)

16.9.2 変数の共有

変数は、起動 (初期化) スクリプトで定義できます。これらは、リセット オプションが使用されない限り、テスト要素の呼び出し間で保持されます。

スクリプトは、「 vars」変数 のget()およびput()メソッドを 使用して JMeter 変数にアクセスすることもできます。次に例を示します。

vars.get("ホスト");
vars.put("MSG","成功");
get()およびput()メソッド はString 値を持つ変数のみをサポートしますが、任意のオブジェクトに使用できるgetObject()およびputObject()メソッドもあります。JMeter 変数はスレッドに対してローカルですが、(Beanshell だけでなく) すべてのテスト要素で使用できます。

スレッド間で変数を共有する必要がある場合は、JMeter プロパティを使用できます。

org.apache.jmeter.util.JMeterUtils をインポートします。
文字列値 = JMeterUtils.getPropDefault("名前","");
JMeterUtils.setProperty("名前", "値");
サンプル.bshrcファイルには、getprop()およびsetprop()メソッドのサンプル定義が含まれています。

変数を共有する別の可能な方法は、「bsh.shared」共有名前空間を使用することです。例えば:

if (bsh.shared.myObj == void){
    // まだ定義されていないため、作成します。
    myObj = 新しい AnyObject();
}
bsh.shared.myObj.process();
テスト要素でオブジェクトを作成するのではなく、JMeter プロパティ「beanshell.init.file」で定義された起動ファイルで作成できます。これは一度だけ処理されます。

16.10 Groovy や Jexl3 などでスクリプト関数を開発する

スクリプトを関数として記述してテストするのは非常に困難です。ただし、JMeter には JSR223 サンプラーがあり、それをサポートする任意の言語で代わりに使用できます。Apache Groovyまたは JSR223 のCompilableインターフェイス をサポートする任意の言語を使用することをお勧めします。

JSR223 Sampler と Tree View Listener を含む単純なテスト計画を作成します。サンプラー スクリプト ペインでスクリプトをコーディングし、テストを実行してテストします。エラーがある場合は、ツリー ビューとjmeter.logファイルに表示されます。また、スクリプトを実行した結果が応答として表示されます。

スクリプトが正常に機能するようになったら、テスト計画に変数として保存できます。その後、スクリプト変数を使用して関数呼び出しを作成できます。たとえば、Groovy スクリプトが変数RANDOM_NAMEに格納されているとします。関数呼び出しは${__groovy(${RANDOM_NAME})}としてコーディングできます。変数の値が補間される前に関数呼び出しが解析されるため、スクリプトでコンマをエスケープする必要はありません。

16.11 テストのパラメータ化

多くの場合、同じテストを異なる設定で再実行できると便利です。たとえば、スレッドまたはループの数を変更したり、ホスト名を変更したりします。

これを行う 1 つの方法は、テスト計画で一連の変数を定義し、それらの変数をテスト要素で使用することです。たとえば、変数LOOPS=10を定義し、それをスレッド グループで${LOOPS}として参照できます。20 ループでテストを実行するには、テスト計画 のLOOPS変数の値を変更するだけです。

CLI モードで多くのテストを実行したい場合、これはすぐに面倒になります。これに対する 1 つの解決策は、 LOOPS=${__P(loops,10)}のように、プロパティに関してテスト計画変数を定義することです。これはプロパティ「loops 」の値を使用し、プロパティが見つからない場合はデフォルトで10になります。その後、JMeter コマンドラインで「loops」プロパティを定義できます。

jmeter … -Jloops=12 …
まとめて変更する必要があるプロパティが多数ある場合、これを実現する 1 つの方法は、一連のプロパティ ファイルを使用することです。-qコマンドライン オプション を使用して、適切なプロパティ ファイルを JMeter に渡すことができます。

16.12 JSR223要素

集中的な負荷テストの場合、推奨されるスクリプト言語は、ScriptingEngine がCompilableインターフェイスを実装する言語です。Groovy スクリプト エンジンはCompilableを実装します。ただし、JMeter 3.1 のリリース日現在、Beanshell も Javascript もそうしていないため、負荷テストを集中的に行う場合は避けることをお勧めします。

注: Beanshell はCompilableインターフェースを実装していますが、コード化されていません。メソッドは例外をスローするだけです。JMeter には、このバグに対する明示的な回避策があります。
JSR 223 要素を使用する場合は、[利用可能な場合はコンパイル済みスクリプトをキャッシュする]プロパティをオンにして、基になる言語がサポートしている場合にスクリプトのコンパイルがキャッシュされるよう にすることをお勧めします。この場合、キャッシュは ${varName} の最初の値のみを取得するため、スクリプトが${varName}を使用する変数を使用しないようにしてください。代わりに次を使用します。
vars.get("変数名")

それらをパラメーターとしてスクリプトに渡し、この方法で使用することもできます。

16.13 スレッドとスレッドグループ間で変数を共有する

変数はスレッドに対してローカルです。あるスレッドで設定された変数を別のスレッドで読み取ることはできません。これは仕様によるものです。テストの開始前に決定できる変数については、テストの パラメーター化(上記) を参照してください。テストが開始されるまで値がわからない場合は、さまざまなオプションがあります。

  • 変数をプロパティとして保存 - プロパティは JMeter インスタンスに対してグローバルです
  • 変数をファイルに書き込み、再度読み取ります。
  • bsh.shared名前空間を使用します -上記を参照してください
  • 独自の Java クラスを作成する

16.14 プロパティの管理

jmeter プロパティを変更する必要がある場合は、jmeter.propertiesファイルを 変更しないでください。代わりに、jmeter.propertiesからプロパティをコピーし、 user.propertiesファイルの値を変更してください。
そうすることで、JMeter の次のバージョンへの移行が容易になります。
ドキュメントではjmeter.propertiesが頻繁に言及されていますが、これは「変更するプロパティをjmeter.propertiesからuser.propertiesにコピーし、後者のファイルで行う」と理解する必要があります。

user.propertiesファイルは、jmeter.propertiesで定義されたプロパティに取って代わります

16.15 非推奨の要素

非推奨の要素 (変更リストおよびコンポーネント リファレンスでそのようにマークされている) を使用しないこと、および可能であれば新しい推奨要素に移行するか、同じことを行う新しい方法に移行することをお勧めします。
非推奨の要素はバージョン N のメニューから削除されていますが、 user.propertiesファイルのnot_in_menuプロパティを変更し、そこから要素の完全なクラス名を削除することで、移行を有効にすることができます。

バージョン N で廃止された要素は、バージョン N+1 で確実に削除されることに注意してください。そのため、できるだけ早く使用を中止してください。
Go to top