Failed and Blocked Tests
A test fails when it runs and the actual result differs from the expected result. A test is blocked when it cannot run, or cannot reach the step it checks, because something outside the test is in the way: a defect in an earlier step, an environment that is down, or missing data or access. If adding a bundle to the cart fails, the test of adding bundles fails, and the bundle discount test, which needs a bundle in the cart, is blocked.
A failed result does not yet prove a product defect: ISTQB describes test execution as comparing actual with expected results and analysing each anomaly for its likely cause before reporting it.
Why it matters
A failed test wrongly reported as a product defect wastes a developer’s time, gets rejected and costs the next report some trust. Dismissing a real failure as "just the environment" is worse: the defect reaches users.
Blocked tests carry a quieter risk: neither passed nor failed, the features behind them are untested. A run with 40 passed and 30 blocked tests says far less about quality than its pass count suggests.
Why a test fails: product, test or environment
A difference between actual and expected result has three possible sources: a product defect (the software does not behave as the test basis says), a test problem (the test case, script, expected result or execution is wrong), or an environment or test data problem (the build, services, configuration or data are not what the test assumes). The last two are false positives, as in the lesson on error, defect and failure.
Rule out the cheaper explanations first, in this order. A failure that gets through all four questions is reported as a product defect; one that gets through the first three but does not repeat is still reported, marked as intermittent.
- Did the test reach the step that checks its expected result? If not, it is blocked, not failed.
- Were the build, services, configuration and data what the test needs? An older build or an already used single-use coupon fails tests the product would pass. The next lesson, on environment and test data problems, covers their signs and how to record them.
- Are the steps and expected result right for the current requirement, and were they followed? A test still expecting "Checkout" after an approved rename to "Pay now" is wrong, not the product.
- Does the failure repeat when you reproduce it, as in the previous lesson? If not, record it as failed, never as passed, and report it as intermittent with the evidence and the rate.
Answer: No
Outcome: BlockedRecord Blocked with the blocker’s ticket ID and owner; run it once the blocker is removed.CautionAnswer: Yes
Question 2: Were the build, services, configuration and data what the test assumes?Answer: No
Outcome: Environment or test data problemNot a product defect. Environment: record Blocked against an environment ticket, tell the owner, re-run after the fix. Test data: fix or recreate the data, note the cause on the result, re-run as a new execution.Answer: Yes
Question 3: Are the steps and expected result right for the current requirement, and were they followed?Answer: No
Outcome: Test problemCorrect the test case or script against the test basis, note why, and re-run it.Answer: Yes
Question 4: Does the failure happen again when you repeat the test?Answer: No
Outcome: Intermittent failureRecord Failed with the evidence and the rate, report it marked as intermittent and never mark it passed.CautionAnswer: Yes
Outcome: Product defectRecord Failed, report the defect with evidence and link it to the test.Fail
An order for checking, not a law: when the evidence clearly points to one cause, start there.
Blocked tests: when a test cannot reach its check
A blocked test has produced no result about what it checks. Typical blockers are a defect in an earlier step or in a feature the test depends on, a service that is down, missing data or permissions, and a feature not yet deployed.
The rule: the failure belongs to the test whose own check failed, and every other test that needed that step is blocked by it. If login fails, the login test fails and the checkout tests are blocked. Marking them all failed would show one defect as many failures and hide that those features were never checked. Some teams record them as failed with a link to the defect instead; agree one convention.
- Look for another valid route first, such as creating the order through the API, and note any workaround in the result.
- When the blocker is removed, the blocked tests run for the first time. They are not retests, and may reveal defects the blocker was hiding: the defect masking from the lesson on error, defect and failure.
What to record for each result
A bare "Failed" forces someone to repeat your work.
- Every result: test case ID, run, build, environment, tester and date.
- Failed: the failing step, actual next to expected, evidence (screenshot, log, response), the cause category and the defect ID.
- Blocked: what blocks it and at which step, the blocker’s ticket ID and owner, and since when.
- Test problem: what was wrong, how it was corrected and reviewed, and the corrected result, with a link to any requirement change.
- Retest: the defect ID, the build with the fix, the result and its evidence, as a new execution so the original failure stays in the history.
Worked example: triaging one checkout run
Six checkout tests run on build 4.12.0 in staging, and five do not pass at first. The log shows the results after triage.
- TC-206 checks adding a bundle to the cart, so the HTTP 500 error (a server-side error) is its own failure: Failed, defect DEF-480. TC-203 checks a bundle discount and stops at step 2: Blocked by DEF-480, not a second defect.
- TC-202 reached its check in a healthy environment, its expected total follows the requirement and the failure repeated: Failed, product defect DEF-482.
- TC-204 stopped at payment: the third-party payment sandbox returned 503 (service unavailable) for every card and its health check failed too. Blocked by environment ticket ENV-77, no product defect.
- TC-205 expected "Checkout", but an approved design change had renamed the button "Pay now": a test problem. The test case was corrected against that change and went through the team’s usual review as TC-205 v2; the tester then re-ran it with the change linked: Passed.
- Result: 2 passed, 2 failed, 2 blocked, and two defect reports instead of five.
Run: checkout regression, cycle 3 Build: 4.12.0 Environment: staging
Test Result Step Note Link
TC-201 Passed - - -
TC-202 Failed 4 10% coupon: total 115.00, expected 103.50 DEF-482
TC-203 Blocked 2 Cannot add bundle to cart (HTTP 500) DEF-480
TC-204 Blocked 5 Payment sandbox returns 503 for every card ENV-77
TC-205 Passed 3 Re-run after test fix: label is now "Pay now" TC-205 v2
TC-206 Failed 2 Adding a bundle to the cart returns HTTP 500 DEF-480Retesting after a fix
Confirmation testing (retesting) checks a reported fix; see the lesson on confirmation and regression testing. When DEF-480 is fixed in build 4.12.1, TC-206 is retested and TC-203 runs for the first time. If TC-203 then fails on the discount, that is a new defect the blocker was hiding, not a reopened DEF-480.
- Check that the build under test contains the fix (see the defect or the release notes); a retest on the old build proves nothing.
- Repeat the original steps, data and conditions plus a few nearby variations, such as other bundle types, and record the retest as a new execution.
- If it passes, update the defect as your lifecycle defines; if it fails the same way, reopen it with the new build and evidence; if it fails differently, report a new defect and link the two.
- Then run the tests the defect was blocking and the regression tests selected for the change.
Common mistakes
- Reporting every failed test as a product defect without first checking the environment, data and expected result.
- Blaming "the environment" or "flakiness" without evidence, or marking a test passed after a lucky second run.
- Marking tests failed that never reached their own check, so one defect looks like many failures.
- Retesting on a build without the fix, or overwriting the original failed result.
- Changing the expected result to match whatever the product does, without checking the requirement.
The QA perspective
Triage right after the failure, while environment and data are unchanged, starting with the cheap checks: the build, the services, the test case against the current requirement. When unsure, ask the developer with the evidence in hand. The category tells you whom to talk to: the developer, the test author, the environment owner, or the product owner when the requirement is unclear.
Report blocked tests in the daily status, grouped by blocker: "12 checkout tests blocked by DEF-480 since Tuesday" lets the test lead push for one fix. If blocked tests threaten the exit criteria, say so early, so the team can fix the blocker, change the plan or accept the risk knowingly.
Practice exercise
Triage five results from a booking app run
You run cycle 2 of a clinic booking app on build 2.7.0, and five tests did not pass. Classify each note as a product defect, a test problem, an environment or data problem, a blocked test or an intermittent failure, and state the result to record and the next action. Then plan the retest for when the booking defect is fixed.
Clinic booking app, build 2.7.0, test environment, cycle 2
TC-31 Register a patient: welcome e-mail not received. The mail service
status page shows the test mail server stopped at 09:00.
TC-32 Cancel a booking: cannot start; step 1 (book a slot) shows
"Slot unavailable" for every free slot.
TC-33 Book a slot: "Slot unavailable" for every free slot. Repeated
3 times with 2 doctors and new users. Server log: NullPointerException.
TC-34 Doctor list: expected 8 doctors, 9 shown. The clinic added the
9th doctor last week, approved in change request CR-19.
TC-35 Booking history: after logging in as patient B, one booking of
patient A was listed. Seen once; not repeated in 5 attempts.Show the model answer
TC-31: environment problem, no product defect. A stopped mail server says nothing about registration: record it as blocked by an environment ticket, tell its owner and re-run it later.
TC-33: product defect. It reached its check, the server log shows an application exception rather than an environment outage, its expected result follows the requirement, and it repeats with other doctors and users. Record Failed and report it, say as DEF-501, with steps, message, log line and build.
TC-32: Blocked by DEF-501, because booking, the check of TC-33, fails. A second report would duplicate DEF-501.
TC-34: test problem. The product follows CR-19: update the test case to 9 doctors, link CR-19 and put the change through the team’s usual review of the case, then re-run it and record the corrected result.
TC-35: intermittent, but not to be dropped: seeing another patient’s booking is a privacy problem even once. Record Failed with the screenshot, time, both accounts and the five attempts that did not repeat it, report it as intermittent and tell the developer now.
Retest: once DEF-501 is fixed, confirm the build contains the fix, retest TC-33 as a new execution with the same and other doctors, and update DEF-501; then run TC-32 for the first time and the selected regression tests.
Frequently asked questions
Who unblocks a blocked test, and how long can it stay blocked?
The owner of the blocker removes it: the developer for a defect, the environment owner for a service that is down, the person who grants access for missing permissions. Your part is to record the blocker’s ticket ID, owner and since when, look for another valid route, and report the blocked tests in the daily status grouped by blocker. There is no fixed limit: once blocked tests put the exit criteria at risk, tell the test lead, so the team can fix the blocker, change the plan or accept the risk.
What if I cannot decide between a product defect and a test problem?
Go back to the test basis. If the requirement, the acceptance criteria or an approved change says what should happen, compare against that. If the test basis is silent or contradictory, ask the product owner or business analyst and record the answer in the test case before you report anything.
Can I re-run a failed test until it passes?
No. A pass on the second attempt does not cancel the first failure. Record both results, treat the test as intermittent and investigate; an intermittent failure in the product, such as a timing problem, is still a defect.
References
- ISTQB Certified Tester Foundation Level (CTFL) v4.0The foundation syllabus of software testing: test levels and types, test design techniques, test management and tools.
- ISTQB GlossaryThe standard definitions of testing terms — test case, regression testing, severity, priority, boundary value analysis and the rest.
- ISO/IEC/IEEE 29119-2:2021 — Software and systems engineering — Software testing — Part 2: Test processesThe test process model: organisational, test management and dynamic test processes, with their activities and outcomes.
Practise with Mutqan tools
Compare two texts line by line or word by word and highlight differences.
Compare two JSON documents semantically and highlight added, removed and changed values.
Check several API health endpoints at once and get status, latency and a pass/fail summary.
Compare two API responses (e.g. staging vs production) and list every structural and value difference.
Generate regression scenarios from a change description and a list of affected and related modules.
Go deeper
Your progress on this topic
Not started
Mark the topic complete when you have studied it and done the exercise.
Sign in to track your progress
Mark topics complete, continue where you left off and unlock specialisation exams.