jmeter-java-dsl icon indicating copy to clipboard operation
jmeter-java-dsl copied to clipboard

jmx2dsl fails for jmx tests with include controllers

Open andy-tarr opened this issue 3 years ago • 4 comments

Attached jmx file has a TG and include controller (xml below) but using jmx2dsl fails with this stack trace: java -jar jmx2dsl.jar include.jmx Exception in thread "main" java.lang.NoClassDefFoundError: kg/apc/charting/GraphPanelChart at java.base/java.lang.ClassLoader.defineClass1(Native Method) at java.base/java.lang.ClassLoader.defineClass(ClassLoader.java:1017) at java.base/java.security.SecureClassLoader.defineClass(SecureClassLoader.java:151) at java.base/jdk.internal.loader.BuiltinClassLoader.defineClass(BuiltinClassLoader.java:821) at java.base/jdk.internal.loader.BuiltinClassLoader.findClassOnClassPathOrNull(BuiltinClassLoader.java:719) at java.base/jdk.internal.loader.BuiltinClassLoader.loadClassOrNull(BuiltinClassLoader.java:642) at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:600) at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:178) at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:522) at java.base/java.lang.Class.getDeclaredMethods0(Native Method) at java.base/java.lang.Class.privateGetDeclaredMethods(Class.java:3244) at java.base/java.lang.Class.getDeclaredMethods(Class.java:2387) at us.abstracta.jmeter.javadsl.codegeneration.MethodCall.findMethodInClassMatchingParams(MethodCall.java:291) at us.abstracta.jmeter.javadsl.codegeneration.MethodCall.findMethodInClassHierarchyMatchingParams(MethodCall.java:283) at us.abstracta.jmeter.javadsl.codegeneration.MethodCall.chain(MethodCall.java:260) at us.abstracta.jmeter.javadsl.core.threadgroups.DslDefaultThreadGroup$CodeBuilder.buildMethodCall(DslDefaultThreadGroup.java:422) at us.abstracta.jmeter.javadsl.codegeneration.MethodCallContext.lambda$buildMethodCall$0(MethodCallContext.java:149) at java.base/java.util.Optional.map(Optional.java:258) at us.abstracta.jmeter.javadsl.codegeneration.MethodCallContext.buildMethodCall(MethodCallContext.java:149) at us.abstracta.jmeter.javadsl.codegeneration.MethodCallContext.lambda$buildChildrenMethodCalls$4(MethodCallContext.java:178) at java.base/java.util.stream.ReferencePipeline$3$1.accept(ReferencePipeline.java:195) at java.base/java.util.stream.ReferencePipeline$2$1.accept(ReferencePipeline.java:177) at java.base/java.util.stream.ReferencePipeline$3$1.accept(ReferencePipeline.java:195) at java.base/java.util.ArrayList$ArrayListSpliterator.forEachRemaining(ArrayList.java:1625) at java.base/java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:484) at java.base/java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:474) at java.base/java.util.stream.ReduceOps$ReduceOp.evaluateSequential(ReduceOps.java:913) at java.base/java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234) at java.base/java.util.stream.ReferencePipeline.collect(ReferencePipeline.java:578) at us.abstracta.jmeter.javadsl.codegeneration.MethodCallContext.buildChildrenMethodCalls(MethodCallContext.java:179) at us.abstracta.jmeter.javadsl.codegeneration.MethodCallContext.addChildrenTo(MethodCallContext.java:166) at us.abstracta.jmeter.javadsl.codegeneration.MethodCallContext.buildMethodCall(MethodCallContext.java:155) at us.abstracta.jmeter.javadsl.codegeneration.DslCodeGenerator.buildMethodCallFromJmxFile(DslCodeGenerator.java:157) at us.abstracta.jmeter.javadsl.codegeneration.DslCodeGenerator.generateCodeFromJmx(DslCodeGenerator.java:148) at us.abstracta.jmeter.javadsl.jmx2dsl.Jmx2Dsl.call(Jmx2Dsl.java:44) at us.abstracta.jmeter.javadsl.jmx2dsl.Jmx2Dsl.call(Jmx2Dsl.java:17) at picocli.CommandLine.executeUserObject(CommandLine.java:1953) at picocli.CommandLine.access$1300(CommandLine.java:145) at picocli.CommandLine$RunLast.executeUserObjectOfLastSubcommandWithSameParent(CommandLine.java:2358) at picocli.CommandLine$RunLast.handle(CommandLine.java:2352) at picocli.CommandLine$RunLast.handle(CommandLine.java:2314) at picocli.CommandLine$AbstractParseResultHandler.execute(CommandLine.java:2179) at picocli.CommandLine$RunLast.execute(CommandLine.java:2316) at picocli.CommandLine.execute(CommandLine.java:2078) at us.abstracta.jmeter.javadsl.jmx2dsl.Jmx2Dsl.main(Jmx2Dsl.java:56) Caused by: java.lang.ClassNotFoundException: kg.apc.charting.GraphPanelChart at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:602) at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:178) at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:522) ... 45 [more](url)

