问题描述
问题
任何人都知道为什么我可以将常规的闭包保存到JMeter公开的props哈希表中,而不是常规的函数吗?
最小示例
在测试计划中,在线程组中,在脚本语言为Groovy 3.0.3的JSR223采样器中,我有以下最小的失败示例(在粘贴到Jmeter GUI的“脚本”框中或从引用时都失败)文件名“ 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 : How to initialize map once and share it for all threads in a thread group
- Jmeter - declare array variable in one JSR223 Sampler in order to access it in another JSR223 Sampler
- 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
仅使用method pointer operator bernoulli
将.&
函数转换为闭包。