Gatling:如何从数组中提取一个对象?

Gatling: How to extract one object from array?

我是 Gatling 和 Scala 的新手。发送 Get Request 响应主体是 Array,我只需要从 Array 中提取一个对象并在 Gatling 中 post 它。谁能告诉我怎么做?

这是我的代码示例:

private val getUsers = exec(
      http("Get users")
        .get("/users")
        .check(status.is(200))
        .check(bodyString.saveAs("Users")))

我得到的结果是:

[{"id":"1","hairColor":"BROWN","age":24,"language":"English","birthDate":"1995-02-10"},
{"id":"2","hairColor":"YELLOW","age":30,"language":"Australian","birthDate":"1889-10-05"},
{"id":"3","hairColor":"BLACK","age":15,"language":"American","birthDate":"..."},
{"id":"4","hairColor":"RED","age":50,"language":"Russian","birthDate":"..."}]

如何只从这个数组中获取一个 User 和 post 整个 User 对象?

你可以轻松获取,但你需要定义哪个键

我用 'id' 键的例子

$.[*].[?(@.id == '1')]


$.[*] <= 获取数组的所有元素

.[?(@.id == '1')] <= 获取 id 等于 '1' 的元素(您可以使用任何值)。

或任意键$.[*].[?(@.hairColor == 'BROWN')]


然后只需添加 .check(jsonPath("$.[*].[?(@.id == '1')]").saveAs("myUser")

如果你切换到 jsonPath 检查,你可以将所有用户对象放入一个 Vector 中,它在 Gatling EL 中有一些很好的支持

所以而不是

.check(bodyString.saveAs("Users"))

你可以使用

.check(jsonPath("$..[?(@.id)]").findAll.saveAs("Users")))

然后当你来打后续电话时,你可以做类似

的事情

select第一个用户

.body(StringBody("${Body(1).jsonStringify()}"))

select 一个随机用户

.body(StringBody("${Body.random().jsonStringify()}"))

这种方法还允许您使用.forEach 对所有记录进行交互

我自己找到了答案。如果我想从数组中保存任何一个对象,我可以这样做 ->

private val getUsers = exec(
  http("Get users")
    .get("/users")
    .check(status.is(200))
    .check(jsonPath("$[0]").find.saveAs("user")))

当然,我必须指定要保存的值,但在我的示例中,我保存的是第一个值。稍后您可以将此值用于其他请求。