Smoke testing
Smoke testing is a small, fixed set of checks run right after a build is deployed, deciding whether that build is worth anyone else’s time. The page opens with one shop’s finished suite — eleven checks, what each proves and what a red result stops — then covers where the term comes from, what belongs in the suite, how it differs from health checks and monitoring, where it runs, the names people confuse, and four deployments where the check was missing or ignored.
- It answers
- Is this build worth testing?
- Time budget
- Under 5 minutes
- A red result
- Stops the next step
One shop’s smoke suite on one screen — eleven checks, what each proves, what a red result stops
Nobody opens a page about smoke testing for the history of the word. They open it because a pipeline needs a suite, or because the suite they have takes forty minutes and nobody waits for it. Below is a finished one, for the online shop whose order assistant the AI-testing pages test. It runs after every deploy to every environment. Rows 1–2 ask whether this is the build that was deployed, 3–6 whether it is connected, 7–8 whether a person can get in, and 9–11 whether the flow that earns the money completes. Later sections cite the rows by number.
| # | Check | Passes only if | Time | Red means |
|---|---|---|---|---|
| 1 | Every instance runs the deployed build | GET /version on each of the six app instances returns commit a41f9c2 — asked of every instance, not of the load balancer | 2 s | The deploy did nothing, or did it on some servers only |
| 2 | Browsers get the new interface | The home page references the new bundle app.a41f9c2.js, and the bundle loads | 3 s | A CDN or a cache is serving last week’s front end |
| 3 | The service is ready | /ready reports the database, the cache and the queue, each answering within its timeout | 2 s | A missing secret or connection string |
| 4 | Payments answer | An authentication call with this environment’s keys succeeds — sandbox keys in test, live keys in production | 3 s | The wrong keys for this environment; the shop cannot take money |
| 5 | Search is filled | “blue jumper” returns SKU 30417 | 4 s | An empty or stale index |
| 6 | Email goes out | The provider accepts a message to the smoke inbox; in production, a dry run | 5 s | Order confirmations will silently not send |
| 7 | The home page renders | A known product name appears in the HTML, and no error banner does | 3 s | A 200 response with an error page inside it |
| 8 | A person can sign in | The smoke account signs in through the real login form | 12 s | Nobody can do anything behind the login |
| 9 | Checkout completes | Search → product → cart → checkout with the test card → an order number | 70 s | The shop cannot take orders |
| 10 | The order reaches the warehouse | The new order appears in the order history and in the warehouse API | 15 s | Orders are taken but never shipped |
| 11 | The order assistant is wired | Asked “where is order” about the order from row 9, it calls get_order with that number, and the reply contains the status the tool returned | 20 s | The assistant’s tools are not connected in this environment (Testing LLM products, row 4) |
A gate, not a level of testing
Unit, integration and end-to-end are the layers of the pyramid: they describe how much of the system a test touches. Smoke is not one of them. The ISTQBInternational Software Testing Qualifications Board — testing certification bodyThe international body behind the most widely taken software-testing certifications, which also publishes a glossary of testing terms. Its definitions are a common reference in interviews and contracts; they fix vocabulary, not how a team has to work.All terms glossary calls it a test type and defines it by its purpose — “to gain sufficient confidence that a test object is ready for planned testing”. The rows above show what that means in practice. Row 1 is a plain HTTPHyperText Transfer Protocol — the protocol of the webThe protocol browsers and servers talk in: the client sends a method and an address, the server answers with a status code and a body. It keeps no memory between requests — every request stands alone, which is why anything that must be remembered is carried explicitly.All terms request, row 5 an APIApplication Programming Interface — contract between programsThe rules one program follows to call another: which requests it may send, in what shape, and what comes back. To the caller it is a contract — everything behind it stays a black box, which is exactly what lets the other side be rewritten without breaking you.Full article →All terms call, row 9 a browser journey and row 11 a conversation with a model. What they share is the question, and the question is about the build rather than about any one feature.
The term reached software through Microsoft’s daily builds. In 1996 Steve McConnell described the practice in IEEE Software: every file compiled and linked into the product every day, and the result put through a smoke test — “a relatively simple check to see whether the product ‘smokes’ when it runs”. The image is an electrician’s: switch a new board on and watch for smoke before measuring anything. McConnell called the smoke test the sentry against creeping integration problems, and wrote that the daily build has little value without it.
What belongs in it — one rule, and the budget that enforces it
There is one selection rule, and it is worth stating as a sentence you can hold any candidate against: include a check only if its failure means nobody can do useful work on this build. Not “this is important”. Not “this broke once”. If the check fails and a tester could still spend a productive afternoon, it belongs in the regression suite instead. Applied honestly, the rule gives between five and fifteen checks for an ordinary product — the shop has eleven.
| Candidate check | In the smoke suite? | Why |
|---|---|---|
| A user can sign in | Yes — row 8 | Nothing behind the login can be tested if it fails, so one check blocks the whole build. |
| Checkout completes once, on the happy path | Yes — row 9 | Proves the assembled system can do the thing it exists for, which no single probe can tell you. |
| Every dependency answers | Yes — rows 3–6 | A missing connection string is the commonest reason a fresh environment is useless. |
| Every instance runs the deployed commit | Yes — row 1 | Cheap, and it catches the deploy that silently did nothing — the failure that wastes the most time. |
| Validation messages on the registration form | No | Real work, but a tester can carry on around it. Regression suite. |
| The bug from the last release, re-checked | No | That is confirmation testing, and afterwards a permanent regression case. Smoke is not where memory lives. |
| The sales report that takes four minutes to build | No | One check would eat almost the whole budget, which is what makes a gate useless. |
| Every intent of the order assistant | No | That is AI evaluation’s set. The gate asks one question with a known answer (row 11). |
How a check passes matters as much as which checks there are. A status code proves that something answered, not that it answered correctly: a page that shows “Something went wrong” inside a perfectly good 200 passes every status check ever written. So each row asserts content — a commit hash, a product name, an order number, the status a tool returned. The column “Passes only if” is the one teams most often leave out.
The time budget is not a preference; it is the mechanism. A gate works only if its answer arrives before the decision it informs, and the decision here is whether the next person starts. Under five minutes is a good target, and under ten is a ceiling you can still defend. Beyond that people stop waiting, start in parallel, and the gate becomes a report that arrives after the damage.
Here the page disagrees with the article that named the practice, and the disagreement is worth keeping in view. McConnell expected the smoke test to grow with the system, from seconds at first to “30 minutes, an hour, or more”. In 1996 that was sound: the build ran once a night, and a smoke test that finished before the testers arrived in the morning was on time. A team that deploys ten times a day has a different clock. The next person starts minutes after a deploy, so the answer has to come in minutes, and the suite has to stop growing. The purpose is the same; the clock decides the size.
Health checks, smoke tests and monitoring answer different questions
Most platforms already run checks against a service, and teams sometimes count those as their smoke suite. They are not the same thing, and the difference is what each is allowed to conclude. Kubernetes defines three probes. A startup probe waits for a slow container to finish starting. A liveness proberestart-if-stuck checkA periodic check the platform runs against a container to decide whether to restart it, meant to catch a process that is stuck, such as a deadlock. It should test only the process itself: point it at a dependency, and a slow database restarts every container at once.Full article →All terms decides when to restart a container — a deadlock is the documentation’s example. A readiness probecan-it-take-traffic checkA periodic check the platform runs to decide whether a container should receive traffic; while it fails, requests go to other instances and nothing is restarted. It is the right place to check dependencies, but it still asks about one instance, not about whether the product works.Full article →All terms decides whether the container receives traffic at all. All three ask about one process, and none asks whether a customer can buy a jumper.
| Check | Who runs it | The question | On failure | What it cannot see |
|---|---|---|---|---|
| Liveness probe | The platform, every few seconds | Is this process stuck? | Restart the container | Anything outside the process |
| Readiness probe | The platform, every few seconds | Can this instance take traffic now? | Stop sending it requests | Whether the product works end to end |
| Smoke suite | The pipeline, after every deploy | Is this build worth anyone’s time? | Stop the next step; in production, roll back | Whatever breaks later without a deploy |
| Synthetic monitoring | A scheduler, every few minutes, from outside | Does it still work for a customer right now? | Page the person on call | Why — it detects, it does not diagnose |
The same checks as the smoke suite, run on a schedule against production, are synthetic monitoring. They find what no deploy caused — a certificate that expired at three on a Sunday morning, a payment provider that changed something on its side. In the diagram, that is the only column that catches the certificate. The two are worth keeping as one set of scripts with two schedules: what the gate checks after a deploy is exactly what you want to know every five minutes afterwards.
Where it runs — one suite in five places, with five consequences
Most teams run their smoke suite in one place, usually after a deploy to a test environment. The same scripts are worth more than that, because they answer a slightly different question in each environment, and running them again costs minutes. What changes from place to place is which rows can run and what a red result is allowed to do.
| Place | Rows that run | What it mostly catches | A red result |
|---|---|---|---|
| The preview of a pull request | 1–3 and 7–9, against throwaway services | Code: a missing route, a crash on start | The pull request cannot merge |
| Test | All eleven | The build with the team’s configuration | The hand-over to testers stops |
| Staging | All eleven | The environment: secrets, keys, DNS | Promotion to production stops |
| Production, first instances | 1–8 and 11; row 9 with a test product, cancelled and refunded automatically | What only production has: live keys, real traffic | Automatic rollback, before the rest of the fleet updates |
| Production, every five minutes | 2–9 | What breaks without a deploy | The person on call is paged |
Smoke before the merge
- Runs against a preview environment built from the branch.
- Answers “did this change break the basics” while the author is still there to fix it.
- The cheapest feedback there is, and blind to everything about the real environment.
- Fails for code reasons — a missing route, a broken build, a crash on start.
Smoke after the deploy
- Runs against the environment that was actually deployed, with its real configuration.
- Answers “did this deployment succeed”, which is a different question from “is the code correct”.
- The only one of the two that can trigger a rollback, because only it knows what is live.
- Fails for environment reasons — a missing secret, a stale image, an unreachable dependency.
Both are worth having, and they are not substitutes, because they fail for different reasons. If you can afford only one, take the run after the deploy. A broken branch costs one developer an hour; a broken environment costs a team a day, and in production it costs customers.
Smoke, build verification, sanity, confirmation — four names people swap
These words get swapped in interviews and in team chat, and the confusion is worth clearing up once. Three of them have a definition in the ISTQB glossary. Smoke testing is the purpose quoted above. A build verification test is “an automated test that validates the integrity of each new build and verifies its key/core functionality, stability, and testability” — the same gate, named for the build and required to be automated. Confirmation testing, also called retesting, is performed after a defect is fixed, to confirm that the failure it caused does not happen again. The fourth word, sanity testing, has no entry in the current glossary at all — which is why arguments about it never end.
Smoke
Triggered by a build or a deploy. A fixed set, the same every time. Its verdict decides whether anyone else starts work.
Build verification test
The same gate under the name ISTQB gives it in the context of builds: automated, run on every new build, checking that it is testable at all.
Sanity
No standard definition. In most teams: a short, unscripted look at the area a specific change touched, to decide whether deeper testing is worth booking.
Confirmation
Triggered by a fix. The exact steps from the bug report, re-run to show the defect is gone. Then it becomes a regression case.
Four deployments, and the check that was missing or ignored
None of these companies was short of tests. Each had a check that could have stopped the deployment, and each of the four lost it in a different place: the check did not exist where it was needed, it existed and was skipped, it worked and nobody listened, or it ran after everyone already had the change.
| Deployment | What happened | The smoke check, and where it was lost |
|---|---|---|
| Knight Capital, 1 August 2012 | A technician copied new trading code to eight servers by hand and missed one. On the eighth, a repurposed flag woke code unused since 2003. Before the open, 97 automated emails reading “Power Peg disabled” went out; they were not designed as alerts. In about 45 minutes the firm lost more than $460 million. The Risk Management page tells it in full. | Row 1: ask every server which build it runs. The emails are the other half of the lesson — a signal that reached people and stopped nothing. |
| Azure Storage, 18 November 2014 | A performance change, validated in test and pre-production for Table storage front-ends and run on part of production for weeks, was enabled across the whole infrastructure at once — and, by mistake, on Blob storage front-ends, which went into an infinite loop. Health checks and incremental “flighting” existed. The engineer judged the step low-risk, and the tooling did not enforce the policy. | A smoke run on the first slice of Blob front-ends, which needed a first slice to exist. Microsoft’s fix moved the decision out of people’s hands: the policy is now “enforced by the deployment platform itself”. |
| Google Compute Engine, 11 April 2016 | A configuration bug removed every Compute Engine IP block from the network configuration. The canary step deployed it to one site and “correctly identified that the new configuration was unsafe”. A second bug did not pass that verdict back, so the progressive rollout went on. From 19:09 Pacific time, inbound traffic to Compute Engine in every region dropped by more than 95%, for 18 minutes. | The check worked; the wire to the decision did not. Test the gate itself: make a smoke check fail on purpose and confirm that the rollout stops. |
| Cloudflare, 2 July 2019 | A new firewall rule passed CI and went out at 13:42 UTC through a system that reaches every server in seconds. The operating procedure let rule changes skip the staged rollout ordinary releases go through — an employees-only site, then a share of free traffic, then canaries. The rule’s regular expression exhausted CPU worldwide. A synthetic test of the firewall paged three minutes later; traffic recovered at 14:09. | The synthetic test was the right check in the wrong place — after everyone had the change. The same check on the first site, before the rest, is a smoke gate. |
Where it degrades
The honest limit is that a smoke suite checks one build, on the happy path, at one moment. It cannot see a code path that nothing has exercised yet. In June 2025 a new check in Google Cloud’s Service Control had been in production for two weeks, with every check of the build passing, when a policy change with blank fields finally reached it and took down services around the world; the Release Planning page tells that case. Configuration and data change after the deploy, and they need gates of their own. A green smoke run says the build is worth testing, never that it is correct.
Flakiness is where smoke suites usually rot. A flaky check in a regression suite is annoying; in a smoke suite it is corrosive, because the whole mechanism depends on a red result being believed without discussion. One check that fails at random twice a week teaches everyone to re-run the suite instead of reading it, and that habit costs you the real failure. The policy that works is blunt: a check that fails without a real cause is quarantined the same day — taken out of the gate, still run and reported separately — and then fixed within a fixed window or deleted.
- A suite of HTTP 200 checks, which a page with an error inside it passes.
- Asking the load balancerspreads requests across serversA server or managed service that receives incoming requests and spreads them across several copies of an application, skipping any copy that fails its health check. It is also one more network hop with its own timeouts, so its settings and the application’s have to agree.All terms for the version, so seven right servers hide the eighth.
- Smoke run by hand when someone remembers; the day it is skipped is the day it was needed.
- Results posted to a channel with no consequence attached, so a red run is information rather than an instruction.
- A gate whose red result has never been seen to stop anything, because nobody has tested the gate.
- The suite left unchanged in production while it writes real data — one forgotten test order per deploy becomes a finance question by the end of the quarter.
- Twenty reasonable additions, and a suite that now takes forty minutes and is still called smoke.
- An owner called “QA”, which is a department, not a person who fixes a red run today.
- Treating a green run as a statement about quality.
When to use it
Use it when
- Right after every deploy to every environment, including production, where a read-only subset plus one safe order is enough.
- As the gate before handing a build to anyone else — testers, a demo, a customer environment.
- Wired to an automatic rollback in production, so the answer produces an action rather than a notification.
- On a schedule against production, as synthetic monitoring, to catch what no deploy caused.
Avoid it when
- As a home for cases about bugs that must not return — that is the regression suite’s job.
- For anything that takes minutes on its own, however valuable: one such check eats the budget.
- As evidence that a release is ready. A green run says the build is testable, not that it is correct.
- With any check that has ever been flaky and was left in anyway; the gate is worth exactly its credibility.
Sources and method
What this page stands on
- 10 sources
- 5 documented failures
- Checked October 17, 2026
The failures this page learns from
the deployments in “Four deployments, and the check that was missing or ignored”, and the limit in “Where it degrades”- Regulator reportSEC — Order, Release No. 70694: Knight Capital Americas LLC (opens in a new tab)U.S. Securities and Exchange Commission · Oct 16, 2013
- PostmortemJason Zander — Final Root Cause Analysis and Improvement Areas: Nov 18 Azure Storage Service Interruption (opens in a new tab)Microsoft Azure · Dec 17, 2014
- PostmortemGoogle Compute Engine Incident #16007 — Connectivity issues in all regions (opens in a new tab)Google Cloud Status Dashboard · Apr 13, 2016
- PostmortemJohn Graham-Cumming — Details of the Cloudflare outage on July 2, 2019 (opens in a new tab)Cloudflare · Jul 12, 2019
- PostmortemGoogle Cloud — Service Control incident report (opens in a new tab)Google Cloud Service Health · Jun 13, 2025
Practices and where the terms come from
the definitions, the origin of the term, and the probes in “Health checks, smoke tests and monitoring”- StandardISTQB Glossary — smoke testing (opens in a new tab)ISTQB
- StandardISTQB Glossary — build verification test (opens in a new tab)ISTQB
- StandardISTQB Glossary — confirmation testing (opens in a new tab)ISTQB
- ArticleSteve McConnell — Daily Build and Smoke Test (opens in a new tab)IEEE Software · Jul 1996
- DocumentationLiveness, Readiness, and Startup Probes (opens in a new tab)Kubernetes documentation
Researched with Claude. Finding and cross-checking the primary sources was done with Claude (Anthropic). Selection, writing and fact-checking: the Anatomy of IT Product editors.
Found this useful?
Share it with someone who is working on the same problem.