基于条件退出 Gatling 中的循环

Condition based exit from a loop in Gatling


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

这是我的代码。下面这个请求在第一次迭代后停止执行,检查响应主体显示 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)

几个错误:

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

作为explained in the documentation:

This Expression Language only works on String values being passed to Gatling DSL methods. Such Strings are parsed only once, when the Gatling simulation is being instantiated.

For example queryParam("latitude", session => "${latitude}") wouldn’t work because the parameter is not a String, but a function that returns a String.

  1. 您从 respStatusworkStatus 的副本没有用。

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

  3. 在 Scala 中,您将使用 ==,而不是 equals

  4. 注意 jsonPath 中的通配符路径会导致完整的 JSON 树扫描。如果可能,并且性能是一个问题,您最好使用准确的路径。

  5. JsonPath is a failure in its current state, please read this post。如果可能,您应该切换到 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)