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"
节点。其他字段值正在更改。
目标:
我想执行 PUT
或 POST
请求,具体取决于 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 作为:
- 可能与 GString Template
有冲突
- 对于JSR223 Test Elements它会导致编译缓存功能故障降低性能
- 您的变量可能会简单地解析为会导致 Groovy 脚本编译失败 and/or 故障的内容。您可以检查 jmeter.log 文件以了解实际的错误详细信息。
所以不要使用 ${data}
而是使用 vars.get("data")
,vars
是 JMeterVariables class 实例的 shorthand,这是从 Groovy 脚本获取 JMeter 变量值的最佳方法。
整个函数应该如下所示:
${__groovy(vars.get('data').contains("Jan"),)}
另请注意,最好使用 JSON Extractor 从 JSON 响应中获取值。
背景:
我有一个 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"
节点。其他字段值正在更改。
目标:
我想执行 PUT
或 POST
请求,具体取决于 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"))}
就是为了看语法是否正确。这很好用。
${__groovy("${month}".contains("Jan"))}
打印 ${data}
。这也会按预期打印数据。有了这个我可以确认以下内容:
${month}
和 ${data}
被正确提取和存储
${__groovy("${data}".contains("Jan"))}
不工作。
我在这里错过了什么?提前致谢。
不要在 Groovy 脚本中引用 JMeter Functions and/or Variables 作为:
- 可能与 GString Template 有冲突
- 对于JSR223 Test Elements它会导致编译缓存功能故障降低性能
- 您的变量可能会简单地解析为会导致 Groovy 脚本编译失败 and/or 故障的内容。您可以检查 jmeter.log 文件以了解实际的错误详细信息。
所以不要使用 ${data}
而是使用 vars.get("data")
,vars
是 JMeterVariables class 实例的 shorthand,这是从 Groovy 脚本获取 JMeter 变量值的最佳方法。
整个函数应该如下所示:
${__groovy(vars.get('data').contains("Jan"),)}
另请注意,最好使用 JSON Extractor 从 JSON 响应中获取值。