Skip to content

MS_JMeterVariableTracking

nishi_74322014 edited this page Aug 21, 2026 · 2 revisions

Jmeterによる可変値の追跡

概要

  • 抽出系の後処理(Jmeter用語)を追加して
    レスポンスから値を抽出する。

  • 基本的に、サンプラー(HTTP リクエスト)(Jmeter用語)に
    追加する。
    (変数のスコープがあるかと思ったが、どうも無いっぽいので、
    直前のサンプラー(HTTP リクエスト)に都度追加)

補足(なぜ「可変値の追跡」が要るのか): 負荷テストのシナリオは
記録したリクエストをそのまま再生するだけでは動かない。
サーバが毎回変える値を、レスポンスから取り出して
次のリクエストに埋め直す必要があるためである。

ASP.NET Web Forms では特にこれが顕著で、以下が該当する。

用途
__VIEWSTATE ページの状態(ASP.NET ViewState
__VIEWSTATEGENERATOR ViewState の識別子
__EVENTVALIDATION ポストバックの検証
__RequestVerificationToken CSRF 対策トークン(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 に対応している。

正規表現

正規表現

Extractor

Regular Expression Extractor(正規表現抽出)

Expression

抽出のための正規表現(Jmeterの正規表現)を指定する。

XPath

Extractor

XPath Extractor

Expression

Selector

Extractor

CSS/JQuery Extractor

Expression

JSON

Extractor

JSON Extractor

Expression

補足(4種類の使い分け):

Extractor 対象 速度 向くケース
Regular Expression テキスト全般 速い 負荷テスト。HTML が整形式でない場合
XPath / XPath2 XML / XHTML 遅い 構造を辿って確実に取りたい場合
CSS/JQuery HTML セレクタで書いたほうが読みやすい場合
JSON JSON WebAPI(REST)のテスト

近年の SPA / WebAPI 中心の構成では JSON Extractor の出番が多い
Single-page applicationWebAPI)。

共通的な設定

Field to check

抽出する箇所を指定する。

可変値の追跡の場合

(レスポンスの)「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
    「結果を表で表示」で変数の中身を確認する

負荷テストは「エラーでも速い」ことがあるため、
成功しているかの検証を必ず組み込むのが鉄則である
負荷テストのポイント)。

参考


Tags: 移行, テスト, ツール類

NetDevInfraWiki

マイクロソフト系技術情報 Wiki
Open 棟梁 Wiki

(未着手)

開発基盤部会 Wiki

移行管理: DONETODO

Clone this wiki locally