JMX <?xml version="1.0" encoding="UTF-8"?> <jmeterTestPlan version="1.2" properties="5.0" jmeter="5.4.2"> <hashTree> <TestPlan guiclass="TestPlanGui" testclass="TestPlan" testname="Test Plan" enabled="true"> <stringProp name="TestPlan.comments"></stringProp> <boolProp name="TestPlan.functional_mode">false</boolProp> <boolProp name="TestPlan.tearDown_on_shutdown">true</boolProp> <boolProp name="TestPlan.serialize_threadgroups">false</boolProp> <elementProp name="TestPlan.user_defined_variables" elementType="Arguments" guiclass="ArgumentsPanel" testclass="Arguments" testname="User Defined Variables" enabled="true"> <collectionProp name="Arguments.arguments"/> </elementProp> <stringProp name="TestPlan.user_define_classpath"></stringProp> </TestPlan> <hashTree> <ThreadGroup guiclass="ThreadGroupGui" testclass="ThreadGroup" testname="NumericCalculation" enabled="true"> <stringProp name="ThreadGroup.on_sample_error">startnextloop</stringProp> <elementProp name="ThreadGroup.main_controller" elementType="LoopController" guiclass="LoopControlPanel" testclass="LoopController" testname="Loop Controller" enabled="true"> <boolProp name="LoopController.continue_forever">false</boolProp> <stringProp name="LoopController.loops">1</stringProp> </elementProp> <stringProp name="ThreadGroup.num_threads">1</stringProp> <stringProp name="ThreadGroup.ramp_time">1</stringProp> <boolProp name="ThreadGroup.scheduler">true</boolProp> <stringProp name="ThreadGroup.duration">3600</stringProp> <stringProp name="ThreadGroup.delay"></stringProp> <boolProp name="ThreadGroup.delayedStart">true</boolProp> <boolProp name="ThreadGroup.same_user_on_next_iteration">true</boolProp> </ThreadGroup> <hashTree> <IncludeController guiclass="IncludeControllerGui" testclass="IncludeController" testname="Include Controller" enabled="true"> <stringProp name="IncludeController.includepath">SetupAndCalculate.jmx</stringProp> </IncludeController> <hashTree/> </hashTree> </hashTree> </hashTree> </jmeterTestPlan>

andy-tarr avatar Sep 20 '22 14:09 andy-tarr

Hello, thank you for reporting this!

The issue seems to be related to included test plan. Can you share it to better trace the root cause of the issue? Seems like you are using a plugin on your included testplan.

Regards

rabelenda avatar Sep 20 '22 15:09 rabelenda

Issue.jmx has the include controller and fragment.jmx is referenced in the IC

issue137.zip

andy-tarr avatar Sep 21 '22 19:09 andy-tarr

Hello, with the example you just shared I could not reproduce the issue you reported. The conversion looks like this:

I guess that the error you reported manifests when you use some plugin using charts in any of the jmx files.

In any case the conversion is not optimal, since it still refers to other JMX. So I think makes sense to keep this issue open until we implement support for converting include controllers.

rabelenda avatar Sep 22 '22 12:09 rabelenda

@rabelenda Are you saying that you took the jmx files in the zip I uploaded and the conversion works? Looking at the jmx file xml I can't see anything referencing a chart plugin

andy-tarr avatar Sep 23 '22 10:09 andy-tarr

Works now with latest jmx2dsl release

andy-tarr avatar Sep 26 '22 14:09 andy-tarr

I am going to keep this open as a way to improve include controller conversion, even though is currently "functional".

rabelenda avatar Oct 17 '22 15:10 rabelenda

We just released a new version which optimizes conversion of include controllers. Please give it a try, and if you see it doesn't provide expected conversion please open a new issue.

rabelenda avatar Nov 18 '22 18:11 rabelenda