Apache JMeter is the most widely used open-source tool for load and performance testing of web apps and APIs. You build a test plan of virtual users (threads) sending requests, add assertions and timers, then run it at scale and analyse response times, throughput and errors. See each building block animated in the JMeter visualizer.

JMeter Building Blocks

ElementWhat it does
Test PlanThe container for everything; holds user-defined variables
Thread GroupNumber of virtual users, ramp-up time and loop count or duration
SamplerThe request itself, usually an HTTP Request
Config elementsHTTP Request Defaults, Header Manager, Cookie Manager, CSV Data Set Config
Pre/Post-processorsPrepare data before a request; extract values (JSON, RegEx extractors) after it
AssertionsMark a sample failed if the response is wrong (status, text, JSON path, duration)
TimersThink time between requests so load is realistic
ListenersCollect results; use them sparingly in load runs
Advertisement

Performance Testing with JMeter: Core Questions

What is Performance Testing? Explain the different types with examples.

TypeGoalExample
Load TestingVerify system under expected load100 concurrent users placing orders
Stress TestingFind breaking point / failure thresholdIncrease users until response degrades
Spike TestingHandle sudden traffic surge0 to 5000 users in 30 seconds
Soak/Endurance TestingDetect memory leaks over timeRun at normal load for 8+ hours
Volume TestingHandle large data setsDB with 10 million records
Scalability TestingAssess scale-up/down abilityAdd server nodes and re-test

What are the main components of a JMeter test plan?

✔ A JMeter test plan simulates user behavior through several components:

  • Thread Group — Defines virtual users (threads), ramp-up time, loop count, scheduler
  • HTTP Request Sampler — Defines the actual HTTP call (URL, method, body, headers)
  • HTTP Header Manager — Sets request headers (Content-Type, Authorization, etc.)
  • CSV Data Set Config — Reads test data from CSV for data-driven performance tests
  • Timers — Adds think time between requests (Constant Timer, Gaussian Random Timer)
  • Assertions — Validates responses (Response Assertion for status code, body; Duration Assertion for time)
  • Listeners — Displays/saves results: View Results Tree, Aggregate Report, Summary Report, Graphs

What key performance metrics do you analyze and what are acceptable thresholds?

✔ Key performance KPIs and industry-standard thresholds:

  • Response Time (Average): Acceptable ≤ 2 seconds for web pages; ≤ 500ms for API calls
  • 90th Percentile Response Time: 90% of requests should complete within X ms — more meaningful than average
  • Throughput: Requests per second the server handles — higher is better
  • Error Rate: Should be 0% under normal load; even 0.1% is a red flag in production
  • CPU Utilization: Should stay ≤ 70% under peak load; ≥ 90% indicates capacity issue
  • Memory Usage: Watch for memory leaks — usage should stabilize, not grow continuously in soak tests
  • Apdex Score: 1.0 = all users satisfied; ≥ 0.85 is acceptable; < 0.7 requires investigation

Assertions and Correlation

What are JMeter Assertions? Explain all types with examples.

Assertions verify that server responses meet expected conditions — without them, JMeter marks all responses as PASS even if content is wrong.

WHY ASSERTIONS MATTER

A response of 200 OK with error body = still PASS without assertion
Assertions verify the CONTENT of response, not just status code
  • RESPONSE ASSERTION (most common):

Add to: HTTP Request → Add → Assertions → Response Assertion

Apply to: Main sample and sub-samples

Field to test: Response Body, Response Code, Response Message, Response Headers

Pattern matching rules:
  Contains: response body contains 'Login successful'
  Matches: regex pattern like '.*Welcome.*John.*'
  Equals: exact match (strict)
  Not: negation — body should NOT contain 'error'
  • DURATION ASSERTION — performance threshold:

Add to: HTTP Request → Add → Assertions → Duration Assertion

Duration to Assert: 3000 (milliseconds)

FAIL if response takes more than 3 seconds
Essential for performance testing SLAs
  • SIZE ASSERTION — verify response size:

