Подтвердить что ты не робот

Как добавить случайное значение в Json Body в Gatling?

Мне нужно создать случайное положительное целое число каждый раз и отправить его в тело Json в Gatling.

Я использовал приведенный ниже код для создания случайного положительного ineger:

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)  

Но это не работает. Любые подсказки, пожалуйста.

Спасибо!

4b9b3361

Ответ 1

Прежде всего вы хотите генерировать случайное число каждый раз, поэтому OrderRef должен быть методом, например:

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

Боковой комментарий: по Scala convention: name camelCase,(), пока он генерирует новые значения, без ; в конце.

Чтобы использовать подготовленный метод, вы не можете использовать строку Gatling EL. Синтаксис очень ограничен и в основном "${OrderRef}" ищет переменную с именем OrderRef в сеансе Gatling.

Правильный способ - использовать функцию выражения как:

.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 см. Тело запроса и подробнее о синтаксисе 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. Это работает, пока значение фидера берется из фидера Gatling перед подключением к сеансу для каждого виртуального пользователя. Подробнее о фидерах здесь.

Рекомендация: если сценарий прост, начните с первого решения. Если требуется более сложный подход к фидерам.

Enjoy