加特林JSON Feeder独特的POST主体

时间:2018-09-05 14:27:41

标签: json scala performance gatling

我有一个包含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传递

Gatling Docs说JSON Feeder将Array的每个元素加载到记录集合中

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

即:

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

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

问题是我有不同的密钥(名称,年龄,DOB),并且我希望每个密钥都是发送的不同请求。

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

我该如何实现?

2 个答案:

答案 0 :(得分:0)

在您的情况下,该数组中的JSON会被一次加载,并且由于该JSON中的每个第一级键都将保存为会话属性,因此模拟中的用户最终仅使用3个属性中的1个(取决于使用哪种JSON)。这样,您将无法(或者确切地说是不容易)构建主体字符串。在这种简单情况下,最好让JSON具有相同的字段,因此在构建请求有效负载时可以依靠它们。铁您可以将有效负载键和值放在单独的字段中:

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

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

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

当然,这仅在您描述的简单情况下以及在JSON中使用仅字符串值的情况下才有效。如果您的最终目标是使事情变得更复杂,请提供实际示例。

答案 1 :(得分:0)

这就是我的做法:-

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中读取每个数组[position],并替换请求中的值,以从不同的环境中获取安全性令牌。

希望这会有所帮助。

关于, Vikram Pathania