gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 15:34:33 26 4
gpt4 key购买 nike

我像这样在我的 JSR223 PreProcessor 中编写 Groovy 脚本

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")


它将毫无问题地运行。

我的问题:我了解 vars是 JMeter 内部 API,但我们不能使用 vars.put()vars.get()在 Groovy 脚本中使用 class{}在 JMeter 中的 JSR223 采样器/预处理器中?

[在 19 年 7 月 1 日获得输入后更新]:

我在 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")
}
}


该代码基本上将值放入参数 myVar ,因此我可以在我的 HTTP 请求采样器中使用它。
我将其复制粘贴到 JMeter JSR223 PreProcessor,然后创建 HTTP 请求采样器并将 ${myVar} 放入正文数据中

enter image description here

我希望“myVar”的值将反射(reflect)在 Body Data 中。但是在我运行它之后,我在 Result Tree Listener 中看到了参数 ${myVar} ,而不是值。

enter image description here

[在 2019 年 7 月 3 日获得 Dmitry 的意见后更新]

我使用 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")

}
}


这一次,甚至 IntelliJ 都给我一个错误
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)
基本上,错误是由 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 sampler 将代码复制到 JMeter , debug sampler , 和 Results Tree listener .

我看不到任何 myVar由监听器中的 JSR223 采样器创建。

enter image description here

enter image description here

JMeter 日志也​​没有显示任何问题
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*)

文件 有效载荷.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")

更多信息:
  • Groovy Goodness: Variable Scope in Scripts
  • Groovy: Object orientation
  • Top 8 JMeter Java Classes You Should Be Using with Groovy
  • 关于groovy - 如何在JSR223的Groovy类中使用JMeter的内部方法(vars.get()等),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56800860/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com