为何JSR223/BeanShell Sampler中注释内代码会被执行?
JMeter注释中内置函数仍执行的原因及解决办法
核心原因很简单:JMeter对内置函数(以${__XXX}形式调用)的解析时机,早于脚本引擎对注释、条件分支的处理。
具体流程是这样的:
- 当JMeter准备执行JSR223/BeanShell Sampler时,会先对整个脚本内容做预解析——只要是
${}包裹的内容,不管它在注释里、条件分支里还是任何位置,都会被优先解析执行。 - 预解析完成后,JMeter才会把替换后的脚本内容传给对应的脚本引擎(Groovy/BeanShell),这时候脚本引擎才会识别注释、判断条件分支,但此时内置函数已经提前跑完了。
拿你给出的例子来说:
/*${__setProperty(checkProperty, 50)};*/
JMeter在预解析阶段就会执行__setProperty函数,把checkProperty属性设置为50,之后传给脚本引擎的内容已经变成了/*;*/(因为__setProperty函数本身返回空),脚本引擎看到这是注释就跳过,但属性已经被修改了。
类似的,哪怕你把函数放在不满足的条件分支里,比如:
if(false) { ${__setProperty(checkProperty, 50)}; }
JMeter还是会先执行__setProperty,再把代码传给脚本引擎,此时脚本引擎才会判断if(false)跳过分支,但属性已经被设置了。
解决办法
要避免这种情况,不要用${__XXX}的形式调用JMeter内置函数,改用脚本引擎原生的API操作:
- 对于JSR223(推荐用Groovy),直接使用JMeter提供的内置对象:
// 替换__setProperty props.setProperty("checkProperty", "50") // 替换__getProperty def value = props.getProperty("checkProperty") - 对于BeanShell,同样用内置对象操作:
props.setProperty("checkProperty", "50"); String value = props.getProperty("checkProperty");
这样代码只会在脚本引擎执行到对应行的时候才会运行,注释里的代码会被脚本引擎直接忽略,不会提前执行。
内容的提问来源于stack exchange,提问作者valentinvas
相关产品推荐
相关产品推荐

