Gatling: JsonPath извлекает несколько значений

Я создаю сценарий gatling 2.1.3, и мне нужно извлечь данные из тела json.

Пример корпуса:

[
  {
    "objectId": "FirstFoo",
    "pvrId": "413"
    "type": "foo",
    "name": "the first name",
    "fooabilities": {
      "foo1": true,
      "foo2": true
    },
    "versions": [23, 23, 23, 23, 23, 23, 24, 23, 23],
    "logo": [
      {
        "type": "firstlogo",
        "width": 780,
        "height": 490,
        "url": "firstlogos/HD/{resolution}.png"
      }
    ]
  },
  {
    "objectId": "SecondFoo",
    "pvrId": "414"
    "type": "foo",
    "name": "the second name",
    "fooabilities": {
      "foo1": true,
      "foo2": false
    },
    "versions": [23, 23, 23, 23, 23, 23, 24, 23, 23],
    "logo": [
      {
        "type": "secondlogo",
        "width": 780,
        "height": 490,
        "url": "secondlogos/HD/{resolution}.png"
      }
    ]
  }
]

и у меня есть этот код, пытающийся извлечь данные:

exec(
  http("get object")
    .get(commons.base_url_ws + "/my-resource/2.0/object/")
    .headers(commons.headers_ws_session).asJSON
    .check(jsonPath("$..*").findAll.saveAs("MY_RESULT"))) (1)
  .exec(session => {
    foreach("${MY_RESULT}", "result") { (2)
      exec(session => {
        val result= session("result").as[Map[String, Any]]
        val objectId = result("objectId")
        val version = result("version") 
        session.set("MY_RESULT_INFO", session("MY_RESULT_INFO").as[List[(String,Int)]] :+ Tuple2(objectId, version))
      })
    }
    session
  })

Моя цель: извлечь objectId и 9-е значение из массива версий. Я хочу, чтобы он выглядел как Vector -> [(id1, version1), (id2, version2)] в сеансе для повторного использования позже в другом вызове API.

Меня беспокоит следующее: (1) Будет ли это создавать записи в сеансе с полными подобъектами? Потому что в других ответах я говорил, что это всегда была сохраненная карта ("id" = [{...}]), а здесь у меня нет идентификаторов.

(2) В журналах я вижу, что сеанс загружен с большим количеством данных, но этот foreach никогда не вызывается. Что могло вызвать это?

Я новичок в Scala, поэтому, пожалуйста, укажите, есть ли у меня явные проблемы, которых я не видел.

Я изучил эту проблему: Gatling - цикл через массив JSON, и это не совсем отвечая на мой случай.

Огромное спасибо!


person Bruno Gagnon-Adam    schedule 28.01.2015    source источник
comment
Строка (1) выглядит подозрительно, она вернет все подструктуры, возможно, не то, что вам нужно. (2) может пропустить префикс интерполятора строк, извините, я не знаком с gatling.   -  person Gábor Bakos    schedule 28.01.2015
comment
(Только что проверил ссылку, которую вы упомянули. (2), вероятно, правильный синтаксис, но немного необычный.)   -  person Gábor Bakos    schedule 28.01.2015


Ответы (1)


Я нашел способ сделать это с помощью регулярного выражения.

.check(regex("""(?:"objectId"|"version"):"(.*?)",.*?(?:"objectId"|"version"):\[(?:.*?,){9}([0-9]*?),.*?\]""").ofType[(String, String)].findAll saveAs ("OBJECTS")))

Тогда я могу использовать это

foreach("${OBJECTS}", "object") {
  exec(
    http("Next API call")
      .get(commons.base_url_ws + "/my-resource/2.0/foo/${object._1}/${object._2}")
    [...]
}
person Bruno Gagnon-Adam    schedule 28.01.2015
comment
Некоторые проблемы: если -пример- fooabilities содержит ключи objectId и version, ваше регулярное выражение может совпадать и там. Он не будет соответствовать, если существует менее 10 вещей для версий, пустая 10-я версия также совпадает (хотя она не является частью действительного JSON). Предполагается, что порядок objectId и version будет таким, но JSON не определяет порядок. Если objectId содержит ,, ваш шаблон останавливается на этом. - person Gábor Bakos; 29.01.2015