Gatling JSON Feeder Уникальные тела POST - PullRequest
0 голосов
/ 05 сентября 2018

У меня есть файл JSON, который содержит массив JSON

test.json

[
  { "Name": "Bob" },
  { "Age": "37" },
  { "DOB": "12/01/1985"}
]

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

в настоящее время у меня есть

testService.scala

val payload = jsonFile("test.json").circular
val httpProtocol = http
    .baseURL("http://test.com")
    .headers(Map("Content-Type" -> "application/json"))

val scn = scenario("Test Service")
    .feed(payload)
    .exec(http("test_request")
        .post("/v1/test")
        .queryParam("key", "123")
        .body()

Я не могу передать каждого соответствующего ребенка из полезной нагрузки в .body() как JSON

Документы Гатлинга говорят, что JSON Feeder загружает каждый элемент массива в коллекцию записей

https://gatling.io/docs/2.3/session/feeder/

То есть:

record1: Map("id" -> 19434, "foo" -> 1)
record2: Map("id" -> 19435, "foo" -> 2)

и установите тело на .body(StringBody("""[{"id": ${id}}]"""))

Проблема в том, что у меня разные ключи (Name, Age, DOB), и я бы хотел, чтобы каждый из них отправлял разные запросы.

.body(StringBody("""[{"KEY_NAME_HERE": ${KEY_NAME_HERE}}]"""))

Как мне этого добиться?

Ответы [ 2 ]

0 голосов
/ 18 июня 2019

Вот как я делаю: -

company_users.json.json

[
  {
    "env":"dev",
    "userName": "a@test.com",
    "password": "Qwerty!12345678"
  },
  {
    "env":"sit",
    "userName": "b@test.com",
    "password": "Qwerty!12345678"
  },
  {
    "env":"uat",
    "userName": "c@test.com",
    "password": "Qwerty!12345678"
  },
  {
    "env":"prod",
    "userName": "d@test.com",
    "password": "Qwerty!12345678"
  }
]

Фрагмент рабочего кода:

val jsonFileFeederCompany = jsonFile("data/company_users.json").circular

val get_company_user_token = http("Get Company Tokens")
.post(gwt_token_url)
.header("Content-Type", "application/json")
.header("Accept", "application/json")
.body(StringBody(
  """{
      "env":  "${env}",
      "userName":  "${userName}",
      "password":  "${password}"
  }"""
)).asJson
.check(status.is(200))
.check(jsonPath("$.jwtToken").saveAs("jwtToken"))

val getCompanyUsersGwtToken = scenario("Create Company GWT token Scenario")
.feed(GetTokenRequest.jsonFileFeederCompany)
.exec(GetTokenRequest.get_company_user_token).exitHereIfFailed

Это будет считывать каждый массив [положение] из json и заменять значения в запросе, чтобы извлекать токены безопасности из разных env.

Надеюсь, это поможет.

С уважением, Викрам Патания

0 голосов
/ 05 сентября 2018

В вашем случае JSON из этого массива загружаются один за другим, и, поскольку каждый ключ первого уровня из этого JSON будет сохранен как атрибут сеанса, тогда пользователи в вашей имитации получат только 1 из 3 атрибутов, в зависимости от того, какой JSON был использован. Таким образом, вы не можете (или, если быть точным, не можете легко) создать строку тела. В этом простом случае было бы лучше иметь JSON с одинаковыми полями, чтобы вы могли полагаться на них при создании полезной нагрузки запроса. Fe. Вы можете поместить ключ и значение полезной нагрузки в отдельные поля:

[
  {
    "key":"Name",
    "value":"Bob"
  },
  {
    "key":"Age",
    "value":"37"
  },
  {
    "key":"DOB",
    "value":"12/01/1985"
  },
]

Таким образом, для каждого пользователя в симуляции у вас будет два атрибута key и value, поэтому вы сможете построить полезную нагрузку, например:

.body(StringBody("""{"${key}": "${value}"}"""))

Конечно, это будет работать только в том простом случае, который вы описали, и только со строковыми значениями в JSON. Если вашей конечной целью является создание чего-то более сложного, приведите пример из реальной жизни.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...