最近Apache JMeterのBSF Processorを使った負荷テスト計画の作成を行ったのでメモ。
負荷テストで広く使われているApache JMeterですが、BSF(Pre|Post)Processorという機能があります。 JMeterの標準機能では処理できない場合にJavaScriptやRuby、Pythonなどを使った処理を使うことが出来るもの。
今回はWebAPIにGETでリクエストを投げ、返ってきたJSONレスポンスをパースした後、その値を元に再度リクエストを投げるという処理を実装。 大まかな流れとしては
- CSVファイルを読み込み、各種パラメータを決定
- WebAPIにGETでリクエストを投げる
- JSONレスポンス内の結果件数を示す値が0になるまで次のリクエストを投げる
- 結果件数が0になった段階で全体の処理を終了
となります。
以下詳細。 スレッドグループの詳細は以下の画像のようになっています。
パラメータ設定
Whileコントローラ内で送信される次のリクエストまでの間隔を設定。 JMeterのスレッドグループの「スレッドプロパティ」で設定した値はここには影響せず、インターバル0で次のリクエストを送信してしまう為このようにしました。
CSV読み込み処理
5列のデータが存在するCSVの想定。JMeterの.jmxファイルを設置したディレクトリと同階層にあるparams.csvを読み込み。
Whileコントローラ
Whileコントローラに処理継続条件を記述します。
今回はBSF PostProcessorでJavaScriptを使用しているので、以下のように処理継続条件を記述しました。
${__javaScript(${isContinue}==1)}
HTTPリクエストの生成
JSONレスポンスのパース
JSONレスポンスから結果件数を抽出します。 BSF PostProcessor使ってJSONをパースしてもいいんですが(負荷テストことはじめ 41ページ目参照)、今回はお手軽に正規表現抽出モジュールを使用。
BSF PostProcessorを使用した処理
ここからBSF PostProcessorを使用した処理を進めます。 今回はJavaScriptを使用していますが、Languageのプルダウンには以下ようなリストが。
- javascript
- jexl
- jpython
- jscript
- judoscript
- jython
- lotusscript
- netrexx
- objectscript
- perl
- perlscript
- pnuts
- prolog
- rexx
- ruby
- vbscript
- xslt
JMeterで設定された変数は以下のような記述で参照・代入が可能。
//参照
var hoge = vars.get('変数名');
//代入
vars.put(変数名, 値);
スリープ
次のHTTPリクエストまでの間隔を指定。パラメータ設定で代入した値が使用されます。 BSF PreProcessorで事前に処理してやればスリープ時間をランダムにすることも可能ですね。
実際に使用したテスト計画より単純化していますが、上のような流れでBSF PostProcessorを使用したループ処理を行うことができます。 実案件ではJSONレスポンスから他のパラメータも読み込んでよりダイナミックに次のHTTPリクエストを作成しました。 Ruby、Python辺りを使ってやれば各言語のライブラリを使用したより複雑な処理も書けると思われ。 おしまい。