Java – I can’t run jmeter test files using Java code in my Maven project

I can’t run jmeter test files using Java code in my Maven project… here is a solution to the problem.

I can’t run jmeter test files using Java code in my Maven project

I run a .jmx file using JMeter java code in my maven project. I recorded a .jmx file using blazemeter. Please quote the following code I tried.

package com.solitera.automation.controller;

import org.apache.jmeter.engine.StandardJMeterEngine;
import org.apache.jmeter.save.SaveService;
import org.apache.jmeter.util.JMeterUtils;
import org.apache.jorphan.collections.HashTree;

import java.io.File;
import java.io.FileInputStream;

public class JMeterFromExistingJMX {

public static void main(String[] argv) throws Exception {
         JMeter Engine
        StandardJMeterEngine jmeter = new StandardJMeterEngine();

 Initialize Properties, logging, locale, etc.
        JMeterUtils.loadJMeterProperties("D:/apache-jmeter-5.1.1/bin/jmeter.properties");
        JMeterUtils.setJMeterHome("D:/apache-jmeter-5.1.1");
        JMeterUtils.initLogging();// you can comment this line out to see extra log messages of i.e. DEBUG level
        JMeterUtils.initLocale();

 Initialize JMeter SaveService
        SaveService.loadProperties();

 Load existing .jmx Test Plan
       /* FileInputStream in = new FileInputStream("D:/Ecllipse_project_workspace2/slt_automation/src/test/jmeter/slt_autoMa_Test.jmx");
        HashTree testPlanTree = SaveService.loadTree(in);
        in.close(); */

HashTree testPlanTree = SaveService.loadTree(new File("D:/apache-jmeter-5.1.1/extras/slt_autoMa_Test.jmx"));

 Run JMeter Test
        jmeter.configure(testPlanTree);
        jmeter.run();
    }

}

After running as a Java application in eclipse, -> output is:

SLF4J: Class path contains multiple SLF4J bindings. SLF4J: Found
binding in
[jar:file:/C:/Users/rajan/.m2/repository/ch/qos/logback/logback-classic/1.2.3/logback-classic-1.2.3.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: Found binding in
[jar:file:/C:/Users/rajan/.m2/repository/org/apache/logging/log4j/log4j-slf4j-impl/2.12.1/log4j-slf4j-impl-2.12.1.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: See http://www.slf4j.org/codes.html#multiple_bindings for an
explanation. SLF4J: Actual binding is of type
[ch.qos.logback.classic.util.ContextSelectorStaticBinder] 18:56:16.586
[main] WARN org.apache.jmeter.util.JMeterUtils – Exception ‘null’
occurred when fetching boolean property:’server.exitaftertest’,
defaulting to: false 18:56:16.594 [main] WARN
org.apache.jmeter.util.JMeterUtils – Exception ‘null’ occurred when
fetching boolean property:’jmeterengine.remote.system.exit’,
defaulting to: false 18:56:16.594 [main] WARN
org.apache.jmeter.util.JMeterUtils – Exception ‘null’ occurred when
fetching boolean property:’jmeterengine.stopfail.system.exit’,
defaulting to: true 18:56:16.594 [main] WARN
org.apache.jmeter.util.JMeterUtils – Exception ‘null’ occurred when
fetching boolean property:’jmeterengine.force.system.exit’, defaulting
to: false 18:56:16.610 [main] INFO org.apache.jmeter.util.JMeterUtils
– Setting Locale to en_IN 18:56:17.109 [main] INFO org.apache.jmeter.save.SaveService – Testplan (JMX) version: 2.2.
Testlog (JTL) version: 2.2 18:56:17.148 [main] INFO
org.apache.jmeter.save.SaveService – Using SaveService properties file
encoding UTF-8 18:56:17.156 [main] WARN
org.apache.jmeter.save.SaveService – Can’t register a converter:
org.apache.jmeter.protocol.http.util.HTTPResultConverter
java.lang.ClassNotFoundException:
org.apache.jmeter.protocol.http.util.HTTPResultConverter at
java.net.URLClassLoader.findClass(URLClassLoader.java:382) at
java.lang.ClassLoader.loadClass(ClassLoader.java:424) at
sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:349) at
java.lang.ClassLoader.loadClass(ClassLoader.java:357) at
java.lang.Class.forName0(Native Method) at
java.lang.Class.forName(Class.java:264) at
org.apache.jmeter.save.SaveService.registerConverter(SaveService.java:285)
at
org.apache.jmeter.save.SaveService.registerConverter(SaveService.java:260)
at org.apache.jmeter.save.SaveService.initProps(SaveService.java:246)
at org.apache.jmeter.save.SaveService. (SaveService.java:165)
at
com.solitera.automation.controller.JMeterFromExistingJMX.main(JMeterFromExistingJMX.java:75)
18:56:17.157 [main] INFO org.apache.jmeter.save.SaveService – Using
SaveService properties version 5.0 18:56:17.175 [main] WARN
org.apache.jmeter.save.SaveService – Can’t register a converter:
org.apache.jmeter.protocol.http.sampler.HTTPSamplerBaseConverter
java.lang.ClassNotFoundException:
org.apache.jmeter.protocol.http.sampler.HTTPSamplerBaseConverter at
java.net.URLClassLoader.findClass(URLClassLoader.java:382) at
java.lang.ClassLoader.loadClass(ClassLoader.java:424) at
sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:349) at
java.lang.ClassLoader.loadClass(ClassLoader.java:357) at
java.lang.Class.forName0(Native Method) at
java.lang.Class.forName(Class.java:264) at
org.apache.jmeter.save.SaveService.registerConverter(SaveService.java:285)
at
org.apache.jmeter.save.SaveService.registerConverter(SaveService.java:260)
at org.apache.jmeter.save.SaveService.initProps(SaveService.java:246)
at org.apache.jmeter.save.SaveService. (SaveService.java:165)
at
com.solitera.automation.controller.JMeterFromExistingJMX.main(JMeterFromExistingJMX.java:75)
18:56:17.181 [main] INFO org.apache.jmeter.save.SaveService – Loading
file: D:\apache-jmeter-5.1.1\extras\slt_autoMa_Test.jmx Exception in
thread “main” java.lang.IllegalArgumentException: Problem loading XML
from:’D:\apache-jmeter-5.1.1\extras\slt_autoMa_Test.jmx’. Cause:
CannotResolveClassException:
org.apache.jmeter.protocol.http.control.HeaderManager

