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

为何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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 03:10:11