加特林使变量或属性在transformResponse块之外可用

时间:2019-11-17 13:30:01

标签: gatling

这是有关加特林3.3版的问题

我想从json响应中保存一些键并将它们连接起来,以便可以在下一个请求的正文中重用它们。 我从get请求中从服务器获得的内容是:

{
    "result": [{
            "label": "Work",
            "addr1": "212 Stephenville St",
            "addr2": "",
            "city": "Massena",
            "zip": "13668",
            "country": "US",
            "region": "US-NY",
            "additionalInfo": "",
            "building": "",
            "floor": "",
            "room": "",
            "phone": ""
        }
    ]
}

我需要具有的变量是addr1 + zip + region + country,这意味着: “ 212 Stephenville St” +“” +“ 13668” +“” +“ US-NY” +“” +“ US”

这就是我想要做的:

  var address0: String = " "
  def getAddresses() = {
    exec(http("GET /addresses")
      .get("/addresses")
      .check(status.is(200))
      .transformResponse {
        (session, response) =>
          if(response.status.code == 200) {
            val jsonResponse: JsValue  = Json.parse(response.body.string)
            address0 = (jsonResponse \ "result" \ 0 \ "addr1").as[String] + (jsonResponse \ "result" \ 0 \ "zip").as[String] + (jsonResponse \ "result" \ 0 \ "region").as[String] + (jsonResponse \ "result" \ 0 \ "country").as[String]
            session.set("address1", address0)
            response
          } else {
            response
          }
      })
      .pause(1)
      .exec {session => println(session); session}
  }

我已经确认transformResponse块内的address0具有我需要的值,但在外面不可用。我还尝试了session.set(“ address1”,address0),以为它可以添加一个新属性,但在执行println(session)时不存在。

我想知道是否有人可以提供有关如何在此块之外提供address0值的帮助,以便我可以在下一个请求中重用它?

通过我知道的方式,我可以执行以下操作,并且可以正常工作。

  def getAddresses() = {
    exec(http("GET /addresses")
      .get("/addresses")
      .check(status.is(200))
      .check(jsonPath("$.result[0].addr1").saveAs("addr1"))
      .check(jsonPath("$.result[0].zip").saveAs("zip"))
      .check(jsonPath("$.result[0].region").saveAs("region"))
      .check(jsonPath("$.result[0].country").saveAs("country")))
      .pause(1)
      .exec {session => println(session); session}
  }

但我希望在可能的情况下在transformResponse块中进行操作

谢谢。

1 个答案:

答案 0 :(得分:1)

您也许可以使用transformResponse来做到这一点,但是我不确定这是最好的方法。在您的示例中出现的问题是transformResponse用于在运行检查之前修改响应-它获取响应和会话,然后返回响应。由于会话是不可变的,因此无法在块内编辑会话。

因此,您需要做的是将响应解析为JSON(如您所做的那样),然后将新构造的地址重新添加到响应中,并在通过检查调用将值输入会话之前返回它。

更容易的是通过检查来获取所有组件值,然后将它们组合成所需的组合,然后将其存储到会话中-在会话函数中或作为检查转换的一部分。这样,您根本无需弄乱任何自定义JSON解析/构造。

def getAddresses() = {
exec(http("GET /addresses")
  .get("/addresses")
  .check(status.is(200))
  .check(jsonPath("$.result[0].addr1").saveAs("addr1"))
  .check(jsonPath("$.result[0].zip").saveAs("zip"))
  .check(jsonPath("$.result[0].region").saveAs("region"))
  .check(jsonPath("$.result[0].country").saveAs("country"))
)
.exec(session => session.set("address", session.get("addr1").as[String] + session.get("zip").as[String] + session.get("region").as[String] + session.get("country").as[String]))