Detail:com.thoughtworks.xstream.converters.ConversionException:
—- Debugging information —- cause-exception : com.thoughtworks.xstream.converters.ConversionException cause-message
: first-jmeter-class :
org.apache.jmeter.save.converters.HashTreeConverter.unmarshal(HashTreeConverter.java:67)
class : org.apache.jmeter.save.ScriptWrapper
required-type : org.apache.jmeter.save.ScriptWrapper
converter-type : org.apache.jmeter.save.ScriptWrapperConverter
path : /jmeterTestPlan/hashTree/hashTree/HeaderManager
line number : 14 version : 5.2.1
——————————- at org.apache.jmeter.save.SaveService.readTree(SaveService.java:459) at
org.apache.jmeter.save.SaveService.loadTree(SaveService.java:432) at
com.solitera.automation.controller.JMeterFromExistingJMX.main(JMeterFromExistingJMX.java:82)
Caused by: com.thoughtworks.xstream.converters.ConversionException:
—- Debugging information —- cause-exception : com.thoughtworks.xstream.converters.ConversionException cause-message
: first-jmeter-class :
org.apache.jmeter.save.converters.HashTreeConverter.unmarshal(HashTreeConverter.java:67)
class : org.apache.jmeter.save.ScriptWrapper
required-type : org.apache.jmeter.save.ScriptWrapper
converter-type : org.apache.jmeter.save.ScriptWrapperConverter
path : /jmeterTestPlan/hashTree/hashTree/HeaderManager
line number : 14 version : 5.2.1
——————————- at org.apache.jmeter.save.ScriptWrapperConverter.createConversionException(ScriptWrapperConverter.java:102)
at
org.apache.jmeter.save.ScriptWrapperConverter.unmarshal(ScriptWrapperConverter.java:96)
at
com.thoughtworks.xstream.core.TreeUnmarshaller.convert(TreeUnmarshaller.java:72)
at
com.thoughtworks.xstream.core.AbstractReferenceUnmarshaller.convert(AbstractReferenceUnmarshaller.java:72)
at
com.thoughtworks.xstream.core.TreeUnmarshaller.convertAnother(TreeUnmarshaller.java:66)
at
com.thoughtworks.xstream.core.TreeUnmarshaller.convertAnother(TreeUnmarshaller.java:50)
at
com.thoughtworks.xstream.core.TreeUnmarshaller.start(TreeUnmarshaller.java:134)
at
com.thoughtworks.xstream.core.AbstractTreeMarshallingStrategy.unmarshal(AbstractTreeMarshallingStrategy.java:32)
at com.thoughtworks.xstream.XStream.unmarshal(XStream.java:1487) at
com.thoughtworks.xstream.XStream.unmarshal(XStream.java:1467) at
com.thoughtworks.xstream.XStream.fromXML(XStream.java:1338) at
org.apache.jmeter.save.SaveService.readTree(SaveService.java:449) …
2 more Caused by:
com.thoughtworks.xstream.converters.ConversionException:
—- Debugging information —- cause-exception : com.thoughtworks.xstream.mapper.CannotResolveClassException
cause-message :
org.apache.jmeter.protocol.http.control.HeaderManager class

