You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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内部按顺序添加以下元件:
    1. 计数器元件:设置引用名称为loopCount,起始值为0,递增1,最大值填${maxRetryCount},勾选「每线程独立计数」
    2. 固定定时器:设置线程延迟为你需要的查询间隔,比如500(单位毫秒),避免频繁查询数据库
    3. 你需要执行的接口请求
    4. 上述修改后的JSR223 Post Processor,在原有代码末尾新增校验逻辑:
      if(!infoValue.isEmpty()) {
          vars.put("infoCheckPass", "true");
      }
      
  • 在While Controller后添加响应断言,校验${infoCheckPass}的值为true,如果循环到最大重试次数后info仍为空,就会标记该线程的请求校验失败

内容的提问来源于stack exchange,提问作者sman

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.04 01:12:00