如何基于条件更新数组值并在JMeter中模拟Chrome报表请求重试逻辑
JMeter模拟Chrome报表请求循环逻辑实现
需求说明
我们需要模拟Chrome的报表请求行为:
- 首次运行:基于
matchNr计数遍历报表数组,一次性发送所有报表请求(请求结构一致,仅请求体中的报表名称不同) - 后续循环:每间隔10秒,仅发送上一轮未完成的报表请求,请求数量逐轮递减或保持不变
- 注意:不同用户的报表数量不固定,无法设置固定值
JMeter实现步骤
1. 提取报表名称列表
通过前置处理器(如JSON Extractor)从接口响应中提取所有报表名称:
- 设置
Match No.为-1,自动生成:${reportNames_matchNr}:存储报表总数量${reportNames_1}、${reportNames_2}...:存储单个报表名称
2. 首次批量发送请求
添加For Each Controller遍历所有报表:
- 配置参数:
- 输入变量前缀:
reportNames - 开始索引:
1 - 结束索引:
${reportNames_matchNr} - 输出变量名称:
currentReport
- 输入变量前缀:
- 在控制器下添加HTTP请求,请求体中引用
${currentReport}作为报表名称参数 - 为请求添加响应断言,将请求完成状态存入变量(如
report_${currentReport}_status,值为success或failed)
3. 循环重试未完成请求
添加While Controller实现循环重试,条件设为${__jexl3(${unfinishedCount} > 0,)}:
- 控制器内依次添加以下组件:
- 固定定时器:设置延迟10秒,控制重试间隔
- 用户定义变量:初始化
unfinishedCount为0,用于统计本轮未完成请求数 - For Each Controller:遍历所有报表,配置同首次请求
- If控制器:条件设为
${__jexl3("${report_${currentReport}_status}" != "success",)},仅处理未完成请求 - HTTP请求:复用首次请求的配置,请求体引用
${currentReport} - 响应断言:更新对应报表的状态变量
- JSR223后置处理器:统计未完成请求数,脚本示例:
def reportStatus = vars.get("report_${vars.get('currentReport')}_status") if (reportStatus != "success") { def count = Integer.parseInt(vars.get("unfinishedCount")) vars.put("unfinishedCount", String.valueOf(count + 1)) }
关键注意事项
- 用
__escapeOgnl()函数转义报表名称中的特殊字符,避免变量解析错误 - 响应断言逻辑要和实际业务中"请求完成"的定义一致(如状态码、响应字段)
- 可给
While Controller添加最大重试次数限制,避免无限循环(比如条件改为${__jexl3(${unfinishedCount} > 0 && ${retryCount} < 5,)},配合递增retryCount变量)
内容的提问来源于stack exchange,提问作者user20497679
相关产品推荐
相关产品推荐

