为JMeter JavaScript引擎设置十进制分隔符



问题

我的JMeter测试使用如下JS表达式计算应该分配给线程组的线程数量:

  • threadsGroupA表达式:${__javaScript(${__property(threads)}*${__property(threadPercentageA)})}
  • threadsGroupB表达式:${__javaScript(${__property(threads)}*${__property(threadPercentageB)})}

传递给脚本的属性:

threads=100
threadPercentageA=0.3
threadPercentageB=0.7

预期结果是:分配给A组的30个线程和分配给B组的70个线程。

这在我的工作站上按预期工作。然而,当我尝试在服务器上运行它时,它不会创建线程,除非我在属性文件中使用逗号作为十进制分隔符

threads=100
threadPercentageA=0,3
threadPercentageB=0,7

我正在寻找一种在任何环境中使用相同属性文件运行测试的方法

我尝试了什么

我试图通过添加-Duser.language=en -Duser.country=US -Duser.region=us(以不同的排列(作为变量JMETER_OPTSJMETER_LANGUAGE,并直接传递给JMeter作为命令行参数(JMeter文档引用(,来强制JVM使用带小数点.的区域设置。这些似乎都没有任何效果。

我的想法

在这一点上,我的结论是问题发生在评估__javaScript()函数的JS引擎中。如果有一种方法可以为JS引擎设置区域设置,我将能够检查这一点,因此出现了主题中的问题。

使用__groovy函数并在相乘前将值强制转换为整数/两倍:

${__groovy(props.get("threads").toInteger() * Double.parseDouble(props.get("threadPercentageB")),)}

尝试使用parseFloat((函数处理十进制值,如:

${__javaScript(${__property(threads)}*parseFloat(${__property(threadPercentageA))})}

如果输出也是十进制的-在JavaScript中有Number.protype.toLocaleString((函数,您可以在其中显式地设置Number对象的区域设置,这样无论在哪里运行,您都可以确信它都会返回句点或逗号。

还要注意,JavaScript引擎已从最新的JDK/JJRE版本中删除,因此,如果您的JMeter测试中有大量JavaScript,则考虑迁移到GraalVM或切换到__jexl3((或__groovy((函数是有意义的

JS解决方案

使用parseFloat((,它总是期望.,而不考虑区域设置:

${__javaScript((${__property(threads)}*parseFloat("${__property(threadPercentageA)}")).toFixed())} 

德米特里·T回答的原始想法的功劳

Groovy解决方案

${__groovy((props.get("threads").toInteger() * Double.parseDouble("${props.get('threadPercentageA')}")).round())}

为用户7294900的答案提供原创创意

关于JMeter线程计数处理的注意事项

事实证明,即使是.0,JMeter也不会接受带小数部分的线程数。因此,上面的答案包括舍入函数。

最新更新