Type: Full Response, Response Body, Response Headers

Compare: equals, greater than, less than, not equal

Use for: API responses (body > 0 bytes means not empty)

  • JSON ASSERTION (JSON APIs):

JSON Path Expression: $.data.users[0].name

Expected value: 'Alice'

Checks specific JSON field value
  • BEANSHELL / JSR223 ASSERTION (custom logic):
import groovy.json.JsonSlurper;
def json = new JsonSlurper().parseText(prev.getResponseDataAsString());
if (json.status != "success") {
  AssertionResult.setFailure(true);
  AssertionResult.setFailureMessage("Status was: " + json.status);
}
  • XPath2 ASSERTION (HTML/XML responses):

XPath expression: //title[text()='Dashboard']

Validates XML/HTML structure

What is Correlation in JMeter? How do you handle dynamic values?

Correlation extracts dynamic values (session tokens, CSRF tokens, IDs) from one request and passes them to subsequent requests — essential for realistic load testing.

THE PROBLEM — without correlation

Login returns: {"token': 'abc123-xyz-dynamic"}

Next request hardcodes: Authorization: Bearer HARDCODED_VALUE

Result: 401 Unauthorized — test fails to simulate real user

SOLUTION — CORRELATION STEPS

Step 1: Add extractor to response that contains the dynamic value

Step 2: Store extracted value in a JMeter variable

Step 3: Use ${variableName} in subsequent requests

REGULAR EXPRESSION EXTRACTOR

Add to: POST /login request → Add → Post Processors → Regular Expression Extractor

Reference Name: authToken

Regular Expression: "token':'(.+?)"

Template: $1$ (first capture group)

Match No.: 1 (first match)

Default Value: TOKEN_NOT_FOUND

  • JSON EXTRACTOR (for JSON APIs — preferred):

Add to: POST /login → Add → Post Processors → JSON Extractor

Variable Name: authToken

JSON Path Expressions: $.data.token

Default Value: TOKEN_NOT_FOUND

USE IN NEXT REQUEST

GET /api/profile

Header: Authorization: Bearer ${authToken}

// JMeter replaces ${authToken} with extracted value at runtime
  • CSRF TOKEN CORRELATION (common in web apps):

Step 1: GET /login page — extract CSRF token from HTML

CSS/JQuery Extractor: input[name='_csrf']  Attribute: value
Variable: csrfToken

Step 2: POST /login — include token in request body:

Body: username=user&password=pass&_csrf=${csrfToken}

VERIFY CORRELATION WORKED

Add Debug Sampler to see all variables: ${authToken} should show actual token

View Results Tree → check request headers contain real token
If TOKEN_NOT_FOUND appears → regex/JSON path is wrong — check actual response

Running JMeter in CI

# Non-GUI run with an HTML dashboard report
jmeter -n -t checkout-load.jmx -l results.jtl -e -o report/ \
       -Jusers=100 -Jrampup=60 -Jduration=600

Read the parameters in the test plan with ${__P(users,10)}. Always run load tests in non-GUI mode; the GUI is for building and debugging test plans only. Fail the pipeline on thresholds (error rate or 95th percentile response time) rather than eyeballing the report.

Reading the Results

  • Percentiles (90th, 95th, 99th) describe user experience far better than the average.
  • Throughput (requests per second) shows how much load the system actually handled.
  • Error % must stay near zero; slow but correct is different from fast but failing.
  • Watch the server side too (CPU, memory, database connections); JMeter only shows the symptoms.

FAQs

Is JMeter only for web applications?

No. It tests HTTP APIs and web apps most often, but also JDBC databases, JMS queues, FTP and more through different samplers and plugins.

Why run JMeter in non-GUI mode?

The GUI uses a lot of memory and CPU, which distorts results and limits how many virtual users one machine can generate. Use the GUI to build the plan and the command line to run it.

What is correlation in JMeter?

Capturing a dynamic value such as a session token from one response with an extractor and passing it into later requests, so the script behaves like a real user session.