QAAll levels

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.

#CheckPasses only ifTimeRed means
1Every instance runs the deployed buildGET /version on each of the six app instances returns commit a41f9c2 — asked of every instance, not of the load balancer2 sThe deploy did nothing, or did it on some servers only
2Browsers get the new interfaceThe home page references the new bundle app.a41f9c2.js, and the bundle loads3 sA CDN or a cache is serving last week’s front end
3The service is ready/ready reports the database, the cache and the queue, each answering within its timeout2 sA missing secret or connection string
4Payments answerAn authentication call with this environment’s keys succeeds — sandbox keys in test, live keys in production3 sThe wrong keys for this environment; the shop cannot take money
5Search is filled“blue jumper” returns SKU 304174 sAn empty or stale index
6Email goes outThe provider accepts a message to the smoke inbox; in production, a dry run5 sOrder confirmations will silently not send
7The home page rendersA known product name appears in the HTML, and no error banner does3 sA 200 response with an error page inside it
8A person can sign inThe smoke account signs in through the real login form12 sNobody can do anything behind the login
9Checkout completesSearch → product → cart → checkout with the test card → an order number70 sThe shop cannot take orders
10The order reaches the warehouseThe new order appears in the order history and in the warehouse API15 sOrders are taken but never shipped
11The order assistant is wiredAsked “where is order” about the order from row 9, it calls get_order with that number, and the reply contains the status the tool returned20 sThe 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 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 request, row 5 an 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.

A smoke suite exists to answer one question before anyone else spends time on a build: is it working well enough to be worth testing? The shop’s suite is eleven checks that take about two minutes — is this the build that was deployed, is it connected, can a person sign in, does one order go all the way through — and the answer routes the build either into testing or straight back out. What is deliberately absent matters as much: validating every field, walking error and edge paths, and re-proving bugs fixed last year all belong to the regression suite, which runs on a different schedule for a different reason. The way a smoke suite fails is accretion. Every case anyone adds is defensible on its own, and the sum eventually takes forty minutes, at which point the suite still passes and no longer works as a gate.

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 checkIn the smoke suite?Why
A user can sign inYes — row 8Nothing behind the login can be tested if it fails, so one check blocks the whole build.
Checkout completes once, on the happy pathYes — row 9Proves the assembled system can do the thing it exists for, which no single probe can tell you.
Every dependency answersYes — rows 3–6A missing connection string is the commonest reason a fresh environment is useless.
Every instance runs the deployed commitYes — row 1Cheap, and it catches the deploy that silently did nothing — the failure that wastes the most time.
Validation messages on the registration formNoReal work, but a tester can carry on around it. Regression suite.
The bug from the last release, re-checkedNoThat is confirmation testing, and afterwards a permanent regression case. Smoke is not where memory lives.
The sales report that takes four minutes to buildNoOne check would eat almost the whole budget, which is what makes a gate useless.
Every intent of the order assistantNoThat 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 decides when to restart a container — a deadlock is the documentation’s example. A decides whether the container receives traffic at all. All three ask about one process, and none asks whether a customer can buy a jumper.

CheckWho runs itThe questionOn failureWhat it cannot see
Liveness probeThe platform, every few secondsIs this process stuck?Restart the containerAnything outside the process
Readiness probeThe platform, every few secondsCan this instance take traffic now?Stop sending it requestsWhether the product works end to end
Smoke suiteThe pipeline, after every deployIs this build worth anyone’s time?Stop the next step; in production, roll backWhatever breaks later without a deploy
Synthetic monitoringA scheduler, every few minutes, from outsideDoes it still work for a customer right now?Page the person on callWhy — it detects, it does not diagnose
Platforms run checks of their own, and they are easy to mistake for a smoke suite. Each of the four checks here answers a different question, and the table shows what that means in failures. The liveness probe asks whether one process is stuck and restarts it, so it catches a deadlock and nothing outside the process. The readiness probe asks whether an instance can take traffic, which also catches a dependency it cannot reach, such as a wrong database password in a new environment. The smoke suite runs after a deploy and asks whether the product works: it is the only check that finds one server still running the old build, and it also catches a broken checkout and the wrong payment keys before anyone else meets them. Synthetic monitoring runs the same kind of checks on a schedule, so it is the only one that sees what breaks with no deploy at all — a certificate expiring in the night, an index rebuilt empty. None of the four replaces another.

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.

The shop runs one set of smoke scripts in five places, and each place answers a slightly different question. On the preview of a pull request, rows that need no real services catch code problems while the author is still there, and red blocks the merge. In test, all eleven rows check the build with the team’s configuration, and red stops the hand-over to testers. In staging the same rows mostly catch the environment — secrets, keys, DNS — and red stops promotion. On the first production instances they meet what only production has, live payment keys and real traffic, with row 9 run on a test product that is cancelled and refunded automatically; this is the only place a red result can roll a release back before the rest of the fleet has it, which is why it is drawn as the focus. Finally, production every five minutes is synthetic monitoring: the same scripts catch what breaks with no deploy, and red pages the person on call.
PlaceRows that runWhat it mostly catchesA red result
The preview of a pull request1–3 and 7–9, against throwaway servicesCode: a missing route, a crash on startThe pull request cannot merge
TestAll elevenThe build with the team’s configurationThe hand-over to testers stops
StagingAll elevenThe environment: secrets, keys, DNSPromotion to production stops
Production, first instances1–8 and 11; row 9 with a test product, cancelled and refunded automaticallyWhat only production has: live keys, real trafficAutomatic rollback, before the rest of the fleet updates
Production, every five minutes2–9What breaks without a deployThe 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.

Knight Capital deployed new trading code to its eight SMARS servers by hand in the days before 1 August 2012, and one server was missed. That server ran code a repurposed flag woke up, and in about 45 minutes after the 09:30 open the firm lost more than 460 million dollars. Two details make it a smoke-testing case. The first is how a version check is asked. One request through a load balancer lands on whichever server answers, so it reports the new build seven times in eight and hides the eighth; only asking every server, as row 1 of the shop’s suite does, returns seven new and one old and turns the gate red. The second is the 97 automated emails reading “Power Peg disabled” that went out before the open. They were a signal that reached people, but nobody had designed them as alerts and nothing they said stopped anything. A check without a consequence is half a gate.
DeploymentWhat happenedThe smoke check, and where it was lost
Knight Capital, 1 August 2012A 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 2014A 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 2016A 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 2019A 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 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

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.