JMeter使用While Controller验证异步请求数据持久化问题咨询
问题解答
测试方案合理性评估
你的验证思路是合理的,异步持久化存在不可避免的写入延迟,用循环轮询数据库判断目标数据是否落地是通用的异步链路验证方案。你遇到的前置处理器未运行、无日志输出问题,核心是JMeter的执行顺序规则导致的:While Controller的前置处理器只会在循环第一次执行前运行1次,不会随循环迭代重复触发;如果你的循环初始判断条件不成立,整个循环逻辑不会执行,前置处理器也自然不会被调用。
While Controller 数据库持久化验证实现方案
按以下步骤调整即可实现需求:
- 迁移查询逻辑位置:把原来写在前置处理器中的数据库查询代码,迁移到While Controller内部的JSR223 取样器中,JSR223取样器会在每次循环迭代时执行,完全匹配轮询查库的需求。
- 配置循环规则:设置While Controller的循环条件为
${__jexl3(${info} == <null> || ${info} == "",)},只要查询到的info字段为空就持续循环;同时配置最大循环次数(建议1020次),在循环内部加固定定时器休眠5001000ms,既匹配异步持久化的延迟区间,也能避免写入失败时出现死循环。 - 优化代码逻辑:新增空判断避免查不到数据时抛出空指针异常,调整后的参考代码如下:
MFG mfgRepo = new MFG(); log.info("device {}", vars.get("deviceID")); long crashTime= Long.parseLong(vars.get('p1')); String deviceId1=vars.get('deviceID'); log.info("the crashtime is {}",crashTime); List<Map<String,Object>> dbItem = mfgRepo.getItemFromDB("TEST",deviceId1,crashTime); String info = ""; // 新增空校验逻辑 if(dbItem != null && !dbItem.isEmpty()){ info = dbItem.get(0).getOrDefault("info", "").toString(); } // 将查询结果存入变量供循环条件判断 vars.put("info", info);
- 并发场景适配:并发测试时要保证每个线程的
deviceID、p1变量独立隔离,避免不同线程的查询条件互相干扰,导致验证结果错误。
内容的提问来源于stack exchange,提问作者sman
相关产品推荐
相关产品推荐

