开发者问题收集

如何在 JSR223 中的 Groovy 类中使​​用 JMeter 的内部方法(vars.get() 等)

2019-06-28
7743

我在我的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.2apachejmeter_corelogkit-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 不喜欢这个脚本。 有什么想法吗?谢谢。

2个回答

如果您希望以最少的更改保持您的代码结构,请考虑引入一个单独的类,其中包含可在 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")

更多信息:

Dmitri T
2019-07-01

如果要添加变量,则需要将当前 jmetervariables 对象传递给jmeter对象,

以下代码添加变量 aaa aaa 到现有的jmeter变量

950856631

所以Intellij识别 jmetervariables 您必须添加 apachejmeter_core.jar.jar.jar 文件夹

Ori Marko
2019-07-01