web-dev-qa-db-ja.com

GatlingのJson Bodyにランダムな値を追加する方法は?

毎回ランダムな正の整数を作成し、GatlingのJson bodyに送信する必要があります。

以下のコードを使用して、ランダムな正の整数を作成しました。

val  r = new scala.util.Random;
val OrderRef = r.nextInt(Integer.MAX_VALUE);

しかし、ランダムに生成された値をJSONボディにフィードするにはどうすればよいですか?

私は試した:

.exec(http("OrderCreation")
.post("/abc/orders")
.body(StringBody("""{    "orderReference": "${OrderRef}"}""").asJson)  

しかし、これはうまくいかないようです。手がかりをお願いします。

ありがとう!

18
Gold Meen

まず、毎回乱数を生成したいので、OrderRefは次のようなメソッドでなければなりません:

_def orderRef() = Random.nextInt(Integer.MAX_VALUE)
_

サイドコメント:by Scala規約:名前camelCase、()が最後に_;_なしで新しい値を生成します。

準備されたメソッドを使用するには、Gatling EL stringは使用できません。構文は非常に限定されており、基本的に_"${OrderRef}"_はGatlingセッションでOrderRefという名前の変数を検索します。

正しい方法は、式関数を次のように使用することです:

_.exec(
   http("OrderCreation")
  .post("/abc/orders")
  .body(StringBody(session => s"""{ "orderReference": "${orderRef()}" }""")).asJSON
)
_

ここでは、Gatling Sessionを取り、Stringを本体として返す匿名関数を作成しています。文字列は、標準のScala文字列補間メカニズムを介して構成され、準備された関数orderRef()の前に使用します。

もちろん、Scala文字列補間を次のように省略できます。

_.body(StringBody(session => "{ \"orderReference\": " + orderRef() +" }" )).asJSON
_

これは、Scalaを使用する場合にはあまり好ましくないスタイルです。

詳細については、Gatlingのドキュメントの Request Body を参照してください。また、 Galting EL構文 の詳細を参照してください。

別の方法は、フィーダーを定義することです:

_// Define an infinite feeder which calculates random numbers 
val orderRefs = Iterator.continually(
  // Random number will be accessible in session under variable "OrderRef"
  Map("OrderRef" -> Random.nextInt(Integer.MAX_VALUE))
)

val scn = scenario("RandomJsonBody")
  .feed(orderRefs) // attaching feeder to session
  .exec(
     http("OrderCreation")
    .post("/abc/orders")
    // Accessing variable "OrderRef" from session
    .body(StringBody("""{ "orderReference": "${OrderRef}" }""")).asJSON
  )
_

ここでは状況が異なります。最初にフィーダーを定義し、それをセッションにアタッチしてから、Gatling EL stringを介してリクエスト本文でその値を使用します。これは、各仮想ユーザーのセッションにアタッチされる前に、ガトリングによってフィーダー値がフィーダーから取得されるときに機能します。フィーダーの詳細については こちら をご覧ください。

推奨事項:シナリオが単純な場合は、最初の解決策から始めてください。より複雑になる場合は、フィーダーについて考えてください。

楽しい

38
Teliatko