Skip to content

The Definitive Expert Guide on Apache JMeter

Apache JMeter is the most widely used open source solution for testing the performance of web applications. Born out of the need to benchmark web servers, it has grown over decades into a versatile platform capable of load testing almost any system ranging from APIs, databases to FTP servers and message queues.

This comprehensive expert guide covers the A to Z of leveraging Apache JMeter for efficiently engineering performant and scalable applications.

1. Introduction to Load Testing

Load testing plays a vital role in building resilient web-scale applications. By validating capacity and performance early in the lifecycle, it helps avoid costly outages and incidents down the road.

As per the 2020 State of Performance Testing report by BlazeMeter:

  • 76% of organizations conduct load testing regularly on production releases
  • 63% increase in shifting left – starting performance testing earlier from coding stages
  • 51% cite not catching bugs early as reason for outages

There lies a direct correlation between mature load testing practices and application availability and customer satisfaction.

Why Apache JMeter?

Apache JMeter is by far the most widely used open-source solution for load testing and performance benchmarking.

JMeter Adoption

Reference

Some key reasons for its popularity:

  • Open source – Freely available and supported by a vibrant community
  • Cross platform – Runs on Windows, Linux and macOS
  • Highly scalable – Handles thousands of concurrent users through distributed testing
  • Multi protocol – Supports Web, SOAP, Database via JDBC etc
  • Pluggable – Extend via custom Java code and plugins
  • Automatic recording – Records user journeys enabling easy scripting

Both technology giants like Google and Netflix as well small startups rely on JMeter as part of their performance testing toolkit.

2. Downloading and Installing

JMeter requires Java 8 or higher to be installed. You can download Java from oracle.com if not already available.

Installation

Navigate to https://jmeter.apache.org/download_jmeter.cgi in your browser.

Under Binaries, grab the appropriate package for your Operating System:

  • Windows: apache-jmeter-5.5.zip
  • Linux: apache-jmeter-5.5.tgz
  • Mac OS: apache-jmeter-5.5.dmg

Windows

Unzip the downloaded archive apache-jmeter-5.5.zip to your preferred location in file explorer. For ease of access, you can place it documents or program files folder.

Folder Structure

The extracted folder contains all binaries and script files:

apache-jmeter-5.5
├── backups
├── bin
├── docs
├── extras
├── lib
├── licenses
└── printable_docs

Linux/Mac

Use your preferred unzipping utility to extract the archive:

tar -xzf apache-jmeter-5.5.tgz

This will create a apache-jmeter-5.5 folder with all files.

Starting JMeter

Navigate inside the apache-jmeter-5.5/bin/ folder:

  • Windows: Double click jmeter.bat
  • Linux/Mac: Execute sh jmeter shell script

After a few seconds, the Apache JMeter graphical interface will open up.

JMeter GUI

Hurray! JMeter is now ready to start performance testing your web apps.

3. Creating Your First Test

Now that we have set up JMeter, let‘s create a simple test plan to get familiarized with the user interface.

Note: By default, JMeter saves created test plans and associated resources files within the apache-jmeter-5.5/bin folder. You can configure save path if required.

Recording Scripts

For beginners, the easiest way to start building test plans is using the HTTP(S) Test Script Recorder. This automatically captures HTTP(s) requests while you interact with the application via browser.

Under Test Plan > Add > Thread Group:

  1. Add a new Thread Group
  2. Right click on it. Choose Add > Non-Test Elements > HTTP(S) Test Script Recorder

JMeter Recording

Start recording and configure browser proxy settings to point to:

localhost port 8888

Interact with your web application performing typical user workflows. All HTTP requests will be captured by JMeter‘s proxy server including GET/POST parameters, headers, cookies etc.

Finally save the recording to generate equivalent JMeter test elements under Thread Group like:

  • HTTP Request samplers
  • HTTP Header Manager
  • HTML Extractors
  • JSON Extractors etc

This kickstarts scripting by mirroring actual user journeys. Additional test data, assertions and timers can be incorporated as the next step.

