为什么我可以将时髦的闭包保存到 JMeter 的暴露道具哈希表而不是时髦函数?



问题

有人知道为什么我可以将groovy闭包保存到JMeter的公开道具Hashtable,而不保存groovy函数吗?

最小示例

在一个测试计划中,在一个线程组中,在使用脚本语言Groovy 3.0.3的JSR223采样器中,我有以下最小失败示例(当粘贴到Jmeter GUI中的"script"框中或从文件名"test.Groovy"引用时都失败(:

def bern = { p -> Math.random() < p }
props.put("bern", bern)
closure = props.get("bern")
log.warn("props closure call: " + closure(1.0))
def bernoulli (double p) {
Math.random() < p
}
props.put("bernoulli", bernoulli)
funct = props.get(bernoulli)
log.warn("props function call: " + funct(1.0))

以下是我的预期输出(在JMeter日志查看器中(

props closure call: true
props function call: true

这是我得到的的日志输出

props closure call: true
...text
Problem in JSR223 script JSR223 Sampler, message: javax.script.ScriptExecution: 
groovy.lang.MissingPropertyException: No such property bernoulli for class:
Script<jmeter generated groovy script number> ...

相关

Jmeter:如何初始化映射一次并为线程组中的所有线程共享它
  • Jmeter-在一个JSR223采样器中声明数组变量,以便在另一个JSR223Sampler中访问它
  • https://mrhaki.blogspot.com/2009/08/groovy-goodness-turn-methods-into.html
  • 您可以使用以下语法将函数存储到props中:

    // def props = [:]
    def bernoulli (double p) {
    Math.random() < p
    }
    props.put("bernoulli", this.&bernoulli)
    funct = props.get("bernoulli")
    println funct(1.0)
    

    表达式this.&bernoulli只是使用方法指针运算符.&bernoulli函数转换为闭包。

    最新更新