关于groovy:使用jar文件+动态值进入循环计数器-Jmeter

use jar file + Dynamic values into the loop counter - Jmeter

我想使用以下改进版本:
我如何使用jar文件进入循环计数器-Jmeter

// jar数据

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
public class PabBDetailsIncluded {

public static String ARGENTINA(String sourceAccount)
    {
        String a =
               "{"
                +"\"money\": {"
                +"\"amount\": 10,"
                +"\"currency\": \"EUR\""
                +"},"

                +"\"description\": \"Payment\","
                +"\"sourceAccount\":" + sourceAccount +","



                +"}"
                +"}";

        return a;
        }

1)以上数据我想"喂" Jmeter电话

我想在执行过程中传递'sourceAccount',而不是将所有值从jar文件中获取为静态值,而不是将其硬编码到jar文件中。

2)我告诉循环计数器用:$ {__ groovy(com.example.TestData.getDeclaredMethods()。size(),)}

3)进入JSR223预处理器的"脚本"区域是这样的:

1
2
3
4
5
6
7
8
9
10
    import com.example.PabBDetailsIncluded;

def sourceAccount = vars.get("accountNumberLogger");


def testData = new com.example.PabBDetailsIncluded()
def methods = testData.class.getDeclaredMethods(sourceAccount)
def payload = org.apache.commons.lang.reflect.MethodUtils.invokeExactMethod(testData, methods[vars.get('__jm__Loop Controller__idx') as int].getName())
sampler.addNonEncodedArgument('',payload,'')
sampler.setPostBodyRaw(true)

我得到的错误是:

2019-11-13 09:55:00,099错误oajmJSR223PreProcessor:JSR223脚本,JSR223 PreProcessor1 javax.script.ScriptException中的问题:groovy.lang.MissingMethodException:无方法签名:静态com.example.PabBDetailsIncluded.getDeclaredMethods()适用对于参数类型:(java.lang.String)值:[5001000001573300]在org.codehaus.groovy.jsr223.GroovyScriptEngineImpl.eval(GroovyScriptEngineImpl.java:320)?[groovy-all-2.4.13.jar:2.4.13 ]在org.codehaus.groovy.jsr223.GroovyCompiledScript.eval(GroovyCompiledScript.java:72)?[groovy-all-2.4.13.jar:2.4.13]在javax.script.CompiledScript.eval(未知来源)?[ ?:1.8.0_231],位于org.apache.jmeter.util.JSR223TestElement.processFileOrScript(JSR223TestElement.java:221)?[ApacheJMeter_core.jar:4.0 r1823414],位于org.apache.jmeter.modifiers.JSR223PreProcessor.process(JSR223PreProcessor.java :44)[ApacheJMeter_components.jar:4.0 r1823414],位于org.apache.jmeter.threads.JMeterThread.runPreProcessors(JMeterThread.java:849)[Apach eJMeter_core.jar:4.0 r1823414],位于org.apache.jmeter.threads.JMeterThread.executeSamplePackage(JMeterThread.java:467)[ApacheJMeter_core.jar:4.0 r1823414],位于org.apache.jmeter.threads.JMeterThread.processSampler(JMeterThread.java :416)[org.apache.jmeter.threads.JMeterThread.run(JMeterThread.java:250)的[ApacheJMeter_core.jar:4.0 r1823414] [java.lang.Thread.run的[ApacheJMeter_core.jar:4.0 r1823414](未知来源) [?:1.8.0_231]原因:groovy.lang.MissingMethodException:没有方法签名:静态com.example.PabBDetailsIncluded.getDeclaredMethods()适用于参数类型:(java.lang.String)值:[5001000001573300] at groovy.lang.MetaClassImpl.invokeStaticMissingMethod(MetaClassImpl.java:1501)?[groovy-all-2.4.13.jar:2.4.13] at groovy.lang.MetaClassImpl.invokeStaticMethod(MetaClassImpl.java:1487)?[groovy-all -2.4.13.jar:2.4.13]在org.codehaus.groovy.runtime.callsite.StaticMetaClassSite.call(StaticMetaClassSite.java:53)?[groovy-all-2.4.13.jar:2.4.13 ]在org.codehaus.groovy.runtime.callsite.AbstractCallSite上的[groovy-all-2.4.13.jar:2.4.13]在org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCall(CallSiteArray.java:48) .call(AbstractCallSite.java:113)?[groovy-all-2.4.13.jar:2.4.13]在org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:125)?[groovy- all-2.4.13.jar:2.4.13] at Script26.run(Script26.groovy:13)?[?:?] at org.codehaus.groovy.jsr223.GroovyScriptEngineImpl.eval(GroovyScriptEngineImpl.java:317)?[ groovy-all-2.4.13.jar:2.4.13] ...还有9个

如果我使用jar文件中的数据而没有动态值,则一切正常。

任何帮助,将不胜感激。


这与您使用静态函数的原因有所不同,因为静态函数的调用方式有所不同。

而且,现在您需要将参数传递给函数,而我看不到要在哪里传递该参数。

您的代码需要修改为如下所示:

1
2
3
4
def sourceAccount = vars.get("accountNumberLogger")
def testData = new com.example.PabBDetailsIncluded()
def methods = testData.class.getMethods()
def payload = methods[vars.get('__jm__Loop Controller__idx') as int].invoke(testData, sourceAccount)

演示:

enter image description here

参考文献:

  • Method.invoke()
  • Java:反射API
  • Apache Groovy-为什么以及如何使用它