Manual Scripting

For direct scripting, add elements through GUI under the Test Plan tree:

JMeter Manual Scripting

Some key elements are:

  • Thread Group – Models user load
  • HTTP Request – Web requests
  • FTP Request – FTP uploads/downloads
  • JDBC Request – SQL Query request
  • Listeners – View request responses & test results
  • Assertions – Add validation checks
  • Timers – Insert delays between requests

Refer to JMeter element reference for the full list.

4. Configuring Load Simulation

To accurately simulate production usage patterns, the test plan must model real-world behavior of end users.

A properly configured load generator is key to producing trustable test results.

Multiple Thread Groups

Create separate Thread Groups to represent different activities your users perform, like:

  • User Login
  • Search products
  • Add items to cart
  • Purchase workflow
  • Admin functions

Configure each to match number of expected real-world users for that workflow along with appropriate delays.

JMeter Multiple Thread Groups

This models production usage more accurately than using a single thread group.

Stepping Load

In real-world, traffic grows gradually – not instantly.

Using Stepping Thread Group, we can increment users over time to replicate this realistically:

JMeter Stepping Thread Group

Start test with 10 users and add 5 more every 100 seconds achieving a gradual load pattern.

Duration can be extrapolated based on expected growth trends.

Dynamic Think Time

Within each request, add a randomized timer to represent think time before next request is made.

Using Uniform Random Timer, we can model variable user think times:

Think Time Timers

This will add a random delay between 5 to 15 seconds between HTTP requests – better mirroring human behavior.

Similarly model realistic session times, page visits etc based on your application profile.

5. Parameterizing Tests

When first developing scripts through recording or manual entries, hardcoded parameters get added in HTTP requests for items like:

  • User credentials
  • API keys
  • Form fields
  • File names
  • Session IDs

To simulate production variability, these need to be parameterized using variables or external data files. Common techniques are:

CSV Data Set

For sample usernames, login details etc, data can be supplied in CSV format:

JMeter CSV Data Set Config

This can be referenced in requests using ${username}. Each thread will extract next row for each iteration.

User Defined Variables

For standalone parameters, define test wide variables under Test Plan:

User Defined Variables

Enable sharing mode for cross ThreadGroup visibility.

Reference as ${VARIABLE} in HTTP Samplers.

Regex Extractors

Use Post Processor Regex Extractors to parse response and extract session IDs and other dynamic parameters.

JMeter Regex Extractor

This saves value into a variable for subsequent usage.

6. Distributed Load Testing

To scale load testing, JMeter provides a distributed testing architecture by coordinating multiple JMeter instances together.

JMeter Distributed Testing

By splitting the test across multiple servers, higher loads can be achieved through parallel execution.

Configuring Distributed mode

  1. Install JMeter on Master + multiple Slave machines
  2. Start remote engine on Slaves:
     jmeter-server
  3. On Master GUI, add a Remote Hosts config element with Slave IPs/hostnames
     192.168.0.101
     192.168.0.102
  4. Execute Test Plan to trigger distributed execution across nodes

Using distributed mode with sufficient client machines enables scaling up to thousands of concurrent virtual users.

Cloud infrastructure makes it easy to auto-scale JMeter servers on demand.

7. Automating with CI Pipelines

To prevent performance regressions, it is vital to integrate JMeter based testing into CI pipelines.

Typical stages can be:

JMeter CI Pipeline

Execute Tests

Trigger JMeter in CLI non-GUI mode to run scripts as part of automated build:

jmeter -n -t test.jmx -l results.jtl

Analyze

Parse JMeter logs to track KPIs like 95th percentile response times and error %. Fail builds if thresholds breached.

Report

Publish visual reports displaying request response times over different releases providing version comparison.

Embedding JMeter testing within CI infrastructure enables automated prevention against performance drifts.

8. Containerizing JMeter for Scale

Containers simplify packaging and orchestrating distributed JMeter servers across infrastructure.

Docker Image

The justb4/jmeter Docker image provides perfect base for modeling containerized distributed testing:

