Summary Report in JMeter
After thousands of requests have flown back and forth, someone asks one simple question: how did it go? The Summary Report is the one-page answer, a compact table that turns a mountain of results into numbers you can read in a minute.
Picture a teacher who has just marked an exam for five hundred students. She does not hand the principal five hundred answer sheets and say, “Here, have a look.” She writes a short summary: how many students sat the exam, the average mark, the lowest and highest marks, how many failed, and how spread out the results were. In one glance the principal understands how the class did.
A JMeter load test creates the same problem. A test with a few hundred virtual users can easily produce millions of individual results. Nobody can read millions of lines. You need a summary, and in Apache JMeter one of the oldest and most loved summaries is the Summary Report.
This guide explains it from the very beginning. You will learn what the report is, where it lives, how it collects numbers while a test is running, what every single column means, how to read the numbers without being fooled by them, how it differs from its bigger sibling the Aggregate Report, and how to use it safely in real projects.
1What Is the Summary Report?
The Summary Report is a JMeter listener that shows one row of statistics for each kind of request in your test, plus a final row for everything together.
The Simple Definition
In Apache JMeter, a listener is an element that receives the results of requests and shows or saves them. There are many listeners. Some draw graphs, some show every response, and some write files. The Summary Report is a listener that keeps running totals and displays them as a table. Each row stands for one label, which is simply the name of a request such as “Login” or “Search.” The columns hold the statistics: how many times that request ran, how long it took on average, how many failed, and more.
Think of the scoreboard in a cricket or football stadium. It does not replay every movement of every player. It keeps a few important numbers up to date: runs, wickets, goals, time. The Summary Report is the scoreboard of your test. It does not show every request, only the running score.
What It Does Not Do
The Summary Report does not show the body of any response, so you cannot read what the server actually said. It does not draw graphs. It does not show percentiles such as the ninety-fifth percentile, which are available in the Aggregate Report instead. It is a quick, light, honest table of the basics.
Why It Is So Popular
- It is light. It keeps small running totals instead of storing every sample, so it uses little memory.
- It is quick to read. A dozen rows and a handful of columns fit on one screen.
- It updates live. You can watch the numbers change as the test runs.
- It exports easily. The table can be saved to a file for sharing.
2Why We Need a Summary at All
Raw results are too many to read. A summary is how humans make decisions from them.
The Problem of Too Much Data
Suppose a test runs fifty virtual users for twenty minutes, and each user sends a request every few seconds. That is easily tens of thousands of results. A long test or a bigger one can reach millions. Each result has a time, a code, a size, a name, and more. Reading them one by one is not just boring; it is impossible.
What a Decision-Maker Needs
The people who read test results usually want to know a handful of things. Was the system fast enough? Did anything fail? How much work did it handle each second? Which part was slowest? A summary table answers these questions directly.
| Question People Ask | Summary Report Column That Answers It |
|---|---|
| How much did we test? | # Samples |
| How fast was a typical request? | Average |
| What were the best and worst cases? | Min and Max |
| Was the speed steady or erratic? | Std. Dev. |
| How many requests failed? | Error % |
| How much work per second? | Throughput |
| How much data moved? | Received KB/sec, Sent KB/sec, Avg. Bytes |
A summary always hides some detail. That is its purpose, and also its danger. Later chapters show how to read the numbers carefully so the hidden detail does not mislead you.
3Core Concepts You Need First
Six small ideas explain almost everything about the report. Learn them once and the table becomes easy.
Sampler
An element that sends a request, such as an HTTP Request. Think of it as a messenger who carries a question to the server.
Sample
The record of one request and its response, with time, size, and success or failure. One messenger trip makes one sample.
Label
The name of the request. Samples with the same label are counted together in one row.
Listener
An element that receives samples. The Summary Report is one kind of listener.
Virtual User
A thread inside JMeter that behaves like one visitor, sending requests in a loop.
Response Time
The time between sending a request and receiving the full answer, measured in milliseconds.
Milliseconds
A millisecond is one thousandth of a second. A blink of an eye takes about one hundred to four hundred milliseconds. Most times in the Summary Report are in milliseconds, so an average of 850 means just under one second.
Why Labels Matter So Much
The report groups samples by label. If two different requests share the same label, their numbers are blended into one row, and you can no longer tell them apart. If the same request has a different label every time, you get a flood of rows with one sample each. Good labels are the foundation of a readable report, and a later chapter returns to this.
4Adding the Summary Report to a Test Plan
The report is added like any other listener, in a few clicks.
Choose a Parent
Right-click the Thread Group, or the Test Plan itself, depending on how much you want it to see.
Add the Listener
Choose Add, then Listener, then Summary Report.
Give It a Clear Name
Rename it to something like “Summary – Checkout Test” so it is easy to find among other elements.
Run the Test
Press the start button. The table fills in as samples arrive.
Clear Between Runs
Use the clear button before a new run so numbers from an old run do not mix with the new ones.
Where You Place It Matters
A listener sees the samples within its scope, which is decided by its position in the tree. Placed under one Thread Group, it reports on that group only. Placed directly under the Test Plan, it reports on every group. Placed under a single sampler, it reports on that sampler alone. Many teams put one report at the Test Plan level for the overall picture, and sometimes a second one under a single important request.
If you see fewer rows than you expected, check where the listener sits. A listener placed under the wrong branch silently misses the requests you wanted to see.
5Architecture: Where the Report Sits in JMeter
The report is the last stop on the journey of each request. Understanding the journey explains why the numbers look the way they do.
flowchart TD
TP["Test Plan"] --> TG["Thread Group: virtual users"]
TG --> S1["Sampler: Home"]
TG --> S2["Sampler: Login"]
TG --> S3["Sampler: Search"]
S1 --> SYS["System under test"]
S2 --> SYS
S3 --> SYS
SYS --> RES["Responses return to JMeter"]
RES --> AS["Assertions judge pass or fail"]
AS --> SR["Summary Report listener"]
AS --> OT["Other listeners and result files"]
SR --> TB["Table: one row per label plus Total"]
Reading the Diagram
Virtual users in the Thread Group run the samplers. Each sampler sends a request to the system under test and receives a response. Assertions then judge whether the response was correct. Finally the finished sample, with its pass or fail status, goes to the listeners. The Summary Report receives it and updates the row for that label, then updates the Total row.
Main Components
- Thread Group. Creates the virtual users and decides how they behave.
- Samplers. Send requests and make samples.
- Assertions. Decide whether a sample counts as failed, which directly changes the Error % column.
- Listeners. Receive samples. The Summary Report is one of them.
- Result files. Optional files that store raw samples for later study.
The report only knows what the sample says. If an assertion marked a sample as failed, the report counts an error. If no assertion exists, an error page with a success code counts as a success. The table is only as honest as the checks that feed it.
6Internal Working: How the Numbers Are Collected
The report does not keep a diary of every request. It keeps small running tallies, and that is why it stays light.
Running Totals
When a sample arrives, the listener finds the row for its label. Into that row it adds the response time to a running sum, adds one to the count, adds the bytes received and sent, and notes whether the sample failed. It also updates the smallest and largest times seen so far, and a running measure that later becomes the standard deviation. The sample itself is then forgotten.
Computing the Columns
The visible numbers are calculated from the tallies whenever the table redraws. The average is the total time divided by the count. The error percentage is failed samples divided by all samples. The throughput is the count divided by the time from the first sample’s start to the last sample’s end. None of this needs old samples, only the tallies.
sequenceDiagram
participant V as Virtual User
participant S as Sampler
participant A as Assertion
participant L as Summary Report
participant T as Table on Screen
V->>S: Run the request
S->>S: Send, wait, receive response
S->>A: Hand over the sample
A-->>S: Pass or fail added to the sample
S->>L: Deliver finished sample
L->>L: Update tallies for this label
L->>L: Update tallies for Total row
L->>T: Refresh the visible numbers
What the Diagram Shows
The sampler finishes its work, the assertion adds a verdict, and the finished sample reaches the listener. The listener updates two sets of tallies, one for the label and one for the Total, and then the screen refreshes. There is no storage of the sample, which is the secret of the report’s small memory use.
A shopkeeper at closing time does not keep every receipt on the counter. She keeps a running total in a notebook: so many sales, so much money, the biggest sale, the smallest sale. The receipts can go in a box. The notebook is the Summary Report.
7The Table at a Glance
Before studying each column, look at the whole table and learn its shape.
| Column | Unit | One-Line Meaning |
|---|---|---|
| Label | Text | The name of the request this row describes |
| # Samples | Count | How many times that request ran |
| Average | Milliseconds | Mean response time |
| Min | Milliseconds | Fastest response seen |
| Max | Milliseconds | Slowest response seen |
| Std. Dev. | Milliseconds | How much the times vary around the average |
| Error % | Percent | Share of samples that failed |
| Throughput | Requests per second, minute, or hour | How much work was completed per unit of time |
| Received KB/sec | Kilobytes per second | Data received from the server |
| Sent KB/sec | Kilobytes per second | Data sent to the server |
| Avg. Bytes | Bytes | Average size of a response |
The Last Row
The final row is labelled TOTAL. It combines every row above it, so it shows the overall picture of the whole test. Many people read the Total row first, then look at the individual rows to find which request is responsible for any problem.
Read the table from right to left in importance: first Error %, then Throughput, then Average and Max, and only then the rest. A fast but failing system is not a success.
8The Label Column
A row is born the first time a sample with a new label arrives. Naming decides how clear your report will be.
Where Labels Come From
By default, a sample’s label is the name you gave the sampler in the Test Plan tree. If you name a request “HTTP Request,” that is the label, and if you have twenty requests with that default name, all twenty collapse into a single row. This is one of the most common reasons for confusing reports.
Naming Rules That Work
- Be specific. “Login – submit credentials” says far more than “Request 3.”
- Be unique per step. Each distinct step should have its own label so it gets its own row.
- Be stable per run. Do not put changing values such as user names or times into labels, or every sample gets its own row.
- Use order prefixes. A prefix such as “01 Home” and “02 Login” keeps rows in the order of the journey when you sort the table by label.
- Avoid secrets. Labels are saved in files and shared in reports.
Include Group Name
The Summary Report panel has an option to include the Thread Group name in the label. This is useful when two groups use requests with the same name, such as two kinds of users both calling “Search.” With the option on, rows read “Shoppers Search” and “Admins Search,” so they stay separate.
Variables placed in a sampler name, such as a user id, create a new row for every different value. A table with ten thousand one-sample rows is useless and slow to draw. Keep names fixed.
9The # Samples Column
The simplest column, and one that quietly tells you whether your test did what you planned.
What It Means
# Samples is the number of times the request with this label has run and reported a result. If a request ran 1,200 times, the column shows 1,200. It counts both successes and failures.
Why It Matters
This number is your first sanity check. You can predict it. If you have fifty virtual users and each runs a loop ten times, and every loop passes through the Search request once, you expect 500 samples for Search. If the table shows 480, something is off: maybe some users stopped early, maybe a failure skipped later steps, or maybe the test was stopped before everyone finished.
What Surprising Counts Tell You
| What You See | Possible Reason |
|---|---|
| Fewer samples than predicted | Users stopped early, the test was stopped, a failure skipped later steps, or a condition controller skipped the request |
| More samples than predicted | A loop count was larger than you thought, a retry was added, or embedded resources were counted as separate samples |
| Different counts for steps in one journey | Some users failed part way, or a branch was taken by only some users |
| Very small counts on one row | The label contains changing values, or the step is rarely reached |
If a school expects five hundred students at an exam and only four hundred and eighty answer sheets arrive, the first question is not about the marks. It is “Where are the missing twenty?” The sample count asks the same question of your test.
Small Counts Mean Weak Evidence
Averages and error rates from a handful of samples can swing wildly. Ten samples with one failure show a ten percent error rate, yet the same single failure among ten thousand samples is almost nothing. Always read statistics together with the count behind them.
10The Average Column
The average is the most quoted number in any test report, and the easiest one to misread.
What It Means
The Average is the mean response time in milliseconds. JMeter adds up the response times of all samples in the row and divides by the count. If three requests took 100, 200, and 600 milliseconds, the average is 300.
What the Time Includes
The response time JMeter records usually runs from just before the request is sent until the last byte of the response is received. It covers the network travel, the server’s thinking time, and the download. It does not include the pause added by timers, because a timer waits before the sampler starts.
The Weakness of Averages
An average squeezes many numbers into one, and it can hide how the numbers are spread. Imagine nine requests that take 100 milliseconds and one that takes 5,100. The average is 600 milliseconds, yet nine of ten visitors enjoyed a very fast answer and one visitor waited more than five seconds. The average describes nobody’s real experience.
If one person in a room is a billionaire and nine people have almost nothing, the average wealth looks high, but nobody in the room is typical. A single extreme number can drag an average away from what most people experience.
Using the Average Wisely
- Read it together with Min, Max, and Std. Dev., which show the spread.
- Compare averages between runs of the same test, not between different tests.
- Use the Aggregate Report, or the dashboard report, when you need percentiles that show what most users really felt.
- Judge an average against an agreed goal, such as “the Search average should stay below one second.”
Failed samples are included in the average. A request that fails instantly with an error page can pull the average down and make the system look faster than it is. Always read Average beside Error %.
11The Min and Max Columns
Min and Max are the edges of the range. They are simple, and they are valuable clues.
What They Mean
Min is the fastest response time seen for this label, and Max is the slowest. Both are in milliseconds, and both are single samples, not averages.
Reading Min
The minimum is roughly the best the system can do when everything goes right. It is often close to the time of an unloaded request. If Min is extremely small, such as a few milliseconds, check that the request actually did real work. A failed request that never reached the server can produce a tiny time and a misleadingly small minimum.
Reading Max
The maximum shows the worst experience any single virtual user had. A very large Max compared with the Average means that at least one request was extremely slow. It could be a one-time event, such as a first request that had to open a connection, or a warm-up effect, or it could be an early sign of trouble. One extreme number does not prove a problem, but it asks for a closer look.
The Gap Tells a Story
| Pattern | What It Suggests |
|---|---|
| Min, Average, and Max close together | Very steady behaviour |
| Min and Average close, Max very far away | Mostly fine with a few rare stalls |
| Average much closer to Max than to Min | Many slow responses, a broader problem |
| Max exactly equal to a round number such as 30,000 | Likely a timeout limit being reached |
When a Max value is a suspiciously round number, think “timeout.” Systems often give up at a fixed time, and the report then shows that exact limit as the worst case.
12The Std. Dev. Column
Standard deviation sounds scary, but the idea is gentle: it measures how much the times wobble.
What It Means
Std. Dev. is short for standard deviation. It is a number, in milliseconds, that describes how far the response times typically stray from the average. A small value means the times are tightly packed near the average. A large value means they are scattered.
Two bus routes both take thirty minutes on average. On the first, the bus always takes between twenty-eight and thirty-two minutes. On the second, it sometimes takes ten minutes and sometimes fifty. The averages match, but the second route is far less dependable. Standard deviation is the number that tells these two routes apart.
Rule of Thumb for Reading It
- Small compared with the average. Steady and predictable behaviour.
- About as large as the average. Very uneven times; some users have a much worse experience than the average suggests.
- Larger than the average. Strong outliers are pulling the numbers apart. Investigate the slowest samples.
How It Helps a Tester
A system that is about to hit a limit often becomes erratic before it becomes slow. Queues build up, some requests wait, others pass quickly, and the standard deviation climbs. Watching it grow as you add users can warn you that the system is nearing its breaking point, sometimes earlier than the average does.
Standard deviation works best when times follow a roughly bell-like pattern. Real response times often have a long tail of slow cases, so treat it as a hint about steadiness, not as an exact measure of fairness.
13The Error % Column
This is the column that tells you whether the numbers on the other columns can be trusted.
What It Means
Error % is the share of samples in the row that failed, shown as a percentage. If 5 out of 1,000 samples failed, the value is 0.50 percent. A value of 0.00 percent means no sample failed.
What Counts as a Failure
- Error response codes. By default, JMeter treats HTTP codes in the 4xx and 5xx ranges as failures, and codes in the 2xx and 3xx ranges as successes.
- Connection problems. Refused connections, resets, and timeouts count as failures.
- Assertion failures. Any assertion that fails marks the sample as failed.
- Extractor and script problems. Some elements can mark a sample failed when they cannot do their work.
The Great Danger: False Zero
A zero error rate feels wonderful, and it is only as good as the checks behind it. Without assertions, a page that says “something went wrong” but carries a 200 code is counted as a success. The report will cheerfully show 0.00 percent errors for a system that is failing. Always add assertions to important requests so the Error % column describes the truth.
Reading Error % With Context
| Observation | Likely Meaning |
|---|---|
| Zero errors but suspiciously fast averages | Maybe no assertions, and the server returns quick error pages with success codes |
| Errors rise as users increase | The system is running out of capacity |
| Errors on one label only | A specific service or step is the weak spot |
| Errors from the first second | Likely a script or data problem, not load |
| Errors that appear in bursts | Possible restarts, garbage collection pauses, or a limit being reached |
The report shows how many samples failed, not why. To learn the reason, look at the error messages in a results file or in a debugging listener such as the View Results Tree during a small run.
14The Throughput Column
Throughput answers a different question from speed: how much work did the system finish in a given time?
What It Means
Throughput is the number of requests completed per unit of time. JMeter calculates it as the number of samples divided by the time between the start of the first sample and the end of the last sample in that row. For a busy system, the unit is usually requests per second. For slow-moving requests, JMeter may show the value per minute or per hour so the number stays readable.
A toll booth has two measures. One is how long each car waits, which is response time. The other is how many cars pass through each minute, which is throughput. A booth can have very quick service and still pass few cars if few cars arrive, and a busy booth can pass many cars even if each takes a while.
Speed and Throughput Are Related but Different
If you add more virtual users and the system keeps up, throughput rises and response times stay steady. When the system reaches its limit, throughput stops rising, then response times grow, and finally errors appear. The point where throughput stops climbing is a good estimate of the system’s capacity for that scenario.
What Controls Throughput
- Number of virtual users. More users send more requests.
- Think time. Timers that make users pause reduce the rate of requests.
- Response time. Slower answers mean each user completes fewer requests.
- Test length and ramp-up. The measured time includes quiet periods at the start and end.
- The load generator. An overloaded test machine cannot send requests quickly enough.
Throughput measured per row depends on when that request ran during the test. A request used only at the start of a journey and a request used only at the end are measured over different windows, so compare per-row throughput with care and trust the Total row for the overall rate.
15The Received KB/sec and Sent KB/sec Columns
These two columns measure the traffic in kilobytes, showing how much data flowed each second.
What They Mean
Received KB/sec is the amount of data JMeter received from the server per second, which is the size of the responses. Sent KB/sec is the amount of data JMeter sent to the server per second, which is the size of the requests. A kilobyte is about one thousand bytes, a small amount of data such as a short text.
Why They Matter
- Network limits. Every network link can carry only so much data per second. If received data approaches the capacity of the link, the network, not the application, may be the bottleneck.
- Page weight changes. If received traffic suddenly doubles for the same number of requests, the pages have become heavier.
- Load generator limits. The test machine’s own network card can be the bottleneck, which would limit the load you can apply.
- Cost. In cloud environments, data transfer can be billed, so the numbers help estimate cost.
An Example Reading
Imagine the Total row shows 2,000 Received KB/sec. That is about two megabytes per second, or around sixteen megabits per second. On a link rated for a hundred megabits, this is comfortable. On a link rated for fifteen, it would explain why requests are slow regardless of how fast the servers are.
Kilobytes are different from kilobits. Network speeds are often quoted in bits, and one byte is eight bits. Multiply the kilobyte numbers by eight to compare with a link quoted in kilobits per second.
16The Avg. Bytes Column
The average size of a response, a quiet column that often explains a loud problem.
What It Means
Avg. Bytes is the average size, in bytes, of the responses for that label. A byte is the tiny unit used for storing one character of text. A page of about 50,000 bytes is roughly the size of a modest web page without its images.
Why It Is a Great Detective
Response size is a fingerprint of correctness. A search that normally returns about 40,000 bytes suddenly averaging 600 bytes is almost certainly returning an error message or an empty page, even if the response code says success. Many silent failures are first noticed by someone saying, “Why did the bytes drop?”
Uses
- Spotting hidden errors. A sudden fall in size often means error pages replaced real content.
- Spotting bloat. A sudden rise in size after a release means a page grew heavier, which may slow users on poor connections.
- Checking caching. A smaller size on repeat visits can show that compression or caching works.
- Choosing a Size Assertion. The normal size is a sensible starting point for a size check.
Before a big test, run one user and write down the Avg. Bytes of each important label. During the real test, any big departure from those numbers is a clue to investigate.
17Reading the TOTAL Row
The last row blends everything into one line. It is the headline of your test, with a few traps hidden inside.
How It Is Built
The Total row accumulates every sample from every label. Its sample count is the sum of all counts. Its average is the average over all samples together. Its minimum and maximum are the extremes across all rows. Its error percentage is all failures divided by all samples. Its throughput is the overall rate for the whole test.
The Blending Trap
Because the Total mixes different kinds of requests, its average can mislead. Suppose a light request that takes 100 milliseconds is used nine times for every one use of a heavy request that takes 3,000 milliseconds. The Total average is about 390 milliseconds, which does not describe either request. It describes the mix.
| Label | Samples | Average |
|---|---|---|
| Browse (light) | 9,000 | 100 ms |
| Report (heavy) | 1,000 | 3,000 ms |
| TOTAL | 10,000 | 390 ms |
When Total Is Useful
- Overall error rate. A quick yes or no on whether the test went well.
- Overall throughput. The rate of work the whole system handled.
- Comparing identical tests. If the mix of requests is the same in two runs, the Total averages can be compared fairly.
When Total Is Misleading
If the mix of requests changes between runs, the Total average changes even when no single request changed. Always look at the individual rows before drawing a conclusion from the Total.
18The Controls Around the Table
Above and below the table sit a few settings. They are small, but they decide what gets shown and saved.
Name and Comments
Like every element, the listener has a Name and a Comments box. Give it a name that says what it covers, and use the comment to record anything a colleague should know, such as “Placed at Test Plan level to cover all groups.”
The File Section
The panel has a filename box with a Browse button. If you type a file name, the listener writes each result to that file while the test runs. If you leave it empty, nothing is written to a file by this listener, and the table exists only on screen. The same box can be used to read an older results file back into the table for analysis.
Errors and Successes Filters
Two check boxes, usually called “Errors” and “Successes,” decide which kinds of samples are logged to the file. Turning on only Errors makes a smaller file that contains only the failures, which is a very useful trick for long tests. The table on screen still counts everything.
Configure
The Configure button opens a window where you choose which fields are saved to the file, such as time stamps, labels, response codes, messages, thread names, bytes, and latency. Fewer fields mean smaller files and less work for the test machine.
Include Group Name in Label
This option adds the name of the Thread Group to each label. It keeps rows separate when different groups call requests with the same name.
Save Table Data and Table Header
At the bottom of the panel, a button saves the visible table to a file, and a box lets you decide whether the column titles are included at the top. This is the simplest way to copy the final numbers into a spreadsheet or a report.
Saving the table is not the same as saving the raw results. The table holds only the summary numbers. If you may need to analyse the run later, also save the raw results file.
19Saving Results and Why Files Matter
A table on a screen disappears when the window closes. A file lasts, and can be studied again.
Two Kinds of Records
The Table
- Quick and easy to read
- Small, one row per label
- Cannot be re-sliced by time or user
- Lost when JMeter closes unless saved
The Raw Results File
- Holds every sample
- Can be loaded into reports and dashboards later
- Allows new questions about the same run
- Can become very large without careful field choices
A Sensible Habit
For every serious test, write raw results to a file with a name that includes the date and a short description, such as the test name and build number. Keep the table you saved beside it. Months later, when somebody asks how the system behaved before a change, you can answer with evidence instead of memory.
File Format
JMeter can write results as plain comma-separated text or as structured XML. The plain text format is smaller and faster to write, and most analysis tools can read it. Choose it by default unless you have a special reason to use XML.
If a file with the same name already exists, new results may be appended to it or mixed with old ones. Use a fresh file name for every run, or delete old files first, so two different runs do not blend into one set of numbers.
20Summary Report Versus Aggregate Report
Two listeners look almost alike. Knowing what separates them saves you from choosing the wrong one.
The Family Resemblance
The Aggregate Report is the Summary Report’s closest relative. Both show one row per label plus a total, and both show sample counts, averages, error percentages, and throughput. The differences are in what else each one offers and in how much memory each uses.
| Feature | Summary Report | Aggregate Report |
|---|---|---|
| Rows | One per label plus Total | One per label plus Total |
| Average, Min, Max, Error %, Throughput | Yes | Yes |
| Standard deviation | Yes | No standard deviation column in the usual layout |
| Median | No | Yes |
| 90, 95, and 99 percent lines | No | Yes |
| Average bytes column | Yes | No |
| Received and Sent KB/sec | Yes | Yes |
| Memory use | Low: keeps running totals | Higher: keeps response times so it can compute percentiles |
| Best for | Quick checks and long tests | Studying what most users experienced |
What Percentiles Add
A percentile answers “what response time was good enough for this share of users?” A 90 percent line of 800 milliseconds means that nine out of ten requests finished in 800 milliseconds or less. Percentiles describe the typical experience much better than the average, which is why the Aggregate Report matters even though it is heavier.
Why Percentiles Need More Memory
To know the ninety-fifth percentile, a listener must remember the actual response times and sort them. That needs storage proportional to the number of samples. The Summary Report avoids this and therefore cannot give percentiles.
Layouts can differ between JMeter versions, so open both listeners in your own version and compare the column headers. The idea that only the Aggregate Report offers percentiles has held for a long time.
21Choosing the Right Listener
JMeter offers many ways to look at results. Each answers a different question.
flowchart TD
Q["What do I need to see?"] --> A{"Need to read actual responses?"}
A -->|"Yes, to debug"| V["View Results Tree with a small run"]
A -->|"No"| B{"Need percentiles like the 95 percent line?"}
B -->|"Yes"| AG["Aggregate Report or HTML dashboard report"]
B -->|"No"| C{"Need graphs over time?"}
C -->|"Yes"| GR["Dashboard report, Backend Listener, or graph listeners"]
C -->|"No"| D{"Long test or very large volume?"}
D -->|"Yes"| SR["Summary Report with results saved to file"]
D -->|"No"| SR2["Summary Report is a quick, light choice"]
Reading the Diagram
If you need to see the actual words a server returned, you need the View Results Tree, but only with small runs, because it keeps everything. If you need percentiles, choose the Aggregate Report or the generated dashboard. If you need graphs over time, use the dashboard or a backend listener that sends data to a graphing tool. If none of these is needed, the Summary Report is the light, quick choice, especially for long tests.
A Quick Comparison
| Listener | Strength | Weakness |
|---|---|---|
| Summary Report | Light, quick table of basics | No percentiles, no graphs |
| Aggregate Report | Percentiles and median | Uses more memory |
| View Results Tree | Shows full requests and responses | Very heavy; for debugging only |
| Graph listeners | Visual trends in the GUI | Heavy and not for large tests |
| Backend Listener | Sends live data to external dashboards | Needs extra systems set up |
| HTML dashboard report | Rich report with percentiles and graphs | Generated after the test from a results file |
22Memory and Performance Cost
Every listener costs the test machine something. The Summary Report costs less than most, but it is not free.
Why It Is Light
The report keeps a few numbers per label, not a record per sample. Even after ten million samples, the memory used is tiny, as long as the number of labels stays small. This makes it safe for long tests where heavier listeners would run the machine out of memory.
Where Costs Still Appear
- Redrawing the table. In the graphical interface, the table refreshes while the test runs. A busy test with many samples makes the interface work hard.
- Writing a file. If the filename is set, every sample is written to disk. Many fields and many samples mean a lot of writing.
- Too many labels. If labels contain changing values, thousands of rows are created and memory grows.
- The graphical interface itself. Running big tests with the windows open takes resources away from the test.
How to Keep It Cheap
Run Big Tests Without the Interface
Use the command line mode for the heavy run, and look at the results file afterwards.
Choose Fewer Fields
Use Configure to save only the fields you will really use.
Keep Labels Stable
No user names, times, or ids inside request names.
Log Only Errors if Files Grow Large
The Errors option writes only the failures, which keeps files small.
If the test machine is overloaded, requests leave late, and the numbers include that delay. Watch the processor and memory of the load generator throughout the test, and treat the machine’s health as part of the evidence.
23Graphical Mode and Command Line Mode
JMeter has two ways of running. The Summary Report behaves a little differently in each.
Graphical Mode
In the graphical interface, you build the test and can watch listeners fill live. This is perfect for designing, debugging, and short trials. It is not recommended for large load tests, because the interface consumes the test machine’s resources and can distort results.
Command Line Mode
Also called non-graphical mode, this runs the test without windows. Nothing is displayed in a table, because there is no screen for it. Instead, JMeter writes results to a file as instructed, and it can print a short progress summary to the console at regular intervals. These console lines show running totals such as the number of samples, the rate, the average, the minimum, the maximum, and the number and share of errors. They are produced by a built-in summariser, a separate helper from the Summary Report listener.
| Question | Graphical Mode | Command Line Mode |
|---|---|---|
| Best use | Designing and debugging | Real load runs |
| Summary table visible live | Yes | No; console progress lines instead |
| Impact on the test machine | Higher | Lower |
| How to see the final table | Look at the window or save the table | Load the results file into the listener afterwards, or build the dashboard report |
Looking at Results Afterwards
After a command line run, open JMeter’s graphical interface, add a Summary Report, and use its file box to read the saved results file. The table is rebuilt from the saved samples, so you get the familiar view without having paid the graphical cost during the test.
Use graphical mode to build and check your plan with one or two users, then run the real load in command line mode and read the results in the interface afterwards.
24Warm-Up, Ramp-Up, and Steady State
A test has phases. A summary that blends them all can hide the truth about the part you care about.
The Phases of a Typical Test
Ramp-Up
Users are added gradually. Load is low and growing, so numbers are not yet representative.
Warm-Up
Caches fill, connections open, and code compiles on the server. The first requests are often slower than later ones.
Steady State
Full load is applied and the system settles. This is the period that best represents real capacity.
Ramp-Down
Users finish and leave. Throughput falls, and the final seconds are not representative either.
The Problem for a Single Table
The Summary Report keeps one set of numbers for the whole run. It mixes ramp-up, warm-up, steady state, and ramp-down into one average. If the steady state was healthy but the first minute was slow, the average is slightly worse than reality. If the test ended with a failure storm, the error rate includes it.
How to Work Around It
- Make the steady-state part long compared with ramp-up and ramp-down, so it dominates the numbers.
- Save raw results and analyse only the steady-state window using a dashboard or a spreadsheet.
- Run a short warm-up before the measured run, and clear the table before the measured part begins.
- Use a scheduler or a delay in the Thread Group so that all users start working together once warmed up.
25The Summary Report and Transaction Controllers
Business steps often group several requests. The report shows these groups in a way that surprises many beginners.
What a Transaction Controller Does
A Transaction Controller wraps several samplers into one named business step, such as “Checkout.” It measures the time of the whole step, from the start of the first request to the end of the last one.
Two Modes, Two Looks
The controller has a setting called “Generate parent sample.” When it is off, the report shows the individual requests as usual and also adds an extra row for the transaction itself. When it is on, the controller produces one parent sample for the whole step, and the individual requests inside it are not shown as separate rows in simple listeners.
| Setting | Rows You Will See | Careful With |
|---|---|---|
| Generate parent sample off | Each request plus a row for the transaction | The total sample count includes both, so the Total row counts work twice |
| Generate parent sample on | One row per transaction | You lose the per-request detail in the table |
The Counting Trap
When both individual requests and their transaction appear as rows, the Total row adds all of them together. Its sample count is therefore larger than the number of real requests, and its throughput appears higher than the true request rate. Read the transaction rows separately from the request rows, and be careful when quoting Total throughput.
The transaction’s own error status follows its contents. If any request inside fails, the transaction is marked failed. This is helpful, because the business step then shows an honest error rate.
26How Assertions, Timers, and Think Time Change the Table
Other elements in your plan quietly shape the numbers. Knowing how helps you explain surprises.
Assertions
An assertion marks a sample as failed when a check fails, which raises the Error % column. It does not change the response time. A strict assertion can therefore lift the error rate dramatically without any change in speed. That is the point: it reveals failures that codes alone would hide.
Timers
A timer makes a virtual user pause before sending a request, to imitate a person thinking or reading. The pause is not part of the response time, so the Average column does not include it. But the pause reduces how many requests the users send, so it lowers Throughput.
Think Time and the Capacity Question
If you run a test with long pauses, fifty users may send only a few requests per second. The report will show a low throughput and good response times, which does not prove the system can handle a high request rate. To test capacity, either use more users, shorten the pauses, or use a throughput-shaping timer designed to produce a target rate.
| Change in the Plan | Average | Error % | Throughput |
|---|---|---|---|
| Add a strict assertion | No change | May rise | No change |
| Add a long timer | No change | No change | Falls |
| Add more users | Rises when the system is stressed | Rises at the limit | Rises, then flattens |
| Remove pauses | May rise from higher pressure | May rise | Rises |
27The Summary Report in Distributed Testing
When one machine cannot create enough load, several machines work together, and the report must combine their results.
How Distributed Mode Works
In distributed testing, one machine acts as the controller and the others act as workers. The controller sends the Test Plan to every worker. Each worker runs the plan with its own virtual users and sends its samples back. The listener on the controller receives samples from every worker and builds one combined table.
Points to Remember
- Users multiply. If the plan says fifty users and there are four workers, you get two hundred users, not fifty.
- Counts add up. The # Samples column is the sum across all workers.
- The controller can become a bottleneck. It receives every sample, so a very large test can overload it. Using result files on workers and merging them afterwards is sometimes safer.
- Clocks should agree. Machines with different clocks make time-based analysis harder, so keep their time synchronised.
- Same plan and data. Every worker needs the same plan and any data files at the same paths.
If the table shows strange behaviour from only some requests, find out whether it comes from one worker. Include the thread name in saved results so you can tell which worker produced each sample.
28A Routine for Reading the Table
When the test ends and the table is full, a fixed routine keeps you from jumping to the wrong conclusion.
flowchart TD
S["Test finished"] --> C1{"Sample counts match the plan?"}
C1 -->|"No"| F1["Find out why: early stops, skipped steps, labels"]
C1 -->|"Yes"| C2{"Error % acceptable on every row?"}
C2 -->|"No"| F2["Investigate failures before trusting any speed numbers"]
C2 -->|"Yes"| C3{"Throughput reached the target?"}
C3 -->|"No"| F3["Check users, think time, and load generator health"]
C3 -->|"Yes"| C4{"Average, Max, and Std. Dev. within goals?"}
C4 -->|"No"| F4["Find the slow label and study its raw samples"]
C4 -->|"Yes"| C5{"Bytes and data rates look normal?"}
C5 -->|"No"| F5["Suspect silent errors or page changes"]
C5 -->|"Yes"| OK["Record results and compare with the previous run"]
Why This Order
Each question protects the next. If counts are wrong, nothing else can be trusted, because you are not looking at the test you planned. If errors are high, speed numbers are suspect, because failed requests are often quick. Only when counts and errors are sound do speed numbers become meaningful. Finally, response sizes act as an independent cross-check against silent failures.
Write the Answer Down
For each question, write one short line with the actual numbers. A routine that ends with a written record gives you something to compare with next time, and something to show others when they ask what the test proved.
Compare against a baseline. A number alone, such as “average 640 ms,” means little. The same number next to last month’s 420 ms tells a clear story.
29A Worked Example: Reading a Real-Looking Table
Let us read an imagined table for a small shop test with fifty users. The numbers are invented to teach the method.
| Label | Samples | Average | Min | Max | Std. Dev. | Error % | Throughput | Avg. Bytes |
|---|---|---|---|---|---|---|---|---|
| 01 Home | 500 | 210 | 90 | 1,100 | 80 | 0.00% | 4.1/sec | 38,000 |
| 02 Login | 500 | 420 | 150 | 2,300 | 190 | 1.20% | 4.1/sec | 9,400 |
| 03 Search | 494 | 980 | 200 | 9,800 | 1,450 | 0.00% | 4.0/sec | 520 |
| 04 Add to cart | 494 | 330 | 120 | 1,900 | 140 | 0.40% | 4.0/sec | 2,100 |
| 05 Pay | 491 | 1,500 | 600 | 6,200 | 800 | 8.50% | 3.9/sec | 3,000 |
| TOTAL | 2,479 | 685 | 90 | 9,800 | 870 | 2.00% | 20.1/sec | 10,700 |
Reading It Step by Step
- Counts. Home and Login ran 500 times. Search and Add to cart ran 494, and Pay ran 491. Six users did not reach Search after Login, which matches the 1.2 percent login failures, since six of five hundred is 1.2 percent. The counts tell a consistent story.
- Errors. Pay has an 8.5 percent error rate, far worse than the others. That is the first place to investigate. It is a business-critical step.
- Speed. Pay is also the slowest on average, at 1,500 milliseconds. Search has a lower average of 980, but its maximum is 9,800 and its standard deviation of 1,450 is larger than its average. Search is erratic, with a few very slow cases.
- Bytes. Search returns only 520 bytes on average, while a real search result list should be much larger. This suggests the search is returning something very small, perhaps empty results or an error message, even though the error column says zero. A content assertion is needed on Search.
- Throughput. The Total of 20.1 per second equals the sum of the rows, as expected here, because there are no extra transaction rows.
The most worrying finding was not the loud 8.5 percent error rate. It was the quiet 520 bytes on a request with 0.00 percent errors. Reading Avg. Bytes found a hidden problem the error column could not see.
30Step-by-Step: Producing a Trustworthy Report
A repeatable recipe from empty plan to a table you can stand behind.
Name Every Request Clearly
Give each sampler a unique, stable, readable name with an order prefix.
Add Assertions to Important Steps
Use positive content checks so the Error % column reflects real success.
Add the Summary Report
Place it at the Test Plan level so it covers all groups.
Run One User First
Confirm that the table shows the rows and sizes you expect, and write down baseline bytes.
Set a Results File
Give the file a dated name, choose a sensible set of fields, and keep one file per run.
Run the Real Test in Command Line Mode
Use the interface only to build and check; run the heavy load without windows.
Open the Results and Read the Table
Load the file into a Summary Report in the interface and follow the reading routine.
Save the Table and Notes
Save the table, the raw file, the plan version, and notes about the environment together.
31Monitoring, Logging, and Metrics Around the Report
The table tells you what the client saw. To explain why, you need to look at the other side of the conversation too.
The Two Viewpoints
The Summary Report shows the test’s viewpoint: how long answers took and how many failed. It cannot show what happened inside the server. If the average rises, the table alone cannot say whether the processor was busy, the database was slow, or the network was crowded. You need server-side monitoring alongside it.
What to Watch Beside the Report
- Server processor and memory. A busy processor often explains rising times.
- Database activity. Slow queries and waiting connections show up here.
- Network traffic. Compare with the Received and Sent KB/sec columns.
- Application logs. Errors and warnings explain failures counted in Error %.
- Load generator health. The test machine’s own processor, memory, and network.
Matching Times
To connect events, write down the start and end time of the test, and note when the table first showed trouble. Looking at server charts for that exact period lets you line up cause and effect. Saved raw results include time stamps, which makes this possible even after the test.
Logging in JMeter Itself
JMeter writes its own log file with warnings and errors from the test machine, such as scripts that failed or connections that could not open. Check it after a surprising result; it often reveals problems that never show up in the table.
A patient’s temperature chart says there is a fever, but a doctor also needs blood tests to learn the cause. The Summary Report is the temperature chart. Server monitoring is the blood test.
32Security and Safety Considerations
Reports and result files look harmless, but they can reveal more than you expect.
What Can Leak
- Labels. Request names appear in tables and files. They may reveal internal service names, paths, or even account details if careless names are used.
- Result files. Raw files can hold addresses, response messages, and thread names. If you save response data, they may contain personal information.
- Saved tables. A screenshot or spreadsheet of a table may be shared widely, and it reveals how much load your system can take.
- Environment details. Reports often mention server names and build numbers.
Good Habits
- Use synthetic test accounts and fake data, never real customer records.
- Avoid saving full response bodies unless you must, and delete files you no longer need.
- Keep result files in access-controlled storage, not on shared public folders.
- Choose generic labels that do not reveal secrets.
- Share capacity numbers only with people who should know them. A report that shows exactly where a system breaks is useful to an attacker too.
Test Only What You Are Allowed To Test
Load testing sends large volumes of traffic. Run it only against systems you own or have written permission to test, and tell the people who run the system so that your test is not mistaken for an attack. Many cloud providers and hosting companies have rules about load tests.
Passwords and tokens used in a test can end up in saved request details. Check the fields chosen in Configure before saving results from a test that uses real credentials.
33Advantages, Disadvantages, and Trade-Offs
Every tool is good at some things and weak at others. Here is an honest list for the Summary Report.
Advantages
- Very light on memory, even for long tests
- Quick to add and quick to read
- Shows size and data rate as well as speed
- Includes standard deviation and a Total row
- Updates live in the interface
- Can save the table and raw samples
- Works well with files from command line runs
Disadvantages
- No percentiles or median
- No graphs or trends over time
- Blends warm-up, steady state, and ramp-down
- Averages can hide user experience
- No view of response content or error reasons
- Total row can mislead when request mixes differ
- Not displayed in command line mode
Trade-Offs
| Choice | Gain | Cost |
|---|---|---|
| Use the Summary Report only | Low overhead and a simple view | Miss percentiles and trends |
| Also use the Aggregate Report | Percentiles for real user experience | More memory |
| Generate the dashboard report afterwards | Graphs, percentiles, and error tables | An extra step and bigger files |
| Save every field to the file | Maximum detail for later analysis | Large files and more work for the test machine |
34Design Patterns and Anti-Patterns
Years of testing teams have found the same helpful habits and the same repeated traps.
Good Patterns
Light Live, Rich Later
Keep the Summary Report for live checks and analyse the saved raw file with richer tools afterwards.
Baseline First
Run one user before every campaign and record bytes and times as a reference.
Honest Errors
Add positive assertions so the Error % column describes truth, not just codes.
Stable Labels
Clear, unique, ordered names without changing values.
Steady-State Window
Measure after warm-up and clear the table before the measured period.
Pair With Server Metrics
Always look at server and generator health beside the table.
Anti-Patterns
What Happens
A report says “average 600 ms” and nothing more.
Why It Hurts
Slow tails and erratic behaviour stay hidden, and goals are met on paper while users suffer.
Better Approach
Quote Min, Max, Std. Dev., and error rate, and get percentiles from the Aggregate Report or dashboard.
What Happens
No content checks exist, so error pages with success codes count as passes.
Why It Hurts
The system is declared healthy while it is failing.
Better Approach
Add assertions and cross-check Avg. Bytes.
What Happens
A large load run is started from the graphical interface with many listeners enabled.
Why It Hurts
The test machine slows down, and measured times include its own struggle.
Better Approach
Run in command line mode and write results to a file.
What Happens
The table is not cleared between runs, or results are appended to an old file.
Why It Hurts
Numbers from different conditions blend into meaningless averages.
Better Approach
Clear the table and use a fresh, dated file name for every run.
35Best Practices and Common Mistakes
A short list that separates calm, trustworthy test reports from confusing ones.
Best Practices
- Name labels well. Specific, ordered, stable, and free of secrets.
- Add assertions first. The report is only as honest as its checks.
- Read in order. Counts, errors, throughput, speed, then bytes.
- Save raw results. A file allows new questions later.
- Clear before each run. Never mix runs.
- Run big tests in command line mode. Keep the interface for design and review.
- Watch the load generator. Its health is part of the evidence.
- Compare with a baseline. Numbers mean more beside last time’s numbers.
- Record the context. Build number, environment, user count, and date.
Common Mistakes
| Mistake | Result | Fix |
|---|---|---|
| Using default sampler names | Different requests blended into one row | Give each step its own name |
| Variables inside labels | Thousands of one-sample rows | Use fixed names |
| Reading the Total as the truth | Misleading blended average | Read each row first |
| Comparing runs with different request mixes | False improvements or regressions | Compare rows, not only Total |
| Ignoring ramp-up and warm-up | Pessimistic averages | Measure steady state |
| Forgetting timers when judging throughput | Capacity underestimated | Account for think time |
| Not saving the table or file | No evidence afterwards | Save both, with dated names |
| Treating Max as always meaningful | Panic over one outlier | Check how often slow cases occur |
36Real-World Examples
These are teaching illustrations of how teams typically use the report. They are not descriptions of any particular company’s practice.
A Pre-Sale Check for an Online Shop
A week before a big sale, the team runs a stepped test and reads the Summary Report after each step. They watch Throughput climb until it flattens and Error % begins to rise. The point where it flattens becomes their estimate of safe capacity, and they plan extra servers for the sale.
A Release Gate for an Internal API
Every release candidate is tested for ten minutes. The team saves the table and compares each row with the previous release. A rise in Average or a drop in Avg. Bytes on any label stops the release for investigation.
A Long Soak Test
A service is tested for twelve hours at steady load to catch slow leaks. The light Summary Report is ideal, since it will not exhaust memory. The team clears nothing, writes only errors to a file, and watches whether Average and Std. Dev. creep upward over the night.
A Capacity Question From a Manager
A manager asks, “Can we handle double the visitors?” The tester doubles users, runs again, and compares the Total throughput and Error % between the two tables. The tables show that throughput doubled while errors stayed at zero, so the answer is yes for that scenario.
A Teaching Lab
A trainer shows students a small test against a practice site. The Summary Report is chosen because its eleven columns can be explained in one lesson, and students can watch the numbers change as they add users.
37Troubleshooting the Report
When the table looks strange, the cause is usually one of a few familiar suspects.
| Symptom | Likely Cause | What To Do |
|---|---|---|
| Table stays empty | Listener placed under the wrong branch, or the test did not start | Move the listener to the Test Plan level and check the test is running |
| Fewer rows than requests | Several samplers share the same name | Rename each sampler |
| Hundreds of one-sample rows | Changing values inside labels | Use fixed names |
| Numbers look too good | Failures hidden behind success codes, or no assertions | Add content assertions and read Avg. Bytes |
| Old numbers mixed with new | Table not cleared, or results file appended | Clear before each run and use fresh files |
| Throughput lower than expected | Long timers, too few users, slow responses, or an overloaded test machine | Review pauses, user count, and generator health |
| Total sample count too high | Transaction rows counted beside their requests | Read the transaction rows apart or use the parent sample setting |
| Max is a round number | A timeout is being reached | Check timeout settings and server behaviour |
| Average much lower than expected | Fast failures are included | Look at Error % and bytes |
| Interface becomes slow | Large test in graphical mode | Switch to command line mode |
| Saved table missing details | Table save holds only summary numbers | Also save the raw results file |
A Calm Way to Investigate
Repeat the problem with one user and a small number of loops. Open a debugging listener to see the real requests and responses. Change one thing at a time and write down what changed. When the strange behaviour disappears, you know which change fixed it.
38Terms People Often Confuse
Several pairs of ideas sound alike and mean different things. Separating them removes a lot of confusion.
Response Time vs Throughput
Response time is how long one request takes. Throughput is how many requests finish per second. A system can have fast responses and low throughput if few requests arrive.
Average vs Median
The average adds everything and divides. The median is the middle value. Extreme values pull the average but barely move the median. The Summary Report shows the average only.
Error % vs Error Count
The percentage is the share of failures in the row. A count of ten errors can be tiny among a million samples or huge among twenty.
Latency vs Response Time
Latency is the time until the first byte arrives. Response time includes the full download. The Summary Report shows response time.
Sample vs Request
A sample is the recorded result of a request. Embedded files and transactions can produce additional samples around one visible page.
Summary Report vs Summariser
The report is a listener with a table. The summariser is a small helper that prints progress lines to the console, even in command line mode.
KB/sec vs Kbit/sec
Kilobytes are about eight times larger than kilobits. Network speeds are often quoted in bits, so convert before comparing.
Std. Dev. vs Max
Max is a single extreme sample. Standard deviation summarises how scattered all samples are. A big Max with a small standard deviation means a rare outlier.
When two words seem to mean the same thing, write down which one you are using in the report and what it means. Clear terms prevent arguments in review meetings.
39A Case Study: The Fast Test That Fooled Everyone
This is a composed story built to teach. It is an illustration, not an account of a real team.
The Situation
A team tested a new ticket-booking service before launch. After the run, the Summary Report looked beautiful: an average of 180 milliseconds, a maximum under two seconds, and an error rate of exactly zero. They reported success and planned a launch party.
The Doubt
A colleague who had read the table carefully noticed the Avg. Bytes column. The booking confirmation request averaged only 450 bytes. The test environment had shown a confirmation page of about 12,000 bytes during the baseline run with one user. Something was wrong, but the error column said zero.
The Investigation
Replay With Few Users
They ran ten users and opened the View Results Tree. The confirmation response was a short “Service busy, try again” message with a success code.
Add a Positive Assertion
They added a check for the confirmation phrase on the booking step.
Rerun at Full Load
The same load now showed a high error rate on the booking step, clearly separated from other rows.
Fix and Retest
After the developers raised a connection limit, the confirmation size returned to normal and the error rate fell to zero, this time for real.
The Lesson
The original speed was real, but it was the speed of delivering a busy message. A single quiet column exposed it. The table was not wrong; it was incomplete, because nobody had told the test what a good answer looked like.
40Using the Report in Automated Pipelines
When tests run on their own after each change, the summary numbers become a gatekeeper.
The Pipeline Picture
Automated pipelines run JMeter in command line mode. Nobody sees a table on a screen. The run writes a results file, and later steps read it. Many teams also let the run produce the HTML dashboard report, which includes percentiles and graphs, and attach it to the build.
Turning Numbers Into a Decision
- Pick a few guard numbers. For example, overall Error %, the Average of key requests, and Throughput.
- Agree on limits. Based on past runs, not on hopeful guesses.
- Compare with the previous run. A change of more than a set percentage marks the build for review.
- Fail the step loudly. If a limit is crossed, the pipeline should stop and name which number crossed which limit.
- Keep the history. Store the numbers from each run so trends can be seen over weeks.
Practical Advice
- Keep pipeline tests short and focused, with a modest steady load.
- Run longer tests on a schedule, such as nightly.
- Use a stable, dedicated environment so neighbours do not cause false alarms.
- Treat a failing run as a real signal first and as noise only after investigation.
- Pass user counts, durations, and limits through properties so one plan works in every environment.
A smoke detector does not wait for a person to look at it. It sounds on its own. Guard numbers in a pipeline are the smoke detectors of your delivery process, and their value depends on being sensitive enough to notice smoke but not so jumpy that people learn to ignore them.
41Comparing Two Runs Fairly
The most useful thing a Summary Report can do is show whether something got better or worse. That requires a fair comparison.
What Must Stay the Same
- The plan. The same requests in the same order, with the same assertions.
- The load. The same user count, ramp-up, pauses, and duration.
- The data. Similar volumes and kinds of test data.
- The environment. The same servers, sizes, and settings, with no other heavy work running.
- The load generator. The same machine type, and healthy in both runs.
What To Compare
| Column | Good Sign | Warning Sign |
|---|---|---|
| # Samples | Close to the previous run | Large difference with no plan change |
| Average | Same or lower | Noticeably higher on any label |
| Std. Dev. | Same or lower | Much higher, meaning less steady |
| Error % | Same or lower | Any new errors on a label |
| Throughput | Same or higher for the same load | Lower while users were the same |
| Avg. Bytes | Same | Sudden drop or rise |
Allow for Natural Variation
Two runs of the same test never give identical numbers. Network noise, background work, and random timing all cause small differences. Learn how much your numbers normally wobble by repeating a test three times, and treat only larger changes as real.
42Quick Reference
A one-page reminder for the next time you are in a hurry.
| Column | Ask Yourself | Beware |
|---|---|---|
| Label | Is each step its own row? | Shared or changing names |
| # Samples | Does it match the plan? | Small counts give weak evidence |
| Average | Within the goal? | Hides spread and includes fast failures |
| Min | Is it realistic? | Tiny values from failed requests |
| Max | Is it a rare outlier or a pattern? | Round numbers suggest timeouts |
| Std. Dev. | Is it steady? | Large against the average means erratic |
| Error % | Is it honest? | False zero without assertions |
| Throughput | Did we reach the target rate? | Timers and ramp phases change it |
| Received and Sent KB/sec | Is the network close to its limit? | Bytes versus bits |
| Avg. Bytes | Is it like the baseline? | A drop can signal silent errors |
| TOTAL | Overall error and rate | Blended average and double counting |
43Glossary of Terms
Plain-language meanings of the words used in this guide.
| Term | Meaning |
|---|---|
| Summary Report | A listener that shows one row of statistics per label plus a Total row. |
| Listener | An element that receives and shows or saves test results. |
| Sampler | The element that sends a request and records the result. |
| Sample | One recorded request and response. |
| Label | The name of a request, used to group samples into rows. |
| Thread Group | The element that defines how many virtual users run and how. |
| Virtual user | A thread that behaves like one visitor. |
| Millisecond | One thousandth of a second. |
| Average | The total time divided by the number of samples. |
| Standard deviation | A measure of how scattered the times are around the average. |
| Percentile | The time below which a given share of requests finished. |
| Throughput | The number of requests completed per unit of time. |
| Error percentage | The share of samples that failed. |
| Assertion | A check that decides whether a response was correct. |
| Timer | An element that pauses a virtual user before a request. |
| Think time | The pause that imitates a person reading or deciding. |
| Ramp-up | The period in which users are added gradually. |
| Steady state | The period of full, stable load. |
| Transaction Controller | A grouping of requests into one named business step. |
| Aggregate Report | A related listener that also shows median and percentiles. |
| Non-GUI mode | Running JMeter from a command line without its windows. |
| Load generator | The machine that runs JMeter and creates the load. |
| Baseline | A reference measurement used for comparison. |
44A Checklist Before and After Every Important Run
Pilots read a checklist before every flight, however experienced they are. A short list protects a test run in the same way.
Before You Press Start
- Every request has a clear, unique, stable name.
- Important steps have positive assertions.
- The listener is at the right level and the table is cleared.
- A fresh, dated results file is set with sensible fields and no secrets.
- Baseline numbers exist from a run with one user.
- The load is planned. Users, ramp-up, pauses, and duration are written down.
- The big run uses command line mode with heavy listeners off.
- The load generator and server are monitored.
- The target is permitted and the people who run it have been told.
After the Run
- Read in order: counts, errors, throughput, speed, and bytes.
- Check server and generator health for the same period.
- Save the table, the raw file, and notes together.
- Compare with the previous run, allowing for normal variation.
- Write the conclusion in one clear paragraph with numbers.
Paste this checklist into your team’s notes and tick it for each important run. A habit that takes two minutes can save a day of arguing about numbers that turn out to be meaningless.
45Finding the Limit: Capacity From Several Tables
One table describes one load. Several tables, taken at rising loads, reveal where a system starts to struggle.
The Stepped Approach
Run the same test several times with more users each time, for example twenty, forty, sixty, and eighty. Clear the table before each run, and save each table with a clear name. Then place the Total rows side by side. The pattern across the rows is far more informative than any single table.
| Users | Throughput | Average | Error % | What It Says |
|---|---|---|---|---|
| 20 | 10/sec | 200 ms | 0.0% | Comfortable |
| 40 | 20/sec | 210 ms | 0.0% | Rate doubled, speed steady |
| 60 | 27/sec | 380 ms | 0.2% | Rate grows slower, speed worsens, first errors |
| 80 | 28/sec | 900 ms | 4.0% | Rate has flattened, system saturated |
These numbers are invented to show the shape. Notice that adding users from sixty to eighty added almost no throughput, but speed collapsed and errors appeared. The knee of the curve, somewhere between forty and sixty users, is the practical capacity of this scenario.
Why the Shape Matters
- Linear growth. While throughput rises in step with users, the system has spare room.
- The bend. When throughput grows more slowly than users, queues are starting to form.
- The plateau. When throughput stops growing, the system is saturated and extra users only wait longer.
- The collapse. Past the plateau, errors rise and sometimes throughput itself falls.
A motorway carries more cars per hour as more cars join, until it fills up. After that, adding cars makes everyone slower and sometimes reduces the number that get through. The stepped test finds the point where the motorway is full.
Keep a safety margin. Running a production system at the exact edge leaves no room for sudden bursts, so plan to operate well below the measured limit.
46Explaining the Report to People Who Are Not Testers
Managers, product owners, and customers care about outcomes, not columns. Translating the table is part of the job.
From Column to Plain Sentence
| Column | Plain Sentence |
|---|---|
| # Samples | “We simulated this many actions.” |
| Average | “A typical action took about this long.” |
| Max | “The slowest single action took this long.” |
| Std. Dev. | “Times were steady,” or “times were uneven.” |
| Error % | “This share of actions failed.” |
| Throughput | “The system completed this many actions every second.” |
| Avg. Bytes | “Each answer was about this size, as expected,” or “unusually small, which we are checking.” |
Tell a Short Story
People remember stories better than tables. A good summary has three parts: what we tested, what we found, and what we recommend. For example: “We simulated two hundred shoppers for twenty minutes. Everything was fast and reliable until about one hundred and fifty shoppers, when payments began to slow and fail. We recommend fixing the payment connection limit before the sale.”
Be Honest About Limits
- Say which scenario was tested, and which was not.
- Say that the test environment may differ from production.
- Say when a number comes from a short run and may vary.
- Avoid false precision. “About one second” is better than “1,003.7 milliseconds” when the number wobbles between runs.
Attach Evidence
Keep the saved table and the raw results file available. If anyone doubts a conclusion, you can reopen the evidence and show how the numbers were found. Trust in test results grows when the work can be inspected.
47Frequently Asked Questions
The Summary Report keeps light running totals and shows standard deviation and data sizes. The Aggregate Report keeps response times so it can show the median and percentile lines, and so it uses more memory.
Percentiles need the actual response times to be remembered and sorted. The Summary Report forgets each sample after updating its totals, which is why it stays light.
It has no screen to draw on there, but you can save a results file during the run and open it in the report afterwards. A console summariser also prints progress lines during the run.
Transaction rows are counted beside the requests inside them. The Total adds both, so the count looks inflated.
Probably no assertions exist, so error pages with success codes count as successes. Add content checks and look at Avg. Bytes for sudden changes.
No. Timers pause before the sampler starts, so the pause is not part of the measured response time. It does lower the throughput, though.
Run a short warm-up first, clear the table, and measure during steady state. Or save raw results and analyse only the steady window.
No. Use the save table button for the table, and set a filename on the listener to save raw samples.
Request names probably contain changing values, such as ids or times. Use fixed names so samples group together.
No. For graphs, use the HTML dashboard report generated from a results file, a backend listener with an external dashboard, or the graph listeners for small tests.
It depends on your goals, but a value much smaller than the average means steady behaviour, while one as large as the average means very uneven times.
Read it for overall error rate and throughput, but check each row before trusting the Total average, which blends different requests.
48Summary and Key Takeaways
The Summary Report is the scoreboard of a JMeter test: eleven columns, one row per label, and a Total. It is light, quick, and honest only when the test behind it is honest.
- The Summary Report keeps small running totals instead of every sample, which makes it light enough for long tests.
- Read the table in order: counts, Error %, throughput, speed, then bytes, and never trust speed before errors are understood.
- Average alone misleads. Read it beside Min, Max, and Std. Dev., and use the Aggregate Report or dashboard for percentiles.
- A zero error rate is only as honest as your assertions, and a sudden drop in Avg. Bytes can reveal silent failures.
- Clear labels decide the quality of the report: unique, stable, ordered, and free of changing values and secrets.
- Run big tests in command line mode, save raw results with dated names, and clear the table between runs.
- Compare against a baseline, watch server and generator health beside the table, and test only systems you are allowed to test.