如何在JSR223

问题描述 投票:0回答:2

我在我的JSR223预处理程序中写入凹陷的脚本

import groovy.json.JsonSlurper;

class jmeter {

   
    def parsingJSON(String fileName){
        def payload = new File(fileName).getText();
        def jsonSlurper = new JsonSlurper()
        def object = jsonSlurper.parseText(payload)

        vars.put("myVar",  object.event_id)

        return object.event_id
    }
}

		def running = new jmeter()
        running.parsingJSON( "C:/Users/payload.json")

这个将返回例外

ERROR o.a.j.m.JSR223PreProcessor: Problem in JSR223 script, JSR223 PreProcessor Dummy
javax.script.ScriptException: javax.script.ScriptException: groovy.lang.MissingPropertyException: No such property: vars for class: jmeter

但是当我删除课时,所以看起来像这样

import groovy.json.JsonSlurper;

    def parsingJSON(String fileName){
        def payload = new File(fileName).getText();
        def jsonSlurper = new JsonSlurper()
        def object = jsonSlurper.parseText(payload)

        vars.put("myVar",  object.event_id)

        return object.event_id
    }
    
        parsingJSON( "C:/Users/payload.json")

它将运行没有任何问题。

我的问题:我理解Jmeter是内部API,但是我们不能在JSR223 Sampler / Jmeter中使用

vars

使用

vars.put()
在groovy脚本中使用
vars.get()
[获得输入后的更新1月19日]:

我在Intellij中编写代码,看起来像这样。它运行得很好。

class{}

代码基本上将值放在参数myvar上,因此我可以在HTTP请求采样器中使用它。
我将其复制到Jmeter JSR223预处理程序,然后创建HTTP请求采样器,然后将$ {myvar}放入身体数据

我期望“ myvar”的价值将反映在身体数据中。但是在运行它之后,我在结果树侦听器中看到了参数$ {myvar},而不是值。

enter image description here

[从2019年7月3日获得DMITRY输入后的更新]enter image description here 我使用Intellij并像这样编写代码

import groovy.json.JsonSlurper import org.apache.jmeter.threads.JMeterVariables class jmeter { JMeterVariables vars; jmeter(JMeterVariables vars) { this.vars = vars; } def parsingJSON(String fileName){ def payload = new File(fileName).getText(); def jsonSlurper = new JsonSlurper() def object = jsonSlurper.parseText(payload) vars.put("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 jmeter(vars) running.parsingJSON( "C:/Users/payload") } }

这个时间,甚至Intellij都会返回我一个错误
import groovy.json.JsonSlurper import org.apache.jmeter.threads.JMeterVariables 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) //This will return java.lang.NullPointerException: Cannot invoke method put() on null object println("My Var " + vars.get("myVar")) return object.event_id } } class runTest { static void main(String[] args) { def running = new jmeter() running.parsingJSON( "C:/Users/payload") } }

基本上,误差是由

Exception in thread "main" java.lang.NullPointerException: Cannot invoke method put() on null object at org.codehaus.groovy.runtime.NullObject.invokeMethod(NullObject.java:91) at org.codehaus.groovy.runtime.callsite.PogoMetaClassSite.call(PogoMetaClassSite.java:43) at org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCall(CallSiteArray.java:47) at org.codehaus.groovy.runtime.callsite.NullCallSite.call(NullCallSite.java:34) at org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCall(CallSiteArray.java:47) at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:115) at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:135) at jmeter.parsingJSON(jmeter.groovy:21) at jmeter$parsingJSON.call(Unknown Source) at org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCall(CallSiteArray.java:47) at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:115) at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:127) at runTest.main(jmeter.groovy:38)

引起的

[更新]:2019年7月17日,来自用户7294900的输入

i在Intellij
中写了这样的代码

Global.vars.jmeterVars.put("myVar", object.event_id)

它在Intellij中的工作状态非常好。我只需要在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") } }
slf4j-simple-1.7.2
apachejmeter_core

)中添加一些JAR依赖项即可。 Intellij将返回结果。到目前为止,一切都很好。

我通过创建

logkit-1.2.2
JSR223 sampler
debug sampler
将代码粘贴到jmeter中。

我看不到听众中JSR223采样器创建的任何

Results Tree listener

Jmeter日志也没有显示任何问题enter image description here

myVar

enter image description here文件

payload.json

仅包含一个非常简单的json

2019-07-17 12:33:15,806 INFO o.a.j.s.SampleEvent: List of 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: Starting ThreadGroup: 1 : Thread Group 2019-07-17 12:33:15,812 INFO o.a.j.e.StandardJMeterEngine: Starting 1 threads for group Thread Group. 2019-07-17 12:33:15,812 INFO o.a.j.e.StandardJMeterEngine: Thread will continue on error 2019-07-17 12:33:15,812 INFO o.a.j.t.ThreadGroup: Starting thread group... number=1 threads=1 ramp-up=1 delayedStart=false 2019-07-17 12:33:15,813 INFO o.a.j.t.ThreadGroup: Started thread group number 1 2019-07-17 12:33:15,813 INFO o.a.j.e.StandardJMeterEngine: All thread groups have been started 2019-07-17 12:33:15,813 INFO o.a.j.t.JMeterThread: Thread started: Thread Group 1-1 2019-07-17 12:33:15,825 INFO o.a.j.t.JMeterThread: Thread is done: Thread Group 1-1 2019-07-17 12:33:15,825 INFO o.a.j.t.JMeterThread: Thread finished: Thread Group 1-1 2019-07-17 12:33:15,825 INFO o.a.j.e.StandardJMeterEngine: Notifying test listeners of end of test 2019-07-17 12:33:15,825 INFO o.a.j.g.u.JMeterMenuBar: setRunning(false, *local*)

我不确定为什么Jmeter不喜欢脚本。 有什么想法吗? 谢谢。

如果您想以最小的更改来保持代码结构,请考虑引入单独的类持有静态变量,在脚本脚本中,这些变量在任何地方都可以访问。 
thim,例如:
{ "event_id": "01DE95CRARFQ4X9WEKXACQYHVX", "event_type": "form_response" }

更多信息:

groovy jmeter jsr223
2个回答

0
投票
您将不得不从Jmeter的Lib XT文件夹中添加

import org.apache.jmeter.threads.JMeterVariables; class jmeter { JMeterVariables vars; jmeter(JMeterVariables vars) { this.vars = vars; } public addvar() { vars.put("aaa","bbb"); } } def running = new jmeter(vars); running.addvar();

    

最新问题
© www.soinside.com 2019 - 2025. All rights reserved.