docker pull justb4/jmeter

Sample Docker Compose

version: ‘3‘
services:

  master: 
    image: justb4/jmeter 
    ports:
      - 60000:60000 # For remote slaves

  slave1:
    image: justb4/jmeter 
    links:
      - master
    depends_on: 
      - master

  slave2:
    image: justb4/jmeter
    links:
      - master
    depends_on:
      - master  

Bring up JMeter master and multiple slaves linking them together.

Execute tests on Master to trigger dockerized distributed testing.

Scaling using Docker enables reaching higher loads through flexible provisioning.

9. Cloud based Load Injection

Clouds natively provide the ability to instantly spin JMeter distributed servers for injection heavy volumes.

JMeter AWS Testing

BlazeMeter enables on-demand provisioning of JMeter clusters preloaded with hundreds of geo-distributed JMeter agents. Test scripts are executed leveraging the elastic infrastructure to generate massive loads.

In-house expertise on configuring and scaling cloud infrastructure is not needed with SaaS performance testing solutions.

10. Advanced Scripting with JSR223 Elements

For dynamic scripting in JMeter, leverage JSR223 Sampler and JSR223 PreProcessor.

These allow executing custom Java/Groovy code to provide additional logic.

Example: Dynamic HTTP Form Parameter Population

Generate a random 15 digit number to be posted in API signup requests:

// Sampler
Random rand = new Random()
int randomNum = rand.nextInt(10000000000000) 

// Pre-Processor
vars.put("dynamicId", randomNum.toString());

Use the vars object to inject values into requests on fly.

Powerful constructs like randomization, custom algorithms etc can implemented through scripting.

11. Correlation & Masking Sensitive Data

While executing against staging environments, sensitive information like passwords, API keys get exposed in test logs.

HTTP Request

Mask out confidential URL parameters using dummy values:

https://api.acme.com/user?apiKey=${__P(maskedKey)}  

User Defined Variables

Define the masked value:

maskedKey=********

This protects auth information from getting logged.

Regex Extractor

For dynamic session IDs, tokens – extract them from the previous response and save masked:

Session=${__javaScript(${maskedSession})}

where maskedSession holds a dummy value.

12. Expert Best Practices

Here are some additional pro tips compiled from years of hands-on performance testing with Apache JMeter:

  1. Reuse Authorization Manager – Centrally configure auth schemes instead of repeating in requests
  2. Follow naming standards – Use prefixes like TG Thread Group, R Request, L Listener. Helps structure
  3. Simplify Logic – Avoid unnecessary controllers, use Simple Controllers
  4. Validate Early – Add Assertions only where needed instead of all requests
  5. Monitor Resource Usage – Keep an eye on Heap, CPU during test runs
  6. Use CLI Mode – For final executions, CLI delivers better performance
  7. Baseline Early – Gather baseline KPIs on reference hardware before optimizing
  8. Ramp Users Gradual – Sudden spikes don‘t model real usage
  9. Verify Results – Cross verify using multiple summary + detailed listeners

Mastering these best practices distinguishes senior performance testers delivering high quality, reliable testing outcomes.

Conclusion

Apache JMeter reigns as the most popular open source load and performance testing tool given its simplicity, scalability and vibrant ecosystem.

This guide aimed to provide you a comprehensive yet easy to follow expert walkthrough on unleashing JMeter to test your web apps at scale. We covered the key concepts from basic script building through advanced techniques like distributed testing, cloud execution and CI integrations.

As you learn-by-doing, also consider investing time into mastering:

  • Application Performance Concepts – Understanding differences in load vs stress vs spike testing
  • Infrastructure Monitoring – Knowing production server behavior is vital
  • CI/CD workflows – Shifting testing left finds issues early lowering costs
  • Cloud Architectures – On-demand infrastructure is key to scaling JMeter elastically

With this solid 360 degree context on various interlinked facets, you are well on your way to become a testing expert and performance leader within your organization.

So open up that JMeter installer, brew some coffee and let the journey unfold!