加特林 JSON Feeder 独特的 POST 主体

Bob*_*ark 5 performance json scala gatling

我有一个包含 JSON 数组的 JSON 文件

测试.json

[
  { "Name": "Bob" },
  { "Age": "37" },
  { "DOB": "12/01/1985"}
]
Run Code Online (Sandbox Code Playgroud)

我想针对端点测试 JSON 数组中的每个相应元素,以观察系统针对唯一有效负载的性能

目前我有

测试服务.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()
Run Code Online (Sandbox Code Playgroud)

我无法将有效负载中的每个子项作为.body()JSON传递

加特林文档说 JSON Feeder 将数组的每个元素加载到记录集合中

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

IE:

record1: Map("id" -> 19434, "foo" -> 1)
record2: Map("id" -> 19435, "foo" -> 2)
Run Code Online (Sandbox Code Playgroud)

并将主体设置为.body(StringBody("""[{"id": ${id}}]"""))

问题是我有不同的密钥(姓名、年龄、出生日期),我希望每个密钥都发送不同的请求。

.body(StringBody("""[{"KEY_NAME_HERE": ${KEY_NAME_HERE}}]"""))
Run Code Online (Sandbox Code Playgroud)

我该如何实现这一目标?

Mat*_*ski 1

在您的例子中,该数组中的 JSON 是逐个加载的,并且由于该 JSON 中的每个第一级密钥都将保存为会话属性,因此模拟中的用户最终只会获得 3 个属性中的一个,具体取决于使用的 JSON。这样你就不能(或者准确地说不能轻易)构建主体字符串。在这种简单的情况下,最好使用具有相同字段的 JSON,这样您就可以在构建请求负载时依赖它们。铁。您可以将有效负载键和值放置在单独的字段中:

[
  {
    "key":"Name",
    "value":"Bob"
  },
  {
    "key":"Age",
    "value":"37"
  },
  {
    "key":"DOB",
    "value":"12/01/1985"
  },
]
Run Code Online (Sandbox Code Playgroud)

这样,对于模拟中的每个用户,您将拥有两个属性keyvalue因此您将能够构建如下有效负载:

.body(StringBody("""{"${key}": "${value}"}"""))
Run Code Online (Sandbox Code Playgroud)

当然,这仅适用于您描述的简单情况以及 JSON 中的纯字符串值。如果您的最终目标是使事情变得更复杂,请提供现实生活中的例子。