Я пишу 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} в данные тела
Я предполагаю, что значение myVar будет отражено в данных тела. Но после запуска я вижу параметр $ {myVar} в Result Tree Listener вместо значения.
[ОБНОВЛЕНИЕ после получения информации от Дмитрия 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 в Слушателе.
Журнал 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 не нравится сценарий.
Любая идея может быть? Благодарю.