-
Notifications
You must be signed in to change notification settings - Fork 0
MS_JMeterVariableTracking
- 戻る(Apache JMeter)
- Jmeterによる可変値の追跡
- Jmeter用語 / Jmeterの正規表現
-
抽出系の後処理(Jmeter用語)を追加して
レスポンスから値を抽出する。 -
基本的に、サンプラー(HTTP リクエスト)(Jmeter用語)に
追加する。
(変数のスコープがあるかと思ったが、どうも無いっぽいので、
直前のサンプラー(HTTP リクエスト)に都度追加)
補足(なぜ「可変値の追跡」が要るのか): 負荷テストのシナリオは
記録したリクエストをそのまま再生するだけでは動かない。
サーバが毎回変える値を、レスポンスから取り出して
次のリクエストに埋め直す必要があるためである。ASP.NET Web Forms では特にこれが顕著で、以下が該当する。
値 用途 __VIEWSTATEページの状態(ASP.NET ViewState) __VIEWSTATEGENERATORViewState の識別子 __EVENTVALIDATIONポストバックの検証 __RequestVerificationTokenCSRF 対策トークン(CSRF(XSRF)対策の実装方針) セッション ID / ワンタイム トークン 認証・重複送信防止 これらを固定値のまま流すと、
全リクエストがエラーになり負荷がかからない(そして気付きにくい)。
補足(変数のスコープ): 「スコープが無いっぽい」という観察は
概ね正しく、JMeter の変数(${...})は
スレッド(仮想ユーザ)ごとに独立し、スレッド内では全体で共有される。
種類 スコープ 変数( ${var}/vars)スレッドごと。スレッド内ではどのサンプラーからも見える プロパティ( ${__P(name)})JVM 全体。全スレッドで共有される したがって、抽出した値は
同一スレッド内であれば後続のどのサンプラーからでも参照できる。
「都度追加」しなくても、必要な箇所で 1 回抽出すれば足りる。
ただし、後処理は親のサンプラーに対して適用されるため、
「どのレスポンスから取るか」は配置で決まる点に注意。
-
負荷テストでは、基本的に、性能を重視するため、正規表現を適用。
-
クライアント側の性能を重視しなくて済む場合、
- XPath が使いやすい。
- ただし、XML Valid でないページには、正規表現を適用。
補足: XPath 抽出はレスポンス全体を DOM としてパースするため、
正規表現に比べて CPU とメモリを大きく消費する。
「負荷をかける側が先に音を上げる」ことを避けるため、
負荷テストでは正規表現を選ぶ、という判断である。なお、JMeter 3.0 以降は XPath2 Extractor(Saxon ベース)が追加され、
旧 XPath Extractor より高速かつ XPath 2.0 に対応している。
Regular Expression Extractor(正規表現抽出)
抽出のための正規表現(Jmeterの正規表現)を指定する。
XPath Extractor
- XPath の例
https://learn.microsoft.com/ja-jp/previous-versions/dotnet/netframework-4.0/ms256086(v=vs.100)
CSS/JQuery Extractor
- Selectors - jQuery 日本語リファレンス
http://semooh.jp/jquery/api/selectors/
JSON Extractor
- JSON パス式 (SQL Server) | Microsoft Learn
https://learn.microsoft.com/ja-jp/sql/relational-databases/json/json-path-expressions-sql-server
補足(4種類の使い分け):
Extractor 対象 速度 向くケース Regular Expression テキスト全般 速い 負荷テスト。HTML が整形式でない場合 XPath / XPath2 XML / XHTML 遅い 構造を辿って確実に取りたい場合 CSS/JQuery HTML 中 セレクタで書いたほうが読みやすい場合 JSON JSON 中 WebAPI(REST)のテスト 近年の SPA / WebAPI 中心の構成では JSON Extractor の出番が多い
(Single-page application、WebAPI)。
抽出する箇所を指定する。
(レスポンスの)「Body」を選択する。
- GET の場合、(リクエストの)「URL」を選択する。
- POST の場合、(リクエストの)「Body」を選択する。
-
変数として使用する際の名称を指定する。
(_は文字列グループで使用するため、使用不可) -
通常、リクエストで使用の際は、
${参照名}として使用する。
補足(
_が使えない理由): Regular Expression Extractor は、
参照名fooに対して以下の変数を自動生成する。
変数 内容 ${foo}マッチ結果(テンプレート適用後) ${foo_g}キャプチャ グループの数 ${foo_g1},${foo_g2}…各キャプチャ グループ ${foo_matchNr}マッチした件数(Match No. に -1を指定した場合)つまり
_付きの名前空間が予約されているため、
参照名自体に_を含めると衝突しうる、ということである。
補足(抽出できなかったときの挙動): マッチしなかった場合、
変数には Default Value が入る(未指定なら参照が展開されない)。
ここを空のままにすると、
後続のリクエストが不正なまま流れ続け、テストが成立していないことに気付けない。対策は以下。
- Default Value に
NOTFOUNDのような明示的な値を入れる- アサーション(Response Assertion)で妥当性を検証する
- デバッグ時は Debug Sampler と
「結果を表で表示」で変数の中身を確認する負荷テストは「エラーでも速い」ことがあるため、
成功しているかの検証を必ず組み込むのが鉄則である
(負荷テストのポイント)。
-
Apache JMeter - User's Manual: Component Reference > Post-Processors
https://jmeter.apache.org/usermanual/component_reference.html#postprocessors -
Apache JMeter で ASP.NET アプリをテストする、
またはレスポンスの値を POST/GET 値に含める方法 - TIM Labs
http://labs.timedia.co.jp/2012/06/jmeter-aspnet.html -
ASP.NET アプリケーションの過負荷試験を JMeter で行う。 - dunno logs
http://d.hatena.ne.jp/dany1468/20101209/1291906047
Tags: 移行, テスト, ツール類
このWikiは「Open棟梁Project」,「OSSコンソーシアム 開発基盤部会」によって運営されています。