jmeter-java-dsl
jmeter-java-dsl copied to clipboard
jmx2dsl fails for jmx tests with include controllers
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>
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
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 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
Works now with latest jmx2dsl release
I am going to keep this open as a way to improve include controller conversion, even though is currently "functional".
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.