JMeter响应体多值匹配与并行请求迭代逻辑咨询
从响应体提取参数并实现JMeter并行请求解决方案
一、正则匹配与迭代逻辑修正
你的Groovy脚本核心思路可行,但存在关键逻辑错误:if (matcher) 的判断方式不对,Groovy中Matcher对象本身始终为true,需用 matcher.find() 确认是否匹配到目标内容。另外迭代时建议增加空值判断,避免无效循环。
修正后的脚本如下:
def i = 1 def results = [] while (true) { def match = vars.get("accountInfo_" + i) // 终止条件:变量不存在或为空 if (!match) { break } // 正则匹配pa与pz间的数字、pxResults()内的参数 def paPzPattern = /pa(\d+)pz\.pxResults\((\d+)\)/ def matcher = (match =~ paPzPattern) if (matcher.find()) { def paNumber = matcher.group(1) def pxResultNumber = matcher.group(2) // 按需求组合格式,可直接生成请求所需参数串 def requestParam = "pa${paNumber}_pxResult(${pxResultNumber})" results.add(requestParam) log.info("已提取参数组合:${requestParam}") } i++ } // 将结果存入JMeter变量,供后续并行控制器使用 vars.put("parallelRequestList", results.join(",")) // 返回结果用于调试 return results.join(', ')
二、与Parallel Controller结合实现并行请求
1. 前置配置
- 确保接口请求的正则表达式提取器中,
Match No.设置为-1,让JMeter自动生成accountInfo_1、accountInfo_2... 等批量变量,供脚本迭代读取。 - 将上述修正后的Groovy脚本放入接口请求的 JSR223 PostProcessor 中。
2. 并行请求配置
- 添加 Parallel Controller,在设置里把「最大并行数」设为
6。 - 在Parallel Controller内添加 ForEach Controller:
- 输入变量前缀:
request_ - 输出变量名称:
currentRequest - 勾选「忽略第一个空值」
- 输入变量前缀:
- 给ForEach Controller内的AJAX请求添加 JSR223 PreProcessor,拆分当前参数:
def pattern = /pa(\d+)_pxResult\((\d+)\)/ def matcher = (vars.get("currentRequest") =~ pattern) if (matcher.find()) { vars.put("paNumber", matcher.group(1)) vars.put("pxResultNumber", matcher.group(2)) } - 在AJAX请求中,直接用
${paNumber}和${pxResultNumber}填充所需参数即可。
3. 参数拆分辅助
在测试计划开头添加 User Defined Variables,或在Groovy脚本后加 JSR223 PostProcessor,用JMeter内置逻辑拆分参数列表:
// 拆分逗号分隔的参数列表为批量变量 def requestList = vars.get("parallelRequestList") if (requestList) { def requests = requestList.split(',') for (int j = 0; j < requests.length; j++) { vars.put("request_${j+1}", requests[j].trim()) } }
这样ForEach Controller就能遍历所有提取到的参数组合,在Parallel Controller中最多同时运行6个AJAX请求,满足并行需求。
内容的提问来源于stack exchange,提问作者Alexander Huynh
相关产品推荐
相关产品推荐

