JMeter Post Processor取值异常及While Controller数据库校验方案咨询
变量不更新问题的诱因
你使用的是JMeter的JSR223类Post Processor,这类组件默认开启脚本编译缓存机制:当你直接用${变量名}语法在脚本中嵌入变量时,变量的取值会在脚本第一次编译时就被硬编码写入缓存的脚本中,后续所有执行都会复用这份缓存脚本,不会再读取最新的动态变量值,因此始终显示首次请求的数值。
正确的变量引用方式是使用JMeter内置的vars对象读取变量,修改后的代码如下:
import test.MFG MFG mfgRepo = new MFG(); String deviceID = vars.get("deviceID"); log.info("device {}", deviceID); long crashTime= Long.parseLong(vars.get("p1")); String deviceId1 = deviceID; log.info("the crashtime is {}",crashTime); List<Map<String,Object>> dbItem = mfgRepo.getItemFromDB("TEST",deviceId1,crashTime); String infoValue = dbItem.get(0).get("info") == null ? "" : dbItem.get(0).get("info").toString(); log.info("The item is {}", infoValue); // 把info值存入JMeter变量供后续校验使用 vars.put("dbInfo", infoValue);
While Controller实现非空校验的方案
按照以下步骤配置即可在Concurrency Thread Group下实现每个请求的info值非空校验:
- 首先新增两个自定义变量:在测试计划或者线程组下添加「用户定义的变量」元件,新增
infoCheckPass初始值为false,maxRetryCount初始值为你需要的最大重试次数,比如10 - 在需要校验的请求前添加While Controller,设置Condition(条件)为:
${__jexl3(${infoCheckPass} == false && ${__intSum(${loopCount},0)} < ${maxRetryCount},)} - 在While Controller内部按顺序添加以下元件:
- 计数器元件:设置引用名称为
loopCount,起始值为0,递增1,最大值填${maxRetryCount},勾选「每线程独立计数」 - 固定定时器:设置线程延迟为你需要的查询间隔,比如
500(单位毫秒),避免频繁查询数据库 - 你需要执行的接口请求
- 上述修改后的JSR223 Post Processor,在原有代码末尾新增校验逻辑:
if(!infoValue.isEmpty()) { vars.put("infoCheckPass", "true"); }
- 计数器元件:设置引用名称为
- 在While Controller后添加响应断言,校验
${infoCheckPass}的值为true,如果循环到最大重试次数后info仍为空,就会标记该线程的请求校验失败
内容的提问来源于stack exchange,提问作者sman
相关产品推荐
相关产品推荐

