ぬまろぐ

←戻る

Gatling | 外部ファイルに変数を入れてリクエストする

2020/10/31

Gatlingで外部ファイルの内容をリクエストする際に、外部ファイルの中身に変数を格納する方法を見つけたので紹介します。

1. 通常の変数の設定方法

通常はformParam関数などでリクエストパラメータを設定し、その際に変数を入れたりすることが出来ます。

http("Sample Request 1")
  .get("https://sample.com/sample1")
  .check(css("selector", "value").find.saveAs("value2"))
...
http("Sample Request 2")
  .post("https://sample.com/sample2")
  .formParam("key1", "value1")
  .formParam("key2", "${value2}")

これを外部ファイルの内容をリクエストする際も同じことができない試行しました。

2. RawFileBodyでは変数設定ができない

通常、外部ファイルをリクエストする場合はRawFileBody関数を使いますが、これで変数付きのファイルを読み込んでも、変数は置換されずに送られてしまいました。

http("Sample Request 3")
  .post("https://sample.com/sample3")
  .body(RawFileBody("sample.txt"))

sample.txtの内容。そのまま送られてしまう

{"key1":"value1", "key2":"${value2}"}

3. PebbleFileBody関数を使うと変数設定ができる

Gatling3からPebble templatingというのが導入されたようです。

Pebble is a logic-full templating engine, with several interesting features missing in EL: filters, if, loop, import…

と説明されており、テンプレートの中で制御文や変数を書くことが出来るようです。 外部ファイルに以下のような記述を行うことで、リクエストする際に処理を実行してから結果を送信してくれます。変数は{{}}で指定するようです。”|”はフィルタで{{children|length}}はchildrenの長さを抽出してくれるようです。{% xxx %}は制御文ですね。

{
  "id": {{id}},
  "name": "{{name}}",
  "numberOfChildren": {{children|length}},
  "children": [
  {% for child in children %}
      {
        "id": {{child.id}},
        "name": "{{child.name}}"
      }{% if loop.last %}{% else %},{% endif %}
  {% endfor %}
  ]
}

このファイルを以下のようにPebbleFileBody関数で読み込めばOKです。{{ xx }}をセッション変数の値に置き換えてくれます。

http("Sample Request 1")
  .get("https://sample.com/sample1")
  .check(css("selector", "value").find.saveAs("id"))
...

http("Sample Request 4")
  .post("https://sample.com/sample4")
  .body(PebbleFileBody("sample.txt"))