How to add random value in Json Body in Gatling?

Gold Meen picture Gold Meen · Mar 7, 2016 · Viewed 20.3k times · Source

I need to create a random positive integer each time and send it to Json body in Gatling.

I used the below code to create a random positive ineger:

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

but, How can I feed the randomly generated value into the json body?

I tried:

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

But, this doesn't seem to work. Any clues please.

Thanks!

Answer

Teliatko picture Teliatko · Mar 8, 2016

First of all you want to generate random number each time, thus OrderRef has to be a method, like:

def orderRef() = Random.nextInt(Integer.MAX_VALUE)

Side comment: by Scala convention: name camelCase, () while it generates new values, without ; in the end.

To use the prepared method you cannot use the Gatling EL string. Syntax is very limited and basically "${OrderRef}" searches for variable with name OrderRef in Gatling Session.

Correct way is to use Expression function as:

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

Here you are creating anonymous function taking Gatling Session and returning String as body. String is composed via standard Scala string interpolation mechanism and uses before prepared function orderRef().

Of course you can omit Scala string interpolation as:

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

which is not very preferred style when using Scala.

See more details at Gatling documentation to Request Body and read more about Galting EL syntax.

An alternative way is to define a Feeder:

// 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
  )

Here the situation is different, first we define the feeder, then we attach it to session and then use its value in request body via Gatling EL string. This works while the feeder value is taken from feeder by Gatling before an attached to session for each virtual user. See more about feeders here.

Recommendation: If you scenario is simple, start with first solution. If it takes more complex think about feeders.

Enjoy