Goal:
To create a Continuous Delivery Pipeline which includes Performance Testing process to detect any performance related issues as early as possible.
Usually the full scale Performance Test will be done in the Staging/Pre-Production environment which could be identical to your Production environment. Code push to Staging happens after thorough QA functional/regression verification is done. So even if QA certifies the build, there is a chance that code might not work as expected at certain load which could be found only in Staging environment. This performance issue requires code change -> build -> QA verification once again which could postpone your Production push!
So, Can we fit the performance testing into the existing continuous development & testing process to detect the performance issues as early as possible?
Yes! We absolutely can! The idea here is to run the performance test in the lower environments [Dev/QA] (we might have to adjust the load accordingly) & to compare the results against some baseline metrics. Note that this is NOT going to replace the full scale performance test which we will do in the Staging environment.
Lets see how we can implement the above process in this post by using JMeter + Ant + Jenkins.
Create Performance Test Script:
- Create some basic performance test script using JMeter.
- Check below useful articles from TestAutomationGuru.
- Creating Modular JMeter Test Scripts.
- Ensure that the script can be run on any given environment like QA/PPE/Staging etc. [Check here]
- I am going to consider a simple JMeter test which will login, search for a product and logout.
- I have used variables in the Thread Count, Ramp Up and Duration fields.
- At run time, we will pass values for those variables from Jenkins.
- To run the test in design mode/standalone mode, We use User Defined Variables as shown here. So, it takes the default values (like 1 user with 1 second ramp-up for 5 seconds test duration).
- Ensure that the scripts runs fine.
            Â
