【问题标题】:Gatling JSON Feeder Unique POST BodiesGatling JSON Feeder 独特的 POST 正文
【发布时间】:2019-02-10 17:49:34
【问题描述】:

我有一个包含 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}}]"""))

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

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

我如何做到这一点?

【问题讨论】:

    标签: json scala performance gatling


    【解决方案1】:

    这就是我正在做的事情:-

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

    希望这会有所帮助。

    问候, 维克拉姆·帕塔尼亚

    【讨论】:

    • 难以置信的同谋 :) 如果我想将整个 json 从文件中提供给元素怎么办:body(StringBody 不只是用手和字符串插值构建东西?
    • 如果你有 1K 属性你要做什么?
    【解决方案2】:

    在您的情况下,该数组中的 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 中的纯字符串值。如果您的最终目标是让事情变得更复杂,请提供现实生活中的示例。

    【讨论】:

      猜你喜欢
      • 2022-08-18
      • 2015-05-30
      • 1970-01-01
      • 1970-01-01
      • 2022-01-14
      • 2018-11-14
      • 2016-08-20
      • 2014-12-05
      • 2021-10-08
      相关资源
      最近更新 更多