JMeter

JMeterのIfコントローラを使って正規表現で条件分岐する。

はじめに

シナリオを用いた負荷テストツールであるJMeterを使って条件分岐でシナリオを進める手順を紹介したいと思います。
具体的にはJMeterが最初にアクセスしたページで取得した値によって、
次にアクセスするページを値ごとに分岐するシナリオになるように設定していきます。

検証環境

AWSのEC2インスタンスにApacheでwebサーバを建てて、手元のwindowsからJmeterを実行しました。

ファイル構成

www
├── cgi-bin
└── html
    ├── de.html
    ├── index.php
    └── net.html

index.php

アクセスする度にランダムで600~680の値が表示されるようになっています。

<html>
<?php
    print(mt_rand(600, 680). "円の黒毛和牛上塩タン焼き".'<br>');
?>
</html>

使用するJmeterシナリオの紹介

最初にindex.phpにアクセスし後述の料金を正規表現で取得したあと、
その値をIfコントローラの条件式で判断してTrueの場合のみそれの子オブジェクトの処理を実行します。

Jmeterのシナリオ

シナリオの作成は以下の記事参考にしました。
シナリオ作成入門 | pTune.jp

正規表現で値を抽出する

10_index.phpにアクセスを右クリックから追加後処理正規表現抽出で正規表現の処理を追加します。
今回は塩タン焼きの値段が欲しいのでそこだけ抽出します。正規表現の欄に以下を入力します。

(.*)円の黒毛和牛上塩タン焼き

その他項目の参照名、テンプレート、一致番号はそれぞれprice、$1$、1としておきます。

Ifコントローラで条件分岐

次にIfコントローラで値段が679円以下の場合と680円ぴったしの場合の処理を作成します。
上記で紹介したシナリオの通りにIfコントローラを配置し条件分岐を設定していきます。

679円以下の場合

${__jexl3(toInteger("${price}")<=679)}

680円以下の場合

${__jexl3(toInteger("${price}")==680)}

Interpret Condition as Variable Expression?のチェックボックスを入力した状態にしておきます。
外した場合、JavaではなくJavaScriptで条件式処理されるためパフォーマンス低下に繋がるらしいです。(今回の場合なんの差も生まれないと思いますが。。)
実際に公式ドキュメントでは外さずにjexl3関数という、Javaで記述されたアプリケーション等での動的およびスクリプト機能の実装を容易にすることを目的としたライブラリを使うことが推奨されています。
http://jmeter.apache.org/usermanual/component_reference.html

これで一旦シナリオは完成です。

出力をみてみる

作成したシナリオをループ処理させたものをツリーで出力しました。
黒毛和牛上塩タン焼きが680円だった場合のみnet.htmlに遷移しているのがわかります。
余談ですが、netと網をかけているわけではありません。

JMeter実行後のスクリーンショット

おわりに

JMeterを使って正規表現を用いて条件分岐で処理を変えてみました。
正規表現抽出やIfコントローラを使うことは頻繁にあると思うのですが、jexlのあたりについて忘れそうだったので記事にしました。
どなたかの参考になれば幸いです。

返信を残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

CAPTCHA