This is a Maven 2 plugin that allows you to run JMeter tests as part of the build. I am using this with [http://jchav.blogspot.com/ JChav] and [http://maven.apache.org/continuum/ Continuum] to automate the running of a suite of JMeter load tests, and publish the results to a web page. Sorry this is not more polished. It could use some TLC to make it more user-friendly to actually plug it into a project. I just thought I'd stick the code out there as quickly as possible and see if anyone is interested in it before I went any further with it.
To build and use the plugin:BR BR Remote Repository
- Create a locally hosted remote Maven repository, if you don't already have one.
- Configure your pom to utilize this remote repository.
Deploy JMeter Jar
Deploy the attached [^jmeter-2.2.jar JMeter jar] and [^jmeter-2.2.pom POM] to your remote repository (note that you do not need to have JMeter separately installed). For example:
mvn deploy:deploy-file -DgroupId=org.apache.jmeter -DartifactId=jmeter -Dversion=2.2 -Dpackaging=jar -Dfile=c://downloads//jmeter//jmeterPlugin/jmeter-2.2.jar -DpomFile=c://downloads//jmeter//jmeterPlugin/jmeter-2.2.pom -Durl=file:////myRepoHost.com/FileShare/ProductDevelopment/ApplicationDevelopment/maven2repository -DrepositoryId=my-repo
Deploy Dependencies
- Add the jar files that are referenced in the JMeter POM to your local repository, via the deploy plugin, if they are not on ibiblio.
Install the Plugin
Download the attached [^maven-jmeter-plugin-src.tar.gz Maven JMeter Plugin source tarball]. Untar it.
- Run "mvn install" to build and install the plugin.
- In your project's pom.xml, add a dependency on this plugin:
<dependency> <groupId>org.apache.jmeter</groupId> <artifactId>maven-jmeter-plugin</artifactId> <version>1.0-SNAPSHOT</version> </dependency>
Configure the Plugin
- Create a src/test/jmeter directory, and place your JMeter load tests there.
- Create a jmeter.properties file in src/test/jmeter. It's fine to just copy the default properties file from the JMeter install if you want.
- Optionally configure includes and excludes in your pom.xml for which tests to run. If you don't, it will just run **/*.jmx. For example:
<build> <plugins> <plugin> <groupId>org.apache.jmeter</groupId> <artifactId>maven-jmeter-plugin</artifactId> <configuration> <includes> <include>myTest1.jmx</include> <include>myTest2.jmx</include> </includes> </configuration> </plugin> </plugins> </build>
- The default reports directory is 'jmeter-reports' which is created in the base folder ( usually where maven is run from )
- Changing the reports directory : Add a reportDir setting to the plugin configuration. for example:
<build> <plugins> <plugin> <groupId>org.apache.jmeter</groupId> <artifactId>maven-jmeter-plugin</artifactId> <configuration> <includes> <include>myTest1.jmx</include> <include>myTest2.jmx</include> </includes> <reportDir>target/jmeter-reports</reportDir> </configuration> </plugin> </plugins> </build>
Executing the Plugin
- Run "mvn org.apache.jmeter:maven-jmeter-plugin:jmeter" to run the tests.
Change to the plugin - by Peter Andersen / not committed!
(If this can be used - please commit this into the codebase)
Using jmeter from maven-jmeter-plugin as suggested on:
http://jlorenzen.blogspot.com/2008_03_01_archive.html
The problem is that maven hang after the test has ended.
Some debugging shows that the maven-jmeter-plugin call to jmeter course jmeter to leak threads, I have done the following change to the maven-jmeter-plugin that fixes the problem, using checkForEndOfTest method below.
Hope someone can use this to improve the plugin.
Code changes to org.apache.jmeter.JMeterMojo.java:
private void executeTest(File test) throws MojoExecutionException { /... cut out from mail try { // This mess is necessary because the only way to know when JMeter // is done is to wait for all of the threads that it spawned to exit. new JMeter().start(args.toArray(new String[]{})); BufferedReader in = new BufferedReader(new FileReader(jmeterLog)); while (!checkForEndOfTest(in)) { try { Thread.sleep(1000); } catch (InterruptedException e) { break; } } in.close(); } catch (ExitException e) { if (e.getCode() != 0) { throw new MojoExecutionException("Test failed", e); } } finally { System.setSecurityManager(oldManager); Thread.setDefaultUncaughtExceptionHandler(oldHandler); } } catch (IOException e) { throw new MojoExecutionException("Can't execute test", e); } } private boolean checkForEndOfTest(BufferedReader in) throws MojoExecutionException { boolean testEnded = false; try { String line; while ( (line = in.readLine()) != null) { if (line.indexOf("Test has ended") != -1) { testEnded = true; break; } } } catch (IOException e) { throw new MojoExecutionException("Can't read log file", e); } return testEnded; }