JMeter - 如果控制器不适用于某些字符串包含条件?

JMeter - If Controller not working for certain string contains condition?

背景:
我有一个 API returns 这样的响应:

{
  "status": 1,
  "errorCode": null,
  "message": null,
  "data": [
    {
      "id": 33,
      "snapshotId": 2,
      "ceId": 29,
      "month": "Feb",
      "corpRcvPayAmt": 100000,
      "wthRcvPayAmt": -90000
    },
    {
      "id": 31,
      "snapshotId": 2,
      "ceId": 29,
      "month": "Jan",
      "corpRcvPayAmt": 0,
      "wthRcvPayAmt": 0
    }
  ]
}

data 节点的大小可以从 0 到 12(每月从空到 1)不等。 data 的唯一常量字段是 "month" 节点。其他字段值正在更改。

目标:
我想执行 PUTPOST 请求,具体取决于 data.

中是否已经存在特定月份

为此,我使用 正则表达式提取器 将整个 data 字段捕获到一个变量中,如下所示:

根据上面的示例响应,调用 ${data} 会给我 {"id":33,"snapshotId":2,"ceId":29,"month":"Feb","corpRcvPayAmt":100000.00,"wthRcvPayAmt":-90000.00},{"id":31,"snapshotId":2,"ceId":29,"month":"Jan","corpRcvPayAmt":0.00,"wthRcvPayAmt":0.00}

现在使用这个字段,我只想做一个简单的 if 条件,如下所示:如果 ${data} 包含 ${month} 做某事(PUT 请求)。我目前正在尝试这样做:

问题:
条件 ${__groovy("${data}".contains("Jan"))} 似乎不起作用。 我已经尝试过执行以下操作:

  • 把条件改成${__groovy("${month}".contains("Jan"))}就是为了看语法是否正确。这很好用。
  • 在 if 控制器中添加一个调试采样器,使用条件 ${__groovy("${month}".contains("Jan"))} 打印 ${data}。这也会按预期打印数据。
  • 我也尝试过对 if 条件使用各种 js 语法,但到目前为止 groovy 是最好的结果。

    有了这个我可以确认以下内容:

  • ${month}${data} 被正确提取和存储
  • groovy 字符串包含的语法工作正常
  • 由于某种原因,条件 ${__groovy("${data}".contains("Jan"))} 不工作。

    我在这里错过了什么?提前致谢。

  • 不要在 Groovy 脚本中引用 JMeter Functions and/or Variables 作为:

    1. 可能与 GString Template
    2. 有冲突
    3. 对于JSR223 Test Elements它会导致编译缓存功能故障降低性能
    4. 您的变量可能会简单地解析为会导致 Groovy 脚本编译失败 and/or 故障的内容。您可以检查 jmeter.log 文件以了解实际的错误详细信息。

    所以不要使用 ${data} 而是使用 vars.get("data")varsJMeterVariables class 实例的 shorthand,这是从 Groovy 脚本获取 JMeter 变量值的最佳方法。

    整个函数应该如下所示:

    ${__groovy(vars.get('data').contains("Jan"),)}
    

    另请注意,最好使用 JSON Extractor 从 JSON 响应中获取值。