简体   繁体   中英

How to add random value in Json Body in Gatling?

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!

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

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM