-
Notifications
You must be signed in to change notification settings - Fork 0
MS_JMeterRegex
- 戻る(Jmeterによる可変値の追跡)
- Jmeterの正規表現
- Apache JMeter / Jmeter用語
JMeter では、フィルタや抽出などで正規表現を
使用することが多い。
Perl5 互換の正規表現を使用できる模様
(なお、.NET Framework の正規表現も Perl5 互換)。
補足(実装の系譜): JMeter が使っているのは
Apache ORO(Perl5 互換の Java 実装)である。
Java 標準のjava.util.regexとも .NET のSystem.Text.RegularExpressionsとも
別の実装であり、細部の挙動が異なることがある。このため、
- 他の言語で書いた正規表現をそのまま持ち込まない
- JMeter 上で実際に動かして確認する
のが安全である。
なお、JSR223 サンプラー等で Java の正規表現を使う場合は
java.util.regexになるため、こちらとは別物になる。
-
.*は、任意の 0 文字以上の文字列を表すメタ文字列。 - 必要に応じて
\でエスケープする。
ホスト名は local\.com:80/.* などと指定する。
拡張子は .*\.html などと指定する。
補足(フィルタの用途): これは主に
HTTP(S) テスト スクリプト レコーダー(プロキシ記録)の
「含めるパターン」「除外するパターン」で使う。記録時は画像・CSS・JS などへのリクエストも大量に混ざるため、
- 除外:
.*\.(png|gif|jpg|css|js|ico|woff2?)- 含める: 対象アプリのホストのみ
と絞らないと、シナリオが読めなくなる。
なお、静的ファイルを完全に除外してよいかは目的次第で、
実ユーザに近い負荷を再現したいなら 「HTTP リクエスト」の
「埋め込みリソースを取得する」を使って別途表現する。
-
抽出系の後処理(Jmeter用語)中の
「正規表現抽出」を使用して抽出を行う。 -
以下は、「正規表現抽出」固有の設定項目
(共通的な設定項目はJmeterによる可変値の追跡) -
テンプレート / 一致番号への指定が解り難いが、既定値は以下で OK。
- テンプレート :
$1$ - 一致番号 :
1
- テンプレート :
移行メモ(誤字): 元ページの「共通敵な設定項目」は
「共通的な設定項目」の誤記。
-
(.+?)は、任意の 1 文字以上の文字列を抽出するメタ文字列。 -
\s+?は、1 文字以上のスペースやタブなどの空白文字の最短マッチのメタ文字列。 -
必要に応じて
\でエスケープする。 -
例
- 空白を含まない。
- HTML
- 空白を含まない。
<input type="text" name="xxxx" value="yyyy">- 正規表現
name="xxxx" value="(.+?)"
- Inner テキストなど、空白を含む場合。
- HTML
<XXXX name="xxxx">
<YYYY>yyyy</YYYY>
</XXXX>- 正規表現
<XXXX name="xxxx">\s+?<YYYY>(.+?)</YYYY>
補足(
?を付ける理由):+や*は既定で**最長一致(greedy)であり、
可能な限り長くマッチしようとする。
+?/*?と?を付けると最短一致(lazy)**になる。<td>A</td><td>B</td> <td>(.+)</td> → "A</td><td>B" にマッチ(長すぎる) <td>(.+?)</td> → "A" にマッチ(意図どおり)HTML から値を 1 つだけ取り出す用途では、
原則として最短一致を使う。
補足(ViewState を抽出する例): ASP.NET ViewStateは
Base64 で長大な文字列になるため、実務では以下のような指定になる。id="__VIEWSTATE" value="(.*?)"抽出した値は HTTP リクエストのパラメータに
${参照名}として埋める。
なお、+や/や=を含むため、
URL エンコードの有無(パラメータの「値をエンコードする」チェック)で
動かなくなることがある点に注意。
マッチする文字列グループが複数ある場合、
- 参照名(Jmeterによる可変値の追跡)で、
抽出する部分を$n$で指定する。 - n 部分を数値で指定する。先頭が 1 となる。
-
$0$は、式全体が一致するものを表す。
補足: テンプレートは複数のグループを連結することもできる。
正規表現: name="(.+?)" value="(.+?)" テンプレート: $1$=$2$ → 「xxxx=yyyy」が変数に入る
-
マッチする文字列グループが 1 つになる場合、省略可能。
-
マッチする文字列グループが複数になる場合、以下のように記入する。
-
1指定
正数指定、n 番目のマッチを選択。-
参照名
テンプレートの値 -
参照名
_g
マッチした文字列グループ数 -
参照名
_gn
マッチした文字列グループ値(n = 0,1,2)
-
-
0指定
ランダムに一致を選択する。 -
-1指定
負数指定、ForEach コントローラと一緒に使用。-
参照名
常にデフォルト値に設定 -
参照名
_matchNr
見つかった一致の数。 -
参照名
_n
テンプレートによって生成された文字列(n = 1,2,3) -
参照名
_n_gm
m = 0,1,2 - 一致するグループ n -
参照名
_gn
設定されていません
-
-
補足(3つのモードの使い分け):
一致番号 挙動 用途 正数(1, 2 …) n 番目のマッチを取る 通常。ViewState など 1 つに決まるもの 0 マッチの中からランダムに 1 つ 一覧から任意の 1 件を選ぶ(商品 ID など)。負荷を散らせる -1 全マッチを配列的に取得 ForEach コントローラで全件を順に処理する
0指定は、負荷テストで
全ユーザが同じレコードにアクセスしてキャッシュに乗ってしまうのを
避けたい場合に有効である。
デバッグを容易にするため、not-provided などの文字列を入力しておくと良い。
補足: これは重要な実践である。
初期値を空のままにすると、抽出に失敗しても
後続のリクエストがそれらしく流れてしまい、失敗に気付けない。
明示的な文字列を入れておけば、
リクエスト内容やアサーションから即座に検知できる
(Jmeterによる可変値の追跡の補足も参照)。
-
Apache JMeter - User's Manual: Component Reference
Post-Processors > Regular Expression Extractor
https://jmeter.apache.org/usermanual/component_reference.html#Regular_Expression_Extractor -
JMeter 簡易リファレンス > 後処理 > 正規表現抽出
http://sy5.sakura.ne.jp/jmeter/ref/postprocessors/regularexpressionextractor.html -
JMeter の正規表現の個人的な謎 - ソフト開発お仕事メモ
http://d.hatena.ne.jp/sekom/20110212/p1 -
レスポンスを次のリクエストに活用できる「正規表現抽出」 - JMeterAtoZ
http://naoberry.com/jmeter/regex/
Tags: 移行, テスト, ツール類
このWikiは「Open棟梁Project」,「OSSコンソーシアム 開発基盤部会」によって運営されています。