Как создать многозначную карту со случайными значениями и ввести в тело запроса с помощью фидера в Гатлинге

#scala #gatling #scala-gatling

Вопрос:

Я пишу нагрузочный тест для api и хочу создать фидер, который генерирует случайные значения для ввода в тело запроса POST. Сначала я попытался скопировать случайный пример электронной почты из документации и добавить дополнительные поля в сгенерированную карту, но когда это не сработало, я перешел к одному полю, в основном скопировав документацию; однако даже это по какой-то причине не работает. Здесь есть куча решений, которые также используют этот синтаксис, но что-то в том, как я это делаю, приводит к тому, что поля, которые я пытаюсь ввести в тело, становятся пустыми при выполнении запроса.

Текущий Код:

 val userFeeder: Iterator[Map[String, Unit]] =
    Iterator.continually(Map("userName" -> ("user_"   Random.alphanumeric.take(15).mkString)))

var scn: ScenarioBuilder = scenario("GENERATE USER")
.feed(userFeeder)
.exec(
  http("CREATE USER")
  .post(userBaseUrl)
  .headers(userHeaders)
  .body(StringBody("userName: ${userName}")))


setUp(
  scn.inject(atOnceUsers(1))
)
 

В идеале я хотел бы иметь возможность расширить фидер, включив в него несколько значений, т. Е.

  val userFeeder: Iterator[Map[String, Unit]] =
     Iterator.continually(Map("userName" -> ("user_"   Random.alphanumeric.take(15).mkString),
                              "userEmail" -> (Random.alphanumeric.take(15).mkString)   "@random.edu"),
                              "address" -> Random.alphanumeric.take(15).mkString)))
 

и так далее, но я немного озадачен тем, почему мой текущий код даже не работает, поскольку, похоже, он довольно точно следует примеру документации. В моих запросах значения всегда равны нулю, несмотря на то, что я пробовал несколько разных стратегий.

Вывод журнала

 body:StringChunksRequestBody{contentType='application/json', charset=UTF-8, content=userName: ()}
 

Ответ №1:

Понял это. Оказывается, что, несмотря на то, что Feeder является оболочкой для итератора, правильный способ сделать то, что я хочу, — это объявить его следующим образом:

 val userFeeder: Feeder[Any] =
 Iterator.continually(Map("userName" -> ("user_"   Random.alphanumeric.take(15).mkString),
                          "userEmail" -> (Random.alphanumeric.take(15).mkString)   "@random.edu"),
                          "address" -> Random.alphanumeric.take(15).mkString)))