Jmeter中If Controller的JEXL3条件未正确评估问题求助
JMeter循环执行问题解决方案
问题根源
- If Controller的JEXL3条件写法错误,无法正确解析动态拼接的
_skip标记变量,导致判断失效 - While Controller仅以
matches == 5作为退出条件,未考虑是否还有未处理的MultitrackerId,提前终止测试 - JSR223 Postprocessor未做重复计数校验,可能导致matches变量被重复递增
具体修复步骤
1. 修正If Controller的JEXL3条件
替换原条件为以下表达式,直接通过JMeter内置vars对象动态读取变量值:
${__jexl3(!vars.get("MultitrackerId_" + vars.get("counter") + "_skip") ?: false,)}
逻辑说明:
- 动态拼接目标变量名:
MultitrackerId_${counter}_skip - 若变量不存在(未标记跳过),返回
true执行请求;若变量值为true,返回false跳过请求
2. 调整While Controller退出条件
同时判断两个终止条件,避免提前结束测试:
${__jexl3(${matches} < 5 || ${counter} <= ${MultitrackerId_matchNr},)}
逻辑说明:只要matches未达到5,或仍有未处理的MultitrackerId,就继续循环
3. 优化JSR223 Postprocessor逻辑
添加重复计数校验,确保每个成功的MultitrackerId仅递增一次matches:
def response = prev.getResponseDataAsString() if (response.contains("SUCCESSFUL")) { def trackerKey = "MultitrackerId_" + vars.get("counter") def currentId = vars.get(trackerKey) // 标记该ID为已处理 vars.put(trackerKey + "_skip", "true") // 避免重复计数 if (!vars.get("counted_" + currentId)) { def currentMatches = vars.get("matches") ?: "0" vars.put("matches", String.valueOf(Integer.parseInt(currentMatches) + 1)) vars.put("counted_" + currentId, "true") } }
4. 完善Counter循环逻辑
在While Controller末尾添加JSR223 Sampler,实现Counter的循环重置:
def maxCount = Integer.parseInt(vars.get("MultitrackerId_matchNr") ?: "0") def currentCounter = Integer.parseInt(vars.get("counter") ?: "1") if (currentCounter > maxCount) { vars.put("counter", "1") }
确保Counter超过最大值后重置为1,继续处理未成功的MultitrackerId
验证方法
添加Debug Sampler和View Results Tree,监控以下变量:
matches:确认仅在新的成功响应时递增counter:确认循环重置正常MultitrackerId_*_skip:确认已成功的ID被标记为true且不再执行对应请求
内容的提问来源于stack exchange,提问作者Daniel Cataño
相关产品推荐
相关产品推荐

