Как использовать внутренние методы JMeter (vars.get () и т. Д.) В классе Groovy в JSR223 - PullRequest
2 голосов
/ 28 июня 2019

Я пишу Groovy-скрипт в моем препроцессоре 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")

Он будет работать без проблем.

Мой вопрос: я понимаю, vars является внутренним API JMeter, но нельзя ли использовать vars.put() или vars.get() в скрипте Groovy, используя class{} в JSR223 Sampler / PreProcessor в JMeter?

[ОБНОВЛЕНИЕ после получения ввода 1 июля 19]:

Я пишу коды в 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 Sampler Request. Я копирую и вставляю его в JMeter JSR223 PreProcessor, затем создаю сэмплер HTTP-запроса и помещаю $ {myVar} в данные тела

enter image description here

Я предполагаю, что значение myVar будет отражено в данных тела. Но после запуска я вижу параметр $ {myVar} в Result Tree Listener вместо значения.

enter image description here

[ОБНОВЛЕНИЕ после получения информации от Дмитрия 3 июля 2019 года]

Я использую 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)

[ОБНОВЛЕНИЕ]: 17 июля 2019 года, введено пользователем 7294900

Я написал такой код в 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. Мне просто нужно добавить некоторые зависимости jar в Intellij (slf4j-simple-1.7.2, apachejmeter_core, logkit-1.2.2). IntelliJ вернет результат. Все идет нормально.

Я скопировал и вставил код в JMeter, создав JSR223 sampler, 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*)

Файл payload.json содержит только очень простой JSON

{
"event_id": "01DE95CRARFQ4X9WEKXACQYHVX",
"event_type": "form_response"
}

Я не уверен, почему JMeter не нравится сценарий. Любая идея может быть? Благодарю.

Ответы [ 2 ]

0 голосов
/ 01 июля 2019

Если вы хотите добавить переменную (и), вам нужно передать текущий объект JMeterVariables в объект jmeter,

Следующий код добавляет переменную aaa к существующим переменным JMeter

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();

Чтобы Intellij распознал JMeterVariables, вам нужно будет добавить ApacheJMeter_core.jar из папки lib \ ext JMeter

0 голосов
/ 01 июля 2019

Если вы хотите сохранить структуру кода с минимальными изменениями, подумайте о введении отдельного класса, содержащего статические переменные, который будет доступен везде в вашем скрипте 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")

Дополнительная информация:

...