JMeter 4.0 Release Notes
Apache JMeter 4.0 release notes with 81 improvements and 26 bug fixes, plus upgrade notes from the official changelog.
Change summary
Section titled “Change summary”| Section | Changes |
|---|---|
| New and Noteworthy | 6 |
| Incompatible changes | 14 |
| Improvements | 75 |
| Bug fixes | 26 |
| Non-functional changes | 35 |
New and Noteworthy
Section titled “New and Noteworthy”Core improvements
Section titled “Core improvements”JMeter now supports JAVA 9.
New Boundary Extractor element available which provides easy extraction with better performances

New JSON Assertion element available to assert on JSON responses.

New Precise Throughput Timer element available which produces Poisson arrivals with given constant throughput.

JMS Point-to-Point sampler has been enhanced with read, browse, clear options.

Best property values are now selected on many Test Elements to ensure best practices are the defaults:
- Newly added
If Controllernow uses by default Expression which is the most performing option.

- Newly added JSR223 Test Element now cache compiled script by default if language used provides this feature.

Loop controller and
ForEach Controller
now expose their current iteration as a variable named __jm__<Name of your element>__idx that
you can use like this for example for a Loop Controller named MyLoopController:
\${__jm__MyLoopController__idx}. See Bug 61802
Cookies are now shown in View Results Tree during recording. They were previously always shown as empty.
Response Assertion now allows you to customize assertion message and assert on Request Data.

UX improvements
Section titled “UX improvements”JMeter now uses Darcula LAF by default
Workbench has been dropped from UI, you can now use Non Test Elements as immediate children of Test Plan.

Menu UX have been improved to make most used elements available more rapidly.

HTTP(S) Test Script Recorder now allows you to name your transactions while recording in a more human readable way.

UX improvements made on, among the most notable :
- Module Controller informs user at least one Controller is required
- Function Helper Dialog (The wizard that helps using and testing functions) has been improved in many fields.

