正規表現
JMeter
regularexpression
テスト計画

Jmeterメモ:レスポンスの戻り値から値を取得して、次のリクエストのパラメータとして使う

やりたい事

「二つのPOSTリクエストを送って、1個目の戻り値を2個目のパラメータとして送信」がしたい。使うツールは、「Apache JMeter」と決まっている。
レスポンスは、Bodyにあって、Json形式ではあるが、テスト計画は自分以外のチームメンバーも実行できる必要があるので、JMeterにプラグインを入れたりするなどの手間は最小限に抑えたい。

もう少し具体的に:
「あるデータの保存処理から戻った「保存データID」の値を別のAPIに渡して保存させる」という流れのテストがしたい。
面倒なことに、「保存データID」にはユニーク成約がかかっていて、JMeterが向いているサーバのDBは、他の箇所からも参照されいてるのでそのIDを連番にするとかDBを先に空にするとかはできないという制約もあります。
また、実際に実装されている状態に一番近いテスト計画を組みたくて、APIを順番に呼び出し、戻り値をパラメータとして渡すのは、理想でした。

実際のやり方

大枠を説明すると:

1個目のリクエストを投げた後、その戻り値から正規表現を使って取得したいデータを取得し、次のリクエストのパラメータとして使えるように一時的に保管させます。

テストしたかったAPIの戻り値とパラメータサンプル

1個目のリクエストの戻り値例:

{"result"::{"id":130}}

2個目のリクエストで送りたいパラメータ例:

data_filer=sample&contact_master_id=130

2個目のcontact_master_idとして、1個目の「id」が入らないと、正しいテストができない仕様です。

JMeterで実際にテスト計画を作る

スレッドグループを作る

JMeterでリクエスト間でパラメータの受け渡しを行うためには、該当リクエストを「スレッドグループ」として設定するといいと思います。そうしなくても動作はできますが、一つのスレッドグループに何もかもを入れてしまうと、実行されているテストが多くなった時整理や修正が大変になります。
スレッドグループのネーミングは、日本語も使えますが、ローマ字にした方がよいです。なぜかというと、日本語にした場合、パラメータの受け渡しが正常に動作しないなど、想定外なところで困ったりするからです。
スレッドグループを設定したら先ずは1個目のリクエストをいつも通りに設定します。POSTでもGETでも、戻り値が存在している限りなんでも大丈夫です。

レスポンスから値を取得する:bodyの内容から正規表現抽出

1個目のリクエストを設定して動作確認したら、リストのリクエスト名を右クリックして「追加」→「後処理」→「正規表現抽出」という項目を追加します。
追加したら、細かく設定をしていく必要があります。

例にあるレスポンスの場合、画像のような設定になります。

Image 006.png

まずは「参照名」として、2個目のリクエストで保管した値を呼ぶ時の変数名を設定して、取得するための正規表現を書いていきます。取得元はbodyの内容なので、「Field to check」としては「Body」を選択します。
次に、使う値を取得するための正規表現を実際に書きます。例の場合、Json形式の内容からid:に続くデータが取得したいので、例えばこういう書き方が出来ます:

"id":(.\d+)

正規表現で取得された値は一つとは限らないので、どの値を使うかなどの設定も必要です。
「テンプレート」とは、取得された値のグループ指定に使われる設定です。
取得値が保管されている変数には、取得された全ての値(アトリビュート)がグループ化され保管されています。複数のアトリビュートを取得する場合、「指定した変数名_g1」「指定した変数名_g2」という風に内部で管理されていて、どのグループを使うか「テンプレート」設定で決めます。
「$1$」→ 一つ目のグループ、「$2$」二つ目のグループです。ちなみに「$0$」は、全てのグループを返す設定です。
私の例の場合は、アトリビュートがそもそも1つなので、「テンプレート」設定値は「$1$」で十分です。
「一致番号」は、使う値の番号で、1個目なら「1」です。ここで「0」は、ランダムを意味します。

最後には、値が取得出来ない場合、変数に保管されるデフォルト値が設定出来ます。右のチェックボックスにチェックをいれたら、デフォルトが空になりますが、取得がうまく出来ていないのか、適用ができてないなかなど、テスト計画の検証がややこしくなるので、該当APIなどが絶対失敗するような値をデフォルト値として設定することをおすすめします。私の場合は、integerを期待しているAPIなので、「incorrect-id-value」という文字列を設定しました。

取得した値を別のリクエストで使う

最後に、2個目のリクエストを通常通り設定したら、使いたいパラメータの値を以下のように設定するだけです:

data_filer=sample&contact_master_id=${contact_master_id}

※「data_master_id」は、参照名として設定した文字列です。

設定はこれで以上です。