Groovy JSR223 Sampler中Counter变量无法递增问题咨询
问题分析与解决方案
为什么JSR223 Sampler里的Counter变量不递增?
你碰到的这个问题,核心是JSR223和BeanShell的变量解析机制差异导致的:
- JSR223 Sampler默认开启了「Cache compiled script if available」(脚本预编译),当你直接写
log.info(${idx});时,JMeter会在第一次编译脚本的阶段就把${idx}替换成初始值0,之后每次循环执行的都是已经编译好、硬编码了0的脚本,所以日志里一直显示0。 - BeanShell Sampler则是每次循环都会重新解析并执行脚本,每次都会读取当前最新的
idx变量值,所以能正常显示递增的数字。
解决方法(按推荐程度排序)
使用JMeter内置
vars对象获取变量(最推荐,性能最优)
在JSR223 Sampler里替换成以下代码:log.info(vars.get("idx"));vars是JMeter提供的内置对象,专门用来访问当前线程的变量,每次调用vars.get("idx")都会实时获取最新的变量值,完全不受预编译影响。关闭JSR223的脚本缓存(不推荐,影响性能)
如果你坚持想用${idx}的写法,可以找到JSR223 Sampler的「Cache compiled script if available」选项,取消勾选。这样JMeter每次循环都会重新解析脚本,${idx}会被替换成当前的变量值,但这种方式会降低脚本执行效率,高并发场景下不建议用。通过参数传递变量值
在JSR223 Sampler的「Parameters」输入框中填写${idx},然后在脚本里通过args数组获取:log.info(args[0]);这种方式也能实时拿到最新的变量值,同时不影响脚本预编译的性能。
内容的提问来源于stack exchange,提问作者SourMonk
相关产品推荐
相关产品推荐