- Switch Controller trims text to avoid issues when a space is introduced before/after name
- Test Plan is now saved before running the test plan
Functions
Section titled “Functions”New Function __digest provides easy computing of SHA-XXX, MDX hashes:
\${__digest(MD5,Apache JMeter 4.0 rocks !,,,)}will return 0e16c3ce9b6c9971c69ad685fd875d2b
New Function __dateTimeConvert provides easy conversion between date formats:
\${__dateTimeConvert(01 Jan 2017,dd MMM yyyy,dd/MM/yyyy,)}will return 01/01/2017
New Function __changeCase provides ability to switch to Upper / Lower / Capitalized cases
\${__changeCase(Avaro omnia desunt\, inopi pauca\, sapienti nihil,UPPER,)}will return AVARO OMNIA DESUNT, INOPI PAUCA, SAPIENTI NIHIL
New Functions __isVarDefined
and __isPropDefined provide testing of properties and variables availability
\${__isPropDefined(START.HMS)}will return true
\${__isVarDefined(JMeterThread.last_sample_ok)}will return true
Scripting and Plugin Development
Section titled “Scripting and Plugin Development”You can now call SampleResult#setIgnore() if you don’t want your sampler to be visible in results
JavaSamplerContext used by AbstractJavaSamplerClient has been enhanced with new methods to easy plugin development.
JMeter now distributes additional Maven sources and javadoc artifacts into Maven repository
Plugins can now register listeners to be notified when a Test Plan is opened/closed
Live Reporting and Web Report
Section titled “Live Reporting and Web Report”InfluxDB backend listener now allows you to add custom tags by adding them with prefix TAG_, see Bug 61794
In Web Report responseTime distribution graph is more precise
Some bugfixes have been made on report generation, see Bug 61900, Bug 6190061956, Bug 61899. Graphs Latency Vs Request and Response Time Vs Request did not exceed 1000 RPS due to Bug 61962
Configuration of JMeter environment
Section titled “Configuration of JMeter environment”JVM settings for the JMeter start scripts can be placed in a separate file (bin/setenv.sh on Unix
and bin\setenv.bat on Windows), that gets called on startup. The startup script
itself does not have to be edited anymore.
Incompatible changes
Section titled “Incompatible changes”Start timeandEnd dateof Thread Group have been removed, see Bug 61549- In distributed testing, mode
Holdhas been removed. Use alternative and more efficient modes - For 3rd party plugins, the following method in
org.apache.jmeter.gui.tree.JMeterTreeNodehas been dropped for migration to Java 9 (Bug 61529)java public Enumeration<JMeterTreeNode> children() tearDown Thread Groupwill now run on stop and shutdown of a test by default. If you don’t want this behaviour, uncheckRun tearDown Thread Groups after shutdown of main threadsonTest Planelement, see Bug 61656- Properties
sampleresult.getbytes.headers_sizeandsampleresult.getbytes.body_real_sizehave been dropped, see Bug 61587 - JMeter will now save your test plan whenever you run it. This behaviour can be controlled by property
save_automatically_before_run, see Bug 61731 - Workbench element has been dropped, you now directly add
Non Test Elementas children of Test Plan. When loading a Test Plan that contains the element JMeter will move theMirror Server,Property Displayand HTTP(s)Test Script Recorderelements as direct children of Test Plan. For any other element, it will create aTest Fragmentelement calledWorkbench Test Fragment and move the elements in it. - Following classes have been dropped (
org.apache.jmeter.functions.util.ArgumentEncoder,org.apache.jmeter.functions.util.ArgumentDecoder), see PR#335 - In JMS Point-to-Point sampler, setting timeout to 0 will now mean infinite timeout while previously it would be switched to 2000 ms, see Bug 61829
- When Assertions are at different scopes, they are executed starting with the most OUTER one to the most INNER one. See Bug 61846
- JMeter now starts by default using English locale. This change is due to missing translations in many supported languages. You can change locale by modifying in jmeter and jmeter.bat (or preferably setenv.sh/setenv.bat) the
JVM_ARGSsystem property values. We’d also be very grateful if you can contribute translations in supported languages. - SwitchController now trims by default the content of switch to avoid issue related to unwanted spaces. See Bug 61771
- JMeter JVM heap settings have changed from
-Xms512m -Xmx512mto-Xms1g -Xmx1g - Beanshell version has been upgraded to bsh-2.0b6 which introduces breaking changes and more strict parsing rules
Improvements
Section titled “Improvements”HTTP Samplers and Test Script Recorder
Section titled “HTTP Samplers and Test Script Recorder”- PR#316Warn about empty truststore loading. Contributed by Vincent Herilier (https://github.com/vherilier)
- Bug 61639HTTP(S) Test Script Recorder: In request filtering tab, uncheck by default “Notify Child Listeners of filtered samplers”
- Bug 61672HTTP(S) Test Script Recorder: Have the ability to choose the sampler name while keeping the ability to just add a prefix
- Bug 53957HTTP Request: In Parameters tab, allow pasting of content coming from Firefox and Chrome (unparsed)
- Bug 61587Drop properties
sampleresult.getbytes.headers_sizeandsampleresult.getbytes.body_real_size - Bug 61843HTTP(S) Test Script Recorder: Add SAN to JMeter generated CA Certificate. Contributed by Matthew Buckett
- Bug 61901Support for
https.cipherSuitesSystem property. Contributed by Jeremy Arnold (jeremy at arnoldzoo.org)
Other samplers
Section titled “Other samplers”- Bug 61544JMS Point-to-Point Sampler: Enhance communication styles with read, browse, clear. Based on a contribution by Benny van Wijngaarden (benny at smaragd-it.nl)
- Bug 61829JMS Point-to-Point: If Receive Queue is empty and a timeout is set, it is not taken into account. Contributed by Ubik Load Pack (support at ubikloadpack.com)
- Bug 61739Java Request / JavaSamplerClient: Improve
org.apache.jmeter.protocol.java.sampler.JavaSamplerContext - Bug 61762Start Next Thread Loop should be used everywhere
Controllers
Section titled “Controllers”- Bug 61675If Controller: Use expression by default and add a warning when the other mode is used. Contributed by Ubik Load Pack (support at ubikloadpack.com)
- Bug 61770Module Controller: Inform user in UI that he needs to have at least one Controller in his plan. Contributed by Ubik Load Pack (support at ubikloadpack.com)
- Bug 61771SwitchController: Switch field should be trimmed by safety
Listeners
Section titled “Listeners”- Bug 57760View Results Tree: Cookie Header is wrongly shown as empty (no cookies) when viewing a recorder Sample Result. Contributed by Ubik Load Pack (support at ubikloadpack.com)
- Bug 61769View Results Tree: Use syntax highlighter in XPath Tester, JSON Path Tester and CSS/JQuery Tester. Contributed by Ubik Load Pack (support at ubikloadpack.com)
- Bug 61776View Results Tree: Expansion of
Add expand/collapse allmenu in render XML view. Contributed by Maxime Chassagneux and Graham Russell - Bug 61852View Results Tree: Add a Boundary Extractor Tester
- Bug 61794Influxdb backend: Add as many custom tags as wanted by just create new lines and prefix theirs name by “
TAG_” on the GUI backend listener
Timers, Assertions, Config, Pre- & Post-Processors
Section titled “Timers, Assertions, Config, Pre- & Post-Processors”- Bug 60213New component: Boundary based extractor
- Bug 61845New Component JSON Assertion based on AtlanBH JSON Path Assertion donated to JMeter-Plugins and migrated into JMeter core by Artem Fedorov (artem at blazemeter.com)
- Bug 61931New Component: Precise Throughput Timer, timer that produces Poisson arrivals with given constant throughput. Contributed by Vladimir Sitnikov (sitnikov.vladimir at gmail.com)
- Bug 61644HTTP Cache Manager: “Use Cache-Control/Expires header when processing GET requests” should be checked by default
- Bug 61645Response Assertion: Add ability to assert on Request Data
- Bug 51140Response Assertion: add ability to set a specific error/failure message that is later shown in the Assertion Result. Contributed by Ubik Load Pack (support at ubikloadpack.com)
- Bug 61534Convert AssertionError to a failed assertion, allowing users to use assert in their code. Fixing a regression introduced in 3.2
- Bug 61756Extractors: Improve label name “Reference name” to make it clear what it makes
- Bug 61758
Apply to:field in Extractors, Assertions: When entering a value inJMeter Variable Name, the radio boxJMeter Variable Nameshould be selected by default. Contributed by Ubik Load Pack (support at ubikloadpack.com) - Bug 61846Scoped Assertion should follow same order of evaluation as Post Processors
Functions
Section titled “Functions”- Bug 61724Add
__digestfunction to provide computing of Hashes (SHA-XXX, MDX). Based on a contribution by orimarko at gmail.com - Bug 61735Add
__dateTimeConvertfunction to provide date formats conversions. Based on a contribution by orimarko at gmail.com - Bug 61760Add
__isPropDefinedand__isVarDefinedfunctions to know if property or variable exist. Contributed by orimarko at gmail.com - Bug 61759Add
__changeCasefunction to change different cases of a string. Based on a contribution by orimarko at gmail.com - Bug 61561Function helper dialog should display exception in result
- Bug 61738Function Helper Dialog: Add Copy in Generate and clarify labels. Contributed by Ubik Load Pack (support at ubikloadpack.com)
- Bug 62027Help: Introduce property
help.localto allow choosing between local (offline) documentation and online documentation - Bug 61593Remove Detail, Add, Add from Clipboard, Delete buttons in Function Helper GUI
- Bug 61606Translate button
Browse…in some elements (which use FileEditor class) - Bug 61747HTTP(S) Test Script Recorder: add the missing doc to “Create transaction after request (ms)“
Report / Dashboard
Section titled “Report / Dashboard”- Bug 61871Reduce jmeter.reportgenerator.graph.responseTimeDistribution.property.set_granularity default value from 500ms to 100ms
- Bug 61879Remove useless files in HTML report template
General
Section titled “General”- Bug 61591Drop Workbench from test tree. Implemented by Artem Fedorov (artem at blazemeter.com) and contributed by BlazeMeter Ltd.
- Bug 61549Thread Group: Remove start and end date
- Bug 61529Migration to Java 9. Partly contributed by Ubik Load Pack (support at ubikloadpack.com)
- Bug 61709SampleResult: Add a method
setIgnore()to make JMeter ignore the SampleResult and not send it to listeners - Bug 61806Allow to use
SampleResult#setIgnore()in post-processors and assertions script (JSR223 elements) - Bug 61607Add browse button in all BeanShell elements to select BeanShell script
- Bug 61627Don’t clear LogView anymore when clicking on Warning/Errors Indicator
- Bug 61629Add Think Times to Children menu should not consider disabled elements
- Bug 61655SampleSender: Drop HoldSampleSender implementation
- Bug 61656
tearDown Thread Groupshould run by default at stop or shutdown of test - Bug 61659
JMeterVariables#get()should applytoString()on non string objects - Bug 61555Metaspace should be restricted as default
- Bug 61693JMeter aware of Docker (
-XX:+UnlockExperimentalVMOptions-XX:+UseCGroupMemoryLimitForHeap) - Bug 61694Add
-serveroption injmeter.bat - Bug 61697Introduce Darcula Look And Feel to make JMeter UI more attractive
- Bug 61704Toolbar: Improve a bit the right part
- Bug 61731Enhance Test plan Backup with option to save before run. Based on a contribution by orimarko at gmail.com
- Bug 61640JSR223 Test Elements: Enable by default caching. Contributed by Ubik Load Pack (support at ubikloadpack.com)
- Bug 61785Add Help → Useful links to create issues and download nightly build
- Bug 61808Fix main frame position. Implemented by Artem Fedorov (artem at blazemeter.com) and contributed by BlazeMeter Ltd.
- Bug 61802Loop / ForEach Controller should expose a variable for current iteration. Contributed by Ubik Load Pack (support at ubikloadpack.com)
- PR#349Add i18n resources(zh_CN). Contributed by Helly Guo (https://github.com/hellyguo)
- PR#351Fixed about dialog position on first view. Contributed by Graham Russell (graham at ham1.co.uk)
- PR#352Menu bar - added mnemonics to more menu items. Contributed by Graham Russell (graham at ham1.co.uk)
- PR#353Re-wrote some existing tests in Spock. Contributed by Graham Russell (graham at ham1.co.uk)
- Bug 61919UX: Reorder Menus. Contributed by Graham Russell (graham at ham1.co.uk)
- Bug 61920Plugins: Add ability to listen to Test Plan loading/closing. Contributed by Peter Doornbosch (https://bitbucket.org/pjtr/)
- Bug 61935Plugins: Let GUI component (dynamically) decide whether it can be added via the menu or not. Contributed by Peter Doornbosch (https://bitbucket.org/pjtr/)
- Bug 61969When changing LAF through GUI, user should be informed that it is better to restart
- Bug 61970JMeter now uses English as default locale to avoid missing translations in some locales make UI look weird
- Bug 56368Create and Deploy source artifacts to Maven central
- Bug 61973Create and Deploy javadoc artifacts to Maven central
- PR#371Fix example in documentation for XPath Assertion. Contributed by Konstantin Kalinin (kkalinin at hotmail.com)
- Bug 62039Distributed testing: Provide ability to use SSL
Bug fixes
Section titled “Bug fixes”HTTP Samplers and Test Script Recorder
Section titled “HTTP Samplers and Test Script Recorder”- Bug 61569JMS Point-to-Point Test Plan: Synchronization issue when putting reply. Contributed by Igor Panainte (panainte.i at gmail.com)
Other Samplers
Section titled “Other Samplers”- Bug 61698Test Action: It stop is selected, samplers following Test Action can run
- Bug 61707Test Action: Target is ignored when pause is selected, so it should be disabled
- Bug 61827JMSPublisher: Don’t add new line at the end of the file. Contributed by Graham Russell (graham at ham1.co.uk)
Controllers
Section titled “Controllers”- Bug 61556Clarify in documentation performance impacts of
\${}var usage in IfController and groovy. Contributed by Justin McCartney (be_strew at yahoo.co.uk) - Bug 61713Test Fragment has option to Change Controller and Insert Parent. Contributed by Ubik Load Pack (support at ubikloadpack.com)
- Bug 61965Module and Include Controller should not allow to add meaningless elements in their context.
- Bug 62062ThroughputController: StackOverFlowError triggered when throughput=0 (Total Executions or Percentage Executions) Partly implemented by Artem Fedorov (artem.fedorov at blazemeter.com) and contributed by BlazeMeter Ltd.
Listeners
Section titled “Listeners”- Bug 61742BackendListener: fix default value for
backend_graphite.send_interval - Bug 61878BackendListener: NPE if BackendListenerClient#getDefaultParameters returns null
- Bug 61950View Results Tree: Content-Type
audio/mpegurlis wrongly considered as binary
Timers, Assertions, Config, Pre- & Post-Processors
Section titled “Timers, Assertions, Config, Pre- & Post-Processors”- Bug 61716Header Manager: When pasting Headers from Firefox or Chrome spaces are introduced as first character of value
Functions
Section titled “Functions”- Bug 61588Better log message for __RandomDate() function
- Bug 61619In Function Helper Dialog, the 1st function doesn’t display default parameters
- Bug 61628If split string has empty separator default separator is not used
- Bug 61752
__RandomDate: Function does not allow missing last parameter used for variable name
Report / Dashboard
Section titled “Report / Dashboard”- Bug 61807Web Report: fix error in
getTop5ErrorMetrics. Contributed by Graham Russell (graham at ham1.co.uk) - Bug 61900Report Generator: Report generation fails if separator is a regex reserved char like
| - Bug 61925CsvSampleReader does not increment row in nextSample(). Contributed by Graham Russell (graham at ham1.co.uk)
- Bug 61956Report Generation:
-fof-forceDeleteResultFileoption does not work. Contributed by Ubik Load Pack (support at ubikloadpack.com) - Bug 61899Report Generation: When
jmeter.save.saveservice.print_field_namesis false andsample_variablesare set report generation fails. Contributed by Ubik Load Pack (support at ubikloadpack.com) - Bug 61962Latency Vs Request and Response Time Vs Request graphs do not exceed 1000 RPS. Contributed by Ubik Load Pack (support at ubikloadpack.com)
General
Section titled “General”- Bug 61661Avoid startup/shutdown problems due to 3rd party Thread Listener plugins throwing RuntimeException
- Bug 61625File Editor used in BeanInfo behaves strangely under all LAFs with impact on CSVDataSet, JSR223, BSF, Beanshell Element
- Bug 61844Maven pom.xml: Libraries used in testing should have scope test
- Bug 61842Saving with no changes causes a save and duplicate, identical backup file
Non-functional changes
Section titled “Non-functional changes”- Updated to bsh-2.0b6 (from bsh-2.0b5)
- Updated to groovy-all-2.4.13 (from groovy-all-2.4.12)
- Updated to rhino-1.7.7.2 (from rhino-1.7.7.1)
- Updated to tika-core and tika-parsers 1.17 (from 1.16)
- Updated to commons-dbcp2-2.2.0 (from 2.1.1)
- Updated to caffeine 2.6.1 (from 2.5.5)
- Updated to commons-codec-1.11 (from 1.10)
- Updated to commons-io-2.6 (from 2.5)
- Updated to commons-lang3-3.7 (from 3.6)
- Updated to commons-pool2-2.5.0 (from 2.4.2)
- Updated to asm-6.0 (from 5.2)
- Updated to jsoup-1.11.2 (from 1.10.3)
- Updated to cglib-nodep-3.2.6 (from 3.2.5)
- Updated to ph-css 6.0.0 (from 5.0.4)
- Updated to ph-commons 9.0.0 (from 8.6.6)
- Updated to log4j2 2.10.0 (from 2.8.2)
- Updated to httpcore 4.4.9 (from 4.4.7)
- Updated to httpclient 4.5.5 (from 4.5.3)
- Updated to jodd 4.1.4 (from 3.8.6)
- Bug 61642Improve FTP test coverage
- Bug 61641Improve JMS test coverage
- Bug 61651Improve TCP test coverage
- Bug 61651Improve OS test coverage. Partly contributed by Aleksei Balan (abalanonline at gmail.com)
- PR#319Removed commented out code. Contributed by Graham Russell (graham at ham1.co.uk)
- PR#322General JavaDoc cleanup. Contributed by Graham Russell (graham at ham1.co.uk)
- PR#323Extracted method and used streams to improve readability. Contributed by Graham Russell (graham at ham1.co.uk)
- PR#324Save backup refactor. Contributed by Graham Russell (graham at ham1.co.uk)
- PR#327Utilising more modern Java, simplifying code and formatting code and comments. Contributed by Graham Russell (graham at ham1.co.uk)
- PR#332Add the spock framework for groovy unit tests. Contributed by Graham Russell (graham at ham1.co.uk)
- PR#334Enable running of JUnit tests from within IntelliJ with default config. Contributed by Graham Russell (graham at ham1.co.uk)
- PR#335Removed
functions.util.*as they don’t seem to be used (for many years). Contributed by Graham Russell (graham at ham1.co.uk) - Bug 61867PR#345Updated to latest checkstyle (v8.5), Added many more rules to checkstyle, Included checking of test files and more file types. Contributed by Graham Russell (graham at ham1.co.uk)
- PR#350Parallelised unit tests. Contributed by Graham Russell (graham at ham1.co.uk)
- Bug 61966Setup Test Results Analyzer in jenkins
- PR#343Reduce the size of some images in the documentation. Contributed by Graham Russell (graham at ham1.co.uk)
Thanks
Section titled “Thanks”We thank all contributors mentioned in bug and improvement sections above:
- Igor Panainte (panainte.i at gmail.com)
- Emilian Bold (emi at apache.org)
- Ubik Load Pack
- Justin McCartney (be_strew at yahoo.co.uk)
- Vincent Herilier (https://github.com/vherilier)
- Aleksei Balan (abalanonline at gmail.com)
- Graham Russell (graham at ham1.co.uk)
- orimarko at gmail.com
- Artem Fedorov (artem at blazemeter.com)
- BlazeMeter Ltd
- Benny van Wijngaarden (benny at smaragd-it.nl)
- Matthew Buckett (https://github.com/buckett)
- Helly Guo (https://github.com/hellyguo)
- Peter Doornbosch (https://bitbucket.org/pjtr/)
- Jeremy Arnold (jeremy at arnoldzoo.org)
- Vladimir Sitnikov (sitnikov.vladimir at gmail.com)
- Konstantin Kalinin (kkalinin at hotmail.com)
We also thank bug reporters who helped us improve JMeter.
For this release we want to give special thanks to the following reporters for the clear reports and tests made after our fixes:
- user7294900 on Stackoverflow (orimarko at gmail.com)
Apologies if we have omitted anyone else.