: org.apache.jorphan.collections.ListedHashTree required-type :
org.apache.jorphan.collections.ListedHashTree converter-type :
org.apache.jmeter.save.converters.HashTreeConverter path
: /jmeterTestPlan/hashTree/hashTree/HeaderManager line number

: 14
——————————- at com.thoughtworks.xstream.core.TreeUnmarshaller.convert(TreeUnmarshaller.java:77)
at
com.thoughtworks.xstream.core.AbstractReferenceUnmarshaller.convert(AbstractReferenceUnmarshaller.java:72)
at
com.thoughtworks.xstream.core.TreeUnmarshaller.convertAnother(TreeUnmarshaller.java:66)
at
com.thoughtworks.xstream.core.TreeUnmarshaller.convertAnother(TreeUnmarshaller.java:50)
at
com.thoughtworks.xstream.converters.collections.AbstractCollectionConverter.readBareItem(AbstractCollectionConverter.java:132)
at
com.thoughtworks.xstream.converters.collections.AbstractCollectionConverter.readItem(AbstractCollectionConverter.java:117)
at
org.apache.jmeter.save.converters.HashTreeConverter.unmarshal(HashTreeConverter.java:67)
at
com.thoughtworks.xstream.core.TreeUnmarshaller.convert(TreeUnmarshaller.java:72)
at
com.thoughtworks.xstream.core.AbstractReferenceUnmarshaller.convert(AbstractReferenceUnmarshaller.java:72)
at
com.thoughtworks.xstream.core.TreeUnmarshaller.convertAnother(TreeUnmarshaller.java:66)
at
com.thoughtworks.xstream.core.TreeUnmarshaller.convertAnother(TreeUnmarshaller.java:50)
at
org.apache.jmeter.save.ScriptWrapperConverter.unmarshal(ScriptWrapperConverter.java:94)
… 12 more Caused by:
com.thoughtworks.xstream.mapper.CannotResolveClassException:
org.apache.jmeter.protocol.http.control.HeaderManager at
com.thoughtworks.xstream.mapper.DefaultMapper.realClass(DefaultMapper.java:81)
at
com.thoughtworks.xstream.mapper.MapperWrapper.realClass(MapperWrapper.java:125)
at
com.thoughtworks.xstream.mapper.DynamicProxyMapper.realClass(DynamicProxyMapper.java:55)
at
com.thoughtworks.xstream.mapper.MapperWrapper.realClass(MapperWrapper.java:125)
at
com.thoughtworks.xstream.mapper.PackageAliasingMapper.realClass(PackageAliasingMapper.java:88)
at
com.thoughtworks.xstream.mapper.MapperWrapper.realClass(MapperWrapper.java:125)
at
com.thoughtworks.xstream.mapper.ClassAliasingMapper.realClass(ClassAliasingMapper.java:79)
at
com.thoughtworks.xstream.mapper.MapperWrapper.realClass(MapperWrapper.java:125)
at
com.thoughtworks.xstream.mapper.ArrayMapper.realClass(ArrayMapper.java:74)
at
com.thoughtworks.xstream.mapper.MapperWrapper.realClass(MapperWrapper.java:125)
at
com.thoughtworks.xstream.mapper.SecurityMapper.realClass(SecurityMapper.java:71)
at
com.thoughtworks.xstream.mapper.MapperWrapper.realClass(MapperWrapper.java:125)
at
org.apache.jmeter.save.SaveService$XStreamWrapper$1.realClass(SaveService.java:98)
at
com.thoughtworks.xstream.mapper.MapperWrapper.realClass(MapperWrapper.java:125)
at
com.thoughtworks.xstream.mapper.CachingMapper.realClass(CachingMapper.java:47)
at
com.thoughtworks.xstream.core.util.HierarchicalStreams.readClassType(HierarchicalStreams.java:29)
at
com.thoughtworks.xstream.converters.collections.AbstractCollectionConverter.readBareItem(AbstractCollectionConverter.java:131)
at
com.thoughtworks.xstream.converters.collections.AbstractCollectionConverter.readItem(AbstractCollectionConverter.java:117)
at
org.apache.jmeter.save.converters.HashTreeConverter.unmarshal(HashTreeConverter.java:67)
at
com.thoughtworks.xstream.core.TreeUnmarshaller.convert(TreeUnmarshaller.java:72)
… 23 more

