【问题标题】:Set decimal separator for JMeter JavaScript engine为 JMeter JavaScript 引擎设置小数点分隔符
【发布时间】:2021-06-09 18:57:22
【问题描述】:

问题

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

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

传递给脚本的属性:

threads=100
threadPercentageA=0.3
threadPercentageB=0.7

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

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

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

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

我尝试了什么

我试图通过将-Duser.language=en -Duser.country=US -Duser.region=us(以不同的排列方式)添加为变量JMETER_OPTS、JMETER_LANGUAGE 并直接作为命令行参数传递给 JMeter(@ 987654321@)。这些似乎都没有任何效果。

我的想法

在这一点上我的结论是问题发生在评估__javaScript()function 的 JS 引擎中。如果有办法为 JS 引擎设置语言环境,我将能够检查这一点,因此是主题中的问题。

【问题讨论】:

    标签: jmeter


    【解决方案1】:

    使用 __groovy 函数并在乘法之前将值转换为整数/双倍:

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

    【讨论】:

    • 稍作调整,常规方法就奏效了!然而,我最终使用了基于 Dmitri T 回答的 JavaScript 解决方案,因为它最接近我所寻找的。​​span>
    【解决方案2】:

    尝试对您的十进制值使用parseFloat() 函数,例如:

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

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

    还要注意JavaScript engine is removed from the latest JDK/JRE versions,因此如果您的 JMeter 测试中有大量 JavaScript,考虑迁移到 GraalVM 或切换到 __jexl3() 或 __groovy() functions 是有意义的

    【讨论】:

    • 右括号的顺序有语法错误。我认为您的意思是 ${__javaScript(${__property(threads)}*parseFloat(${__property(threadPercentageA)}))}(无法自己编辑 - 编辑太小)。多亏了你找到了一个可行的解决方案:最终使用toFixed() 来获取整数。欣赏有用的链接!
    【解决方案3】:

    JS解决方案

    使用parseFloat(),其中always expects ., regardless of locale:

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

    原创创意致Dmitri T's answer

    常规解决方案

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

    原创想法致user7294900's answer

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

    原来 JMeter 不接受带有小数部分的线程数,即使它是.0。因此,上面的答案包括舍入函数。

    【讨论】:

      猜你喜欢
      • 2017-06-23
      • 1970-01-01
      • 2013-02-19
      • 1970-01-01
      • 2011-12-12
      • 2012-09-05
      • 2013-12-21
      • 1970-01-01
      相关资源
      最近更新 更多