JMeter条件执行问题:如何按金额匹配关联合同ID并传递?
解决方案:从多组JSON结果中匹配指定金额并提取合同ID
方案一:使用JSON Extractor(新手友好,无需代码)
这是JMeter自带的工具,适合快速实现简单的JSON提取逻辑:
- 在返回目标JSON响应的采样器上右键 → 添加 → 后置处理器 → JSON Extractor
- 配置以下参数:
- 引用名称:
target_contractid(后续请求用这个变量名调用) - JSON Path表达式:
$..[?(@.costAmount == 677666.00)].contractid- 解释:
$..遍历响应中所有层级的节点,[?(@.costAmount == 677666.00)]筛选出costAmount等于指定值的对象,最后提取该对象的contractid
- 解释:
- 匹配数字:
1(只取第一个符合条件的结果) - 默认值:可填
NOT_FOUND(方便排查未找到匹配项的情况)
- 引用名称:
- 后续请求中直接用
${target_contractid}引用提取到的合同ID即可
方案二:使用JSR223 PostProcessor(灵活适配复杂逻辑)
如果JSON结构特殊或需要更复杂的判断,用Groovy脚本实现更可靠(Groovy性能远优于BeanShell):
- 在目标采样器上右键 → 添加 → 后置处理器 → JSR223 PostProcessor
- 语言选择框中选
Groovy - 在脚本输入框粘贴以下代码:
import groovy.json.JsonSlurper // 获取采样器的响应文本 def responseText = prev.getResponseDataAsString() def jsonParser = new JsonSlurper() def jsonResults = jsonParser.parseText(responseText) // 遍历结果集,找到costAmount匹配的项 def matchedContract = jsonResults.find { item -> item.costAmount == 677666.00 } // 若找到匹配项,将contractid存入JMeter变量 if (matchedContract != null) { vars.put("target_contractid", matchedContract.contractid.toString()) }
- 后续请求同样通过
${target_contractid}调用变量
你之前方案失败的可能原因
- If控制器未触发:大概率是条件表达式类型不匹配。JMeter变量默认是字符串,直接用
${costAmount} == 677666.00属于字符串和数字比较,永远不成立。需要转成数字后比较,比如用__groovy(Double.parseDouble(vars.get("costAmount")) == 677666.00,)作为If控制器的条件。 - BeanShell后置处理器问题:BeanShell解析JSON的代码繁琐,且类型转换容易出错,比如未正确解析响应就提取字段,导致变量为空,后续逻辑无法执行。
内容的提问来源于stack exchange,提问作者Farhan Meer
相关产品推荐
相关产品推荐