pom.xml file

<!-- https://mvnrepository.com/artifact/org.apache.jmeter/ApacheJMeter_core -->
    <dependency>
        <groupId>org.apache.jmeter</groupId>
        <artifactId>ApacheJMeter_core</artifactId>
        <version>5.2.1</version>
    </dependency>

<!-- https://mvnrepository.com/artifact/com.thoughtworks.xstream/xstream -->
    <dependency>
        <groupId>com.thoughtworks.xstream</groupId>
        <artifactId>xstream</artifactId>
        <version>1.4.11.1</version>
    </dependency>

<dependency>
        <groupId>org.apache.httpcomponents</groupId>
        <artifactId>httpcore</artifactId>
        <version>4.4</version>
    </dependency>
</dependencies>

<build>
<plugins>
    <plugin>
        <groupId>com.lazerycode.jmeter</groupId>
        <artifactId>jmeter-maven-plugin</artifactId>
        <version>2.9.0</version>
        <executions>
            <execution>
                <id>jmeter-tests</id>
                <goals>
                    <goal>jmeter</goal>
                </goals>
            </execution>
        </executions>
        <configuration>
            <overrideRootLogLevel>debug</overrideRootLogLevel>
            <propertiesUser>
                <jmeter.save.saveservice.output_format>xml</jmeter.save.saveservice.output_format>
            </propertiesUser>
            <testResultsTimestamp>false</testResultsTimestamp>
            <ignoreResultFailures>true</ignoreResultFailures>
        </configuration>
    </plugin>

<!-- <plugin>
    <groupId>com.lazerycode.jmeter</groupId>
    <artifactId>jmeter-analysis-maven-plugin</artifactId>
    <version>1.0.4</version>
    <executions>
        <execution>
            <goals>
                <goal>analyze</goal>
            </goals>
            <phase>verify</phase>
        </execution>
    </executions>
    <configuration>
        source file that contains jmeter result data. Needs to be XML format 
            or a GZIPed XML format
        <source>D:\Ecllipse_project_workspace2\slt_automation\target\jmeter\results\*</source>

directory where to store analysis report files. At least a file "summary.txt" 
            will be stored here.
        <targetDirectory>D:\Ecllipse_project_workspace2\slt_automation\target\jmeter\reports</targetDirectory>
        <logsDirectory>D:\Ecllipse_project_workspace2\slt_automation\target\jmeter\logs</logsDirectory>

<processAllFilesFound>true</processAllFilesFound>
    </configuration>
</plugin> -->

<plugin>
    <groupId>com.lazerycode.jmeter</groupId>
    <artifactId>jmeter-analysis-maven-plugin</artifactId>
    <version>1.0.4</version>
    <executions>
        <execution>
            <goals>
                <goal>analyze</goal>
            </goals>
            <phase>verify</phase>
        </execution>
    </executions>
    <configuration>
        <!-- source file that contains jmeter result data. Needs to be XML format 
            or a GZIPed XML format -->
        <source>${project.build.directory}/jmeter/results/*</source>

<!-- directory where to store analysis report files. At least a file "summary.txt" 
            will be stored here. -->
        <targetDirectory>${project.build.directory}/jmeter/reports</targetDirectory>
        <processAllFilesFound>true</processAllFilesFound>
    </configuration>
</plugin>

<plugin>
    <groupId>de.codecentric</groupId>
    <artifactId>jmeter-graph-maven-plugin</artifactId>
    <version>0.1.0</version>
    <configuration>
        <inputFile>${project.build.directory}/jmeter/results/slt_autoMa_Test.csv</inputFile>
        <graphs>
            <graph>
                <pluginType>ResponseTimesOverTime</pluginType>
                <width>800</width>
                <height>600</height>
                <outputFile>${project.build.directory}/jmeter/results/slt_autoMa_Test.png</outputFile>
            </graph>
        </graphs>
    </configuration>
</plugin>

</plugins>
</build>

Solution

From the error you get, it looks like your test is using HTTP Header Manager And you don’t have ApacheJMeter_http provide such packages.

The temporary solution is to add the next Maven dependency to your pom.xml:

<!-- https://mvnrepository.com/artifact/org.apache.jmeter/ApacheJMeter_http -->
<dependency>
    <groupId>org.apache.jmeter</groupId>
    <artifactId>ApacheJMeter_http</artifactId>
    <version>5.2.1</version>
</dependency>

I also recommend removing these httpcore and xstream dependencies from your pom.xml as Maven will treat them as transitive dependencies acquisition. JMeter core and HTTP packets.


Depending on the nature of your testing, you may need other packages, JMeter plugins, so it’s hard to say what else you need.

Related Problems and Solutions