はじめに
JMeterでBeanShellを使う機会があったため、覚書きをここに記します。
文法
- JDK1.4がベース
- java標準で用意されているクラスを使用する場合はJDK1.4範囲内でのメソッドしか使えない
- Java標準以外のクラスは、lib配下のjar中のクラス、および、lib/ext配下のjar中のクラスは通常通り使える
文法がJDK1.4ベースなのでかなり制約があります。
ジェネリクスが使えなかったり、プリミティブ型とラッパー型間での型変換を明示的にやらないとならなかったりする部分は特に不便です。
java標準クラスはJDK1.4範囲内でしか使えないため、例えば、数値をhex文字列に変換したい場合、通常なら
String hexStr = String.format("%02x", intvalue);
とすべきところ、String.format がJDK1.5以降の機能のため使えないため、Integer.toHexStringメソッド、および、lib配下に格納されているcommons-lang3-x.x.x.jarのStringUtils.leftPadメソッドを使い、以下のようにする必要がありました。
String hex = Integer.toHexString(intvalue);
String hexStr = StringUtils.leftPad(hex, 2, "0");
そのため、複雑な処理を行いたい場合は、javaでクラスを作成し処理を記述してコンパイル後jar化して、lib/ext配下にjarファイルを格納。そして、シェルからはjavaで書いたクラス、メソッドを呼び出す形にした方が楽かもしれません。
なお、javaでクラスを作成してコンパイル&jar化する分においてはJDKのバージョンやコンパイルレベルは実行環境のjavaで動けば問題ありません。(つまり、JDK1.4以前の文法制約を受けない)
JMeterで使用できる変数
こちらで紹介記事がありましたので、説明はこちらに譲ります。
HTTPリクエストパラメータをBeanShellから取得する方法
BeanShellでリクエストパラメータを取得する例があまりないようなのでサンプルとしてあげたいと思います。
import org.apache.jmeter.config.Argument;
import org.apache.jmeter.config.Arguments;
Arguments arguments = ctx.getCurrentSampler().getArguments();
for (int i=0; i<arguments.getArgumentCount(); i++) {
Argument argument = arguments.getArgument(i);
log.info("パラメータ名:"+arguments.getName());
log.info("パラメータ値:"+arguments.getValue());
// リクエストパラメータの値を変数に設定
vars.put(arguments.getName(),arguments.getValue());
}
参考記事