JMeter PreProcessor生成变量分布式测试部分节点不生效问题
问题原因分析
1. 部分压测节点缺失依赖包
你代码中使用了org.apache.commons.lang3.RandomStringUtils类,这个类属于Apache Commons Lang3第三方依赖包,并不在JMeter的默认依赖中:
- 本地GUI环境因为你已经手动导入了该jar包,所以代码可以正常执行生成变量
- 分布式运行时,部分slave节点的JMeter
lib/lib/ext目录下没有放置该依赖包,导致PreProcessor代码执行抛出类找不到异常,vars.putObject逻辑没有执行,变量未定义,JMeter就会直接输出${testId1}、${testId2}的字面量
2. 前置处理器作用域/执行顺序配置错误
首次运行变量直接显示字面量、仅部分场景正常,大概率是PreProcessor的挂载位置不符合预期:
- 如果你把PreProcessor挂载到了某一个取样器下,那么只有该取样器执行前才会触发变量生成逻辑,排在它前面的请求无法获取到变量
- 如果你把PreProcessor放在了
setUp线程组中,setUp线程组生成的变量属于该线程组局部,普通业务线程组无法直接读取,首次运行时就会出现变量未定义的情况 - GUI模式下多次运行正常,可能是因为JMeter线程复用后残留了上一次运行生成的变量,属于异常巧合,不是逻辑正确的表现
3. 分布式执行逻辑差异
JMeter分布式测试的执行逻辑是每个slave节点独立运行完整测试计划,master节点只负责下发测试计划和汇总结果:
- 如果你是在master本地生成变量再推送的逻辑是无效的,每个slave都需要自己执行PreProcessor生成变量
- 部分节点如果配置了线程数为0、或测试计划在该节点的执行顺序异常,也会导致变量未生成
修复建议
- 所有slave节点的JMeter
lib目录下都放入commons-lang3对应版本的jar包,重启slave进程 - 将生成变量的JSR223 PreProcessor挂载到目标请求的**同级或父级(线程组/测试计划)**层级,确保所有需要用到变量的请求执行前,都会先执行变量生成逻辑
- 字符串类型变量直接使用
vars.put("testId1", testId1)存储即可,不需要用putObject,降低变量读取异常概率
内容的提问来源于stack exchange,提问作者sman
相关产品推荐
相关产品推荐

