如何在 JSR223 中的 Groovy 类中使用 JMeter 的内部方法(vars.get() 等)
我在我的JSR223中写入groovy脚本,如下这样的预处理器
546463830
这将返回异常
错误o.a.j.m.m.m.m.j.m.m.jsr223preprocessor:jsr2223脚本中的问题,JSR223预处理器虚拟
javax.script.scriptexception:javax.script.scriptexception:groovy.lang.missingpropertyexception:no of class:vars for类:
556343143
它将运行而没有任何问题。
我的问题:我理解
vars
是jmeter内部API,但我们不能使用
vars.put()
或
vars.gets.get ()
在groovy脚本中使用
class {}
在jmeter中的JSR223采样器/预处理程序中?
[获取输入后的更新1月19日]:
我在Intellij中编写代码,看起来像这样。它运行得很好。
477029922
代码基本上将值放在参数myvar中,因此我可以在HTTP请求采样器中使用它。 我将其复制到Jmeter JSR223预处理程序,然后创建HTTP请求采样器,然后将$ {myvar}放入身体数据
我期望我“ myvar”的值将反映在身体数据中。但是在运行它之后,我在结果树侦听器中看到了参数$ {myvar},而不是值。态i.sstatic.net/ykjzv.jpg“/>
[从2019年7月3日从DMITRY获取输入后]
我使用Intellij并像这样编写代码
463308945
这次,即使Intellij返回了我一个错误
thread中的“ main” main“ java.lang”中的异常。 NullPoInterException:无法在null对象上调用put()
在org.codehaus.groovy.runtime.nullobject.invokemethod(nullobject.java:91)
atrg.codehaus.groovy.runtime.callsite.pogometsclasssite.call(pogometasclasssite.java:43)
在org.codehaus.groovy.runtime.callsite.callsitearray.defaultcall(callitearray.java:47)
在org.codehaus.groovy.runtime.callsite.nullcallsite.call(nullcallsite.java:34)
在org.codehaus.groovy.runtime.callsite.callsitearray.defaultcall(callitearray.java:47)
在org.codehaus.groovy.runtime.callsite.abstractcallsite.call(abractcalcallsite.java:115)
在org.codehaus.groovy.runtime.callsite.abstractcallsite.call(AbstractCallsite.java:135)
在jmeter.parsingjson(jmeter.groovy:21)
在jmeter $ parsingjson.call(未知来源)
在org.codehaus.groovy.runtime.callsite.callsitearray.defaultcall(callitearray.java:47)
在org.codehaus.groovy.runtime.callsite.abstractcallsite.call(abractcalcallsite.java:115)
在org.codehaus.groovy.runtime.callsite.abstractcallsite.call(AbstractCallsite.Java:127)
在runtest.main(jmeter.groovy:38)
基本上,错误是由
global.vars.jmetervars.put引起的(“ myvar”,object.event_id)
[更新] :2019 年 7 月 17 日,来自 user7294900 的输入
我在 IntelliJ 中编写了这样的代码
import groovy.json.JsonSlurper
import org.apache.jmeter.threads.JMeterVariables
class jmeter2 {
JMeterVariables vars;
jmeter2(JMeterVariables vars) {
this.vars = vars;
}
public addvar(String VarName, String value) {
vars.put(VarName, value);
}
def parsingJSON(String fileName) {
def payload = new File(fileName).getText();
def jsonSlurper = new JsonSlurper()
def object = jsonSlurper.parseText(payload)
addvar("myVar", object.event_id)
println("My Var " + vars.get("myVar"))
return object.event_id
}
}
class runTest {
static void main(String[] args) {
JMeterVariables vars = new JMeterVariables();
def running = new jmeter2(vars)
running.parsingJSON( "C:/Users/payload.json")
}
}
它在 Intellij 中运行良好。我只需要向 Intellij 添加一些 jar 依赖项(
slf4j-simple-1.7.2
、
apachejmeter_core
、
logkit-1.2.2
)。IntelliJ 将返回结果。到目前为止一切顺利。
我通过创建
JSR223 采样器
、
调试采样器
和
结果树监听器
,将代码复制粘贴到 JMeter。
我在 Listener 中看不到任何由 JSR223 采样器创建的
myVar
。
JMeter 日志也​​没有显示任何问题
2019-07-17 12:33:15,806 INFO o.a.j.s.SampleEvent:sample_variables 列表:[]
2019-07-17 12:33:15,806 INFO o.a.j.g.u.JMeterMenuBar:setRunning(true,*local*)
2019-07-17 12:33:15,812 INFO o.a.j.e.StandardJMeterEngine:正在启动线程组:1:线程组
2019-07-17 12:33:15,812 INFO o.a.j.e.StandardJMeterEngine:正在为线程组启动 1 个线程。
2019-07-17 12:33:15,812 INFO o.a.j.e.StandardJMeterEngine:出现错误时线程将继续
2019-07-17 12:33:15,812 INFO o.a.j.t.ThreadGroup:正在启动线程组...number=1threads=1ramp-up=1delayedStart=false
2019-07-17 12:33:15,813 INFO o.a.j.t.ThreadGroup:已启动线程组编号 1
2019-07-17 12:33:15,813 INFO o.a.j.e.StandardJMeterEngine:所有线程组均已启动
2019-07-17 12:33:15,813 INFO o.a.j.t.JMeterThread:线程已启动:线程组 1-1
2019-07-17 12:33:15,825 INFO o.a.j.t.JMeterThread:线程已完成:线程组 1-1
2019-07-17 12:33:15,825 INFO o.a.j.t.JMeterThread:线程已完成:线程组 1-1
2019-07-17 12:33:15,825 INFO o.a.j.e.StandardJMeterEngine:通知测试监听器测试结束
2019-07-17 12:33:15,825 INFO o.a.j.g.u.JMeterMenuBar:setRunning(false, *local*)
文件 payload.json 仅包含一个非常简单的json
{
"event_id": "01DE95CRARFQ4X9WEKXACQYHVX",
"event_type": "form_response"
}
我不确定为什么 JMeter 不喜欢这个脚本。 有什么想法吗?谢谢。
如果您希望以最少的更改保持您的代码结构,请考虑引入一个单独的类,其中包含可在 Groovy 脚本中的任何地方访问的静态变量。
类似:
import groovy.json.JsonSlurper
class Global {
static vars = [:]
}
Global.vars.jmeterVars = vars
class jmeter {
def parsingJSON(String fileName) {
def payload = new File(fileName).getText();
def jsonSlurper = new JsonSlurper()
def object = jsonSlurper.parseText(payload)
Global.vars.jmeterVars.put("myVar", object.event_id)
return object.event_id
}
}
def running = new jmeter()
running.parsingJSON("C:/Users/payload.json")
更多信息:
如果要添加变量,则需要将当前
jmetervariables
对象传递给jmeter对象,
以下代码添加变量
aaa
aaa
到现有的jmeter变量
950856631
所以Intellij识别
jmetervariables
您必须添加
apachejmeter_core.jar.jar.jar
文件夹