基于条件从Gatling循环中退出。

问题描述 投票:0回答:1

我的加特林请求中要实现的步骤:1.在循环中打一个请求。2. 将JSON响应中的'status'值保存到'respStatus'中 3.将'respStatus'设置为会话变量'workStatus' 4.循环检查会话变量'workStatus'的值,当其值发生变化时退出。循环检查会话变量'workStatus'的值,当它的值从创建变为其他时退出。

这是我的代码。下面这段代码在第1次迭代这个请求后停止执行,检查响应体显示JSON响应中'creating'的值在停止时没有变化。这段代码有什么问题,或者有什么其他的方法可以实现吗?

.doWhile(session => !session(workStatus).as[String].equal("creating"),"index"){
  exec(http("Request1")
    .get(<URL goes here>)
    .header(<Headers in a map>)
    .check(jsonPath("$..status").saveAs("respStatus")))
    .exec(session => session.set("workStatus","${respStatus}"))
    .pause(10)
}.pause(10)
performance-testing gatling
1个回答
1
投票

几个错误。

  1. 无效的Gatling EL用法
session => session.set("workStatus","${respStatus}")

作为 文件中解释:

这种表达式语言只适用于传递给Gatling DSL方法的字符串值。当Gatling模拟被实例化时,这种字符串只被解析一次。

例如queryParam("latitude", session => "${latitude}")就不能用,因为参数不是一个字符串,而是一个返回字符串的函数。

  1. 你从 respStatusworkStatus 是没有用的。

  2. 正确的语法是第1行是 session("workStatus"),不 session(workStatus).

  3. 在Scala中,你可以使用 ==,不 equals.

  4. 小心jsonPath中的通配符路径会导致完整的JSON树扫描。如果可能的话,又担心性能,最好使用精确路径。

  5. JsonPath目前的状态是失败的,请阅读这篇文章. 如果可能的话,你应该切换到JMESPath。

  6. 您需要 headers,不 header 以通过地图。

.doWhile(session => !session("workStatus").as[String].equal("creating"),"index"){
  exec(http("Request1")
    .get(<URL goes here>)
    .headers(<Headers in a map>)
    .check(jsonPath("$..status").saveAs("workStatus")))
    .pause(10)
}.pause(10)
© www.soinside.com 2019 - 2024. All rights reserved.