Running JMeter test using ANT:
ANT: It is a build tool –Â here we will be using ANT to execute a set of tasks in the given order. For ex:
- Cleaning the project by removing the temp files for a fresh test.
- Running the test by passing the test properties from Jenkins to JMeter.
- Creating reports
- Creating charts
You would be calling these tasks once you are done with the build and unit/integration tests.
Install ANT:
- Download Ant from here.
- Uncompress the downloaded file into a directory.
- Set environmental variables
- JAVA_HOME to your Java environment
- ANT_HOME to the directory you uncompressed Ant
- Add ${ANT_HOME}/bin (Unix) or %ANT_HOME%/bin (Windows) to your PATH.
- If you do not have a JMETER_HOME variable, please set that too. It should point to the JMeter folder where you see ‘bin’
- In the cmd prompt/terminal, type ant and enter as given below. You should see below message (The system should know that there is an ‘ant’ command)
Create ANT-JMeter Project:
Now we are going to create an ANT project as given below. [I have shared this sample project in GitHub]
test folder is going to contain your .jmx file
lib folder will have all the libs required for ant-jmeter task + any other libs you want to include for your jmeter test.
function folder will have all the beanshell scripts for your test.
build.properties A property file which is going to pass the values for JMeter UDV.
ANT Build file:
This is an important part. Ant needs a build.xml file (it does not have to be ‘build.xml’ – but that is a default name ant will expect) where you have all the tasks defined.
Lets create a build.xml file as given below. [I have shared this sample project in GitHub]
We have 3 targets here.
- clean -> cleaning the temp folders created as part of our test
- show-test-properties -> Displays the values we pass to the test
- run -> Runs the jmeter test
Now in the command prompt/terminal, go to the project folder and type ‘ant show-test-properties‘. You should see below output.
ANT: Run JMeter Test:
Lets run the test by issuing command:
ant run
Now we can see we have the log and result files created.
Creating HTML Report:
Run below command to generate the HTML report under output folder
ant generate-report
ant console log:
Report:
Creating Charts:
The above HTML file itself has nice charts. However you still might want to create charts through command-line to send via emails/slack etc.
To create charts, we need few external plugins.
Run below command to install the required plugins.
ant install-plugins
Once plugins are installed, Generate charts by issuing command:
ant generate-charts
Once the job is complete, We can see all the charts we wanted are generated and placed under the result folder.
ANT – Running all tasks sequentially:
Run all ant tasks by issuing a command: ant all
Sample Project:
- You can clone this sample project from here.
- I am allocating 5GB memory for JMeter test. You can modify the value as you wish in the build.properties
Having Issues?
- I see some comments from the readers that JMeter task is not executed by Ant. If possible, upgrade Java & Ant. [Some version of Java 8 & ant did not get along]
- If it still does not work, execute the task below command to enable ant to provide us more information to debug.
ant -v run
Summary:
Now we will be able to run our JMeter test by passing the test properties from a property file through ANT. We also have automated creating HTML file and creating charts from the result file.
We will see how to invoke this test from Jenkins in the next post.
Thanks to [Ref: http://www.programmerplanet.org/projects/jmeter-ant-task/]
Hi,
excellent article .
I have downloaded your project and try to run but the jtl file was not creating under result folder.
I ran ant generate-report it is showing jtl doesn’t exist.
Weird!!
Ensure that you have java 1.8.73 or below + Ant 1.9.6
Hi,
This is a great article.
I’d like to enrich report with PerfMon statistics such as CPU Utilization, Memory usage etc
But, I’ve faced with issue how create xslt file for PerfMOn jtl files.
They have completely different structure.
Do you have any suggestions how to do it?
Thanks a lot
Hi
Can you please tell me the use of “ant-contrib-1.0b3.jar” that is included as part of this project. I could see one entry for this in build file as well, however, could not understand the functionality of it.
Ant does not know what JMeter is! This jar is to extend ant to invoke JMeter.
Great Post!! . But when the chart reports are getting generated printing exception “java.lang.Throwable: Could not access C:\Users\mypath\Documents\jmeter\lib\ext\lib
at kg.apc.cmd.UniversalRunner.buildUpdatedClassPath(UniversalRunner.java:109)
at kg.apc.cmd.UniversalRunner.(UniversalRunner.java:55)” . It is not impacting any flow I guess as I am getting build successful message. But could you please update what I am doing wrong here ? Thanks again.
Please ensure that ‘CMDRunner.jar’ is present in ‘%JMETER_HOME/lib/ext’ folder & you have latest version of Java.
Hi,
I have downloaded your project and try to run but the jtl file was not creating under result folder.
I ran ant generate-report it is showing jtl doesn’t exist.jave 1.8 and ant 1.1.1 is also there.
Please share your thoughts
Some ant and java version (1.8) have compatibility issues – so it does not execute jmeter test at all. I have java 1.7.0.95 and ant 1.9.3
how to download the project sample?
It is a link for download. Because of poor style, it does not show as a link. Just click on ‘CPT Project (683 downloads)’
If I want to add some more listeners to list. How should I do that?
You should not be adding any listeners to the test. Once the result file (.jtl) is generated, you can open the .jtl file in any listener you want.
“”We can see a nice HTML aggregate report as given below. (You can also modify the XSLT file to include throughput details).””
How can this be modified just call the throughput object from the JTL i dont have exposure to xslt
How can we add 90,95 percentiles to the HTML report ?
D:\apache-jmeter-2.13\extras\CPT>ant run
Buildfile: D:\apache-jmeter-2.13\extras\CPT\build.xml
clean:
show-test-properties:
[echo] JMETER_HOME : D:\apache-jmeter-2.13\bin
[echo] TEST_PATH : D:\apache-jmeter-2.13\extras\CPT/test
[echo] TEST_NAME : Test.123.jmx
[echo] THREADGROUP_COUNT : 2
[echo] THREADGROUP_RAMPUP : 2
[echo] THREADGROUP_DURATION : 60
run:
[mkdir] Created dir: D:\apache-jmeter-2.13\extras\CPT\result
[mkdir] Created dir: D:\apache-jmeter-2.13\extras\CPT\log
BUILD FAILED
D:\apache-jmeter-2.13\extras\CPT\build.xml:64: jmeter jar file not found or not a valid file: D:\apache-jmeter-2.13\bin\bin\ApacheJMeter.jar
JMETER_HOME should be D:\apache-jmeter-2.13 Do not include bin.
Thanks a lot for this reply ,but after the changes I’m seeing the test is not getting triggered .
D:\apache-jmeter-2.13\extras\CPT>ant run
Buildfile: D:\apache-jmeter-2.13\extras\CPT\build.xml
clean:
[delete] Deleting directory D:\apache-jmeter-2.13\extras\CPT\result
[delete] Deleting directory D:\apache-jmeter-2.13\extras\CPT\log
show-test-properties:
[echo] JMETER_HOME : D:\apache-jmeter-2.13\
[echo] TEST_PATH : D:\apache-jmeter-2.13\extras\CPT/test
[echo] TEST_NAME : AuditcreateCloudAPISigning1.7_3_Queue.jmx
[echo] THREADGROUP_COUNT : 2
[echo] THREADGROUP_RAMPUP : 2
[echo] THREADGROUP_DURATION : 60
run:
[mkdir] Created dir: D:\apache-jmeter-2.13\extras\CPT\result
[mkdir] Created dir: D:\apache-jmeter-2.13\extras\CPT\log
[jmeter] Executing test plan: D:\apache-jmeter-2.13\extras\CPT\test\Test123.jmx ==> D:\apache-jmeter-2.13\extras\CPT\result\result.jtl
[jmeter] Creating summariser
[jmeter] Created the tree successfully using D:\apache-jmeter-2.13\extras\CPT\test\Test123.jmx
[jmeter] Starting the test @ Mon Nov 21 20:18:56 IST 2016 (1479739736666)
[jmeter] Waiting for possible shutdown message on port 4445
[jmeter] summary = 0 in 0s = ******/s Avg: 0 Min: 9223372036854775807 Max: -9223372036854775808 Err: 0 (0.00%)
[jmeter] Tidying up … @ Mon Nov 21 20:18:57 IST 2016 (1479739737227)
[jmeter] … end of run
BUILD SUCCESSFUL
Total time: 2 seconds
Thanks vlns ,
After the changes , Im seeing the test is not getting executed .
D:\apache-jmeter-2.13\extras\CPT>ant run
Buildfile: D:\apache-jmeter-2.13\extras\CPT\build.xml
clean:
[delete] Deleting directory D:\apache-jmeter-2.13\extras\CPT\result
[delete] Deleting directory D:\apache-jmeter-2.13\extras\CPT\log
show-test-properties:
[echo] JMETER_HOME : D:\apache-jmeter-2.13\
[echo] TEST_PATH : D:\apache-jmeter-2.13\extras\CPT/test
[echo] TEST_NAME : Test123.jmx
[echo] THREADGROUP_COUNT : 2
[echo] THREADGROUP_RAMPUP : 2
[echo] THREADGROUP_DURATION : 60
run:
[mkdir] Created dir: D:\apache-jmeter-2.13\extras\CPT\result
[mkdir] Created dir: D:\apache-jmeter-2.13\extras\CPT\log
[jmeter] Executing test plan: D:\apache-jmeter-2.13\extras\CPT\test\Test123.jmx ==> D:\apache-jmeter-2.13\extras\CPT\result\result.jtl
[jmeter] Creating summariser
[jmeter] Created the tree successfully using D:\apache-jmeter-2.13\extras\CPT\test\Test123.jmx
[jmeter] Starting the test @ Mon Nov 21 20:18:56 IST 2016 (1479739736666)
[jmeter] Waiting for possible shutdown message on port 4445
[jmeter] summary = 0 in 0s = ******/s Avg: 0 Min: 9223372036854775807 Max: -9223372036854775808 Err: 0 (0.00%)
[jmeter] Tidying up … @ Mon Nov 21 20:18:57 IST 2016 (1479739737227)
[jmeter] … end of run
BUILD SUCCESSFUL
Total time: 2 seconds
Sorry , it was mistake from my end , Some tags I have mentioned incorrectly .
This blog is a great blog . the way author mentioned and placed the steps . Its easy to execute a test from ant .
I assume your issue is resolved. You can also use Maven. http://www.testautomationguru.com/jmeter-continuous-performance-testing-jmeter-maven/
I really hope you can help, I have pulled down your CPT project, and run it, and it worked…but for some reason, now I have rebooted my pc, I can’t get it to work atall… when i run “ant run” i get –
c:\CPT>ant run
Buildfile: c:\CPT\build.xml
clean:
[delete] Deleting directory c:\CPT\result
[delete] Deleting directory c:\CPT\log
show-test-properties:
[echo] JMETER_HOME : C:\apache-jmeter-3.0
[echo] TEST_PATH : c:\CPT/test
[echo] TEST_NAME : tag.jmx
[echo] THREADGROUP_COUNT : 2
[echo] THREADGROUP_RAMPUP : 2
[echo] THREADGROUP_DURATION : 60
run:
[mkdir] Created dir: c:\CPT\result
[mkdir] Created dir: c:\CPT\log
[jmeter] Executing test plan: c:\CPT\test\tag.jmx ==> c:\CPT\result\result.jt
l
BUILD SUCCESSFUL
Total time: 1 second
And jmeter didn’t execute, like i said, this was all working but some reason has now stopped…any idea why?
Thanks
Can you execute using
ant -v all
& share the results?Can you comment / remove below properties in the ant run task & try once?
jmeter.save.saveservice.assertion_results
jmeter.save.saveservice.thread_counts
jmeter.save.saveservice.bytes
jmeter.save.saveservice.response_data.on_error
I got it all working on Ubuntu, so im not going to bother with windows…so ignore my last comment, One thing I can’t get working is the new report, every time i run “ant generate-new-report” i get – “result.jtl’ does not contain the field names header, ensure the jmeter.save.saveservice.* properties are the same as when the CSV file was created or the file may be read incorrectly
[java] An error occurred: Could not read sample
[java] Java Result: 1″
And I get that no matter what I try to run…any idea on why this isn’t working?
jmeter 3.0 expects the result file to be csv format. I updated the post now. The default one writes the result in xml file. Sorry for the confusion.
Greetings. It seems that jmeter v3.0 report creation requires
, does it?
Because if I leave “xml” value, I’m getting
generate-new-report:
[mkdir] Created dir: C:\PerfTest\CI\output
[java] Writing log file to: C:\PerfTest\CI\jmeter.log
[java] File ‘C:\PerfTest\CI\results\result.jtl’ does not contain the field names header, ensure the jmeter.save.saveser
vice.* properties are the same as when the CSV file was created or the file may be read incorrectly
[java] An error occurred: Could not read sample
[java] Java Result: 1
The result file should be in csv format. I updated the post with updated ant run task. Please check.
result shows NAN….here’s the ant -v run output:
C:\workspace\CPT>ant -v run
Apache Ant(TM) version 1.8.4 compiled on May 22 2012
Trying the default build file: build.xml
Buildfile: C:\workspace\CPT\build.xml
Detected Java version: 1.7 in: C:\Program Files\Java\jdk1.7.0_67\jre
Detected OS: Windows 7
parsing buildfile C:\workspace\CPT\build.xml with URI = file:/C:/workspace/CPT/b
uild.xml
Project base dir set to: C:\workspace\CPT
parsing buildfile jar:file:/C:/Program%20Files/apache-ant-1.8.4-bin/apache-ant-1
.8.4/lib/ant.jar!/org/apache/tools/ant/antlib.xml with URI = jar:file:/C:/Progra
m%20Files/apache-ant-1.8.4-bin/apache-ant-1.8.4/lib/ant.jar!/org/apache/tools/an
t/antlib.xml from a zip file
[property] Loading C:\workspace\CPT\build.properties
[property] Loading Environment env.
[pathconvert] Set property jmeter.classpath = C:\workspace\CPT\lib\CMDRunner.jar
:C:\workspace\CPT\lib\ant-contrib-1.0b3.jar:C:\workspace\CPT\lib\ant-jmeter-1.1.
1.jar:C:\workspace\CPT\lib\serializer-2.7.1.jar:C:\workspace\CPT\lib\xalan-2.7.1
.jar
parsing buildfile jar:file:/C:/workspace/CPT/lib/ant-contrib-1.0b3.jar!/net/sf/a
ntcontrib/antlib.xml with URI = jar:file:/C:/workspace/CPT/lib/ant-contrib-1.0b3
.jar!/net/sf/antcontrib/antlib.xml from a zip file
Build sequence for target(s) `run’ is [clean, show-test-properties, run]
Complete build sequence is [clean, show-test-properties, run, generate-report, g
enerate-chart, all, ]
clean:
show-test-properties:
[echo] JMETER_HOME : C:\apache-jmeter-2.8
[echo] TEST_PATH : C:\workspace\CPT/test
[echo] TEST_NAME : fwaesinsgateway.jmx
[echo] THREADGROUP_COUNT : 10
[echo] THREADGROUP_RAMPUP : 5
[echo] THREADGROUP_DURATION : 60
run:
[mkdir] Created dir: C:\workspace\CPT\result
[mkdir] Created dir: C:\workspace\CPT\log
[jmeter] Using JMeter Home: C:\apache-jmeter-2.8
[jmeter] Using JMeter Jar: C:\apache-jmeter-2.8\bin\ApacheJMeter.jar
[jmeter] Executing test plan: C:\workspace\CPT\test\fwaesinsgateway.jmx ==> C
:\workspace\CPT\result\result.jtl
[jmeter] Executing ‘C:\Program Files\Java\jdk1.7.0_67\jre\bin\java.exe’ with
arguments:
[jmeter] ‘-Xmx5120m’
[jmeter] ‘-jar’
[jmeter] ‘C:\apache-jmeter-2.8\bin\ApacheJMeter.jar’
[jmeter] ‘-n’
[jmeter] ‘-j’
[jmeter] ‘C:\workspace\CPT\log\jmeter.log’
[jmeter] ‘-t’
[jmeter] ‘C:\workspace\CPT\test\fwaesinsgateway.jmx’
[jmeter] ‘-l’
[jmeter] ‘C:\workspace\CPT\result\result.jtl’
[jmeter] ‘-Jjmeter.save.saveservice.output_format=xml’
[jmeter] ‘-Jjmeter.save.saveservice.assertion_results=all’
[jmeter] ‘-Jjmeter.save.saveservice.thread_counts=true’
[jmeter] ‘-Jjmeter.save.saveservice.bytes=true’
[jmeter] ‘-Jjmeter.save.saveservice.response_data.on_error=true’
[jmeter] ‘-Jthreadgroup.count=10’
[jmeter] ‘-Jthreadgroup.rampup=5’
[jmeter] ‘-Jthreadgroup.duration=60’
[jmeter]
[jmeter] The ‘ characters around the executable and arguments are
[jmeter] not part of the command.
[jmeter] Created the tree successfully using C:\workspace\CPT\test\fwaesinsga
teway.jmx
[jmeter] Starting the test @ Fri Dec 23 00:52:22 SGT 2016 (1482425542546)
[jmeter] Waiting for possible shutdown message on port 4445
[jmeter] Tidying up … @ Fri Dec 23 00:52:22 SGT 2016 (1482425542656)
[jmeter] … end of run
BUILD SUCCESSFUL
Total time: 1 second
C:\workspace\CPT>ant generate-report
You still use jmeter – 2.8? It is very old!! I would suggest you to use latest 3.1
Upgrade Java as well
I try the first step after making the build.xml and get the below error:
C:\workspace\CPT>ant show-test-properties
Buildfile: C:\workspace\CPT\build.xml
BUILD FAILED
C:\workspace\CPT\build.xml:2: Unexpected element “{}target” {antlib:org.apache.t
ools.ant}target
Total time: 0 seconds
C:\workspace\CPT>
Looks like build.xml is corrupted! Did you download once again and try? Please ensure that you have the latest version of Java and Ant
Thanks for sharing superb information. Your blog is so cool.
Hi,vlns
I want to pass the values of ${__property(url,,)} in build.xml,but failed,would you like to tell me how to get it
thanks
You could pass url as shown here – in the build.xml
<property name="url" value="https://www.google.com“>
thanks vlns
I tried with ,but it did not work
passed with in build.xml,it works
but I’m not sure if it’s a correct way.
Great info.
I am having problem to run some of the commands.
ant install-plugins / ant generate-charts – I am getting “Target “install-plugins” does not exist in the project “ant-jmeter”.
Any suggestions?
Please check the project here – https://github.com/vinsguru/jmeter-ant. Use the latest build.xml
Great post! It worked well for me. Thanks much! for sharing.