skip to content

In a test cycle status report, why is a blocked case counted separately from a failed one?

level: juniorimportance: must knowfreq 58%

answer

  1. Two of the states never executed
  2. One is evidence about the product
  3. The other is about environment or data
  4. Pass rate has a denominator — which one?
  5. A block needs reason, owner and age

basics

~20 s

A failed case ran and gave the wrong result, so it is evidence about the product. A blocked case never ran, because something stopped it. Merging the two hides untested scope and blames the product for an environment problem.

solid answer

~50 s

Execution status is not a two-way split. A case is **passed** or **failed** only if it actually ran; **blocked** means it could not run because a precondition was missing, a dependency was down or a defect stands in the way; **not run** means it simply has not been reached yet. Only passed and failed are evidence about the product. Blocked is evidence about the environment, the data or the fix queue, and it needs a reason, an owner and an age attached or it silently rots. Collapsing blocked into failed inflates the apparent defect signal and points investigation at the wrong team. Collapsing it into passed, or quietly omitting it, hides scope that was never verified at all. The number that matters alongside a pass rate is how much of the plan is still unexecuted and why.

code

pseudocode · 13 lines
pseudocode
planned  = 418
passed   = 251
failed   = 12
blocked  = 37
not_run  = 118

executed = passed + failed              # 263
assert planned == executed + blocked + not_run

pass_rate_over_executed = passed / executed   # 0.954
coverage_of_plan        = executed / planned  # 0.629

report(pass_rate_over_executed, coverage_of_plan, blocked, oldest_block_age_days)

go deeper

for a junior

Be ready to name the execution states and say which two mean the case actually ran. Practise stating a pass rate out loud together with the share of the plan executed — interviewers listen for whether you volunteer the second number unprompted.

for a middle

Explain the arithmetic: planned equals passed plus failed plus blocked plus not run, and a pass rate over executed is a different statistic from coverage of the plan. Show how blocked rows carry a reason, an owner and an age so they escalate instead of accumulating.

for a senior

Demonstrate that you read the blocked column first, because blocks cluster on one cause and take out whole areas of the plan at once. Talk about state churn across builds and why a case failing on four consecutive builds is a stronger signal than today's snapshot.

for a principal

Own the reporting convention itself: which denominator the organisation uses, that blocked is never allowed to be a state without an owner, and that no summary is permitted to merge 'not tested' with 'tested and fine'. That convention is what stops status reports from drifting into comfort.

### The states, and the arithmetic behind them A cycle tracks every planned case in one of a small set of execution states. The usual set is **not run**, **passed**, **failed** and **blocked**, with **in progress** sometimes added for long cases. Two of these mean the case actually executed; two mean it did not, and that distinction is the whole point of the separation. The arithmetic is worth writing down because most reporting mistakes are arithmetic mistakes: ``` planned = passed + failed + blocked + not_run executed = passed + failed pass_rate = passed / executed <- denominator is executed, NOT planned coverage_of_plan = executed / planned ``` A pass rate computed over *executed* cases answers "of the things we managed to run, how many behaved". It says nothing whatsoever about the blocked and not-run remainder. Reporting the first number without the second is the single most common way a status report misleads without containing a false statement. ### Why blocked is a different kind of fact from failed A **failed** case is a claim about the product: it ran, it produced an oracle mismatch, and there is a result to investigate. It belongs to the development team's queue. A **blocked** case is a claim about everything *around* the product: the build was not deployed, the test data was not seeded, an upstream dependency is unavailable, an account could not be created, or a known defect sits earlier in the flow so the case behind it can never be reached. It belongs to whoever owns that obstacle, which is often not a developer at all. They also age differently. A failure is investigated once and either becomes a defect or becomes an invalid case. A block persists day after day and quietly grows: three cases blocked on Monday can be forty by Thursday if a dependency stays down. That is why a blocked entry is only useful with three extra fields — the **reason**, the **owner** of the obstacle, and the **age** of the block. Without them the state is a shrug. ### Blocked versus not run These are frequently confused. **Not run** is neutral: the case is still ahead of the cursor, and the cycle expects to reach it. **Blocked** is an obstruction: the case is at the cursor, or past it, and cannot proceed. The difference matters because not-run cases are a forecast problem (do we have time?) and blocked cases are an escalation problem (does someone need to unblock us?). A tool that lets a tester mark blocked without a reason will accumulate cases that are really just not run, and the escalation signal dies. ### A worked example An online bookstore checkout cycle plans 418 cases across cart, address, payment, tax and receipt. On day six the counts read: 251 passed, 12 failed, 37 blocked, 118 not run. Executed is 263, so the pass rate over executed is 95.4 percent — a number that looks like a nearly finished cycle. But executed is only 62.9 percent of the plan, and of the 37 blocked, 31 sit behind one obstacle: the seeded test data renders the order total in a locale-dependent format that the payment step rejects, so every case that reaches payment stops there. Read as two numbers, the report is honest: the parts we could reach are in good shape, and the entire payment-and-receipt half of the plan is unverified because of a data-format block that has been open for three days and belongs to whoever owns the seed data. Read as one number — "95 percent passing" — it is a report that will get a release shipped with its money-handling path untested. ### Re-tests and state churn When a block clears, the case does not become passed; it returns to **not run** and is executed normally. When a failure is fixed, the case is re-executed on the new build; the previous failure stays in the cycle's history but the current state is whatever the re-run produced. Teams that overwrite history lose the ability to see that one case has failed on four consecutive builds, which is a far stronger signal than one failure today. ### What an interviewer is listening for That you know the pass rate has a denominator and you can say which one you used; that you treat blocked as an escalation with an owner rather than a parking space; and that you never let "we did not test it" be reported in the same bucket as "we tested it and it worked".

  • A case was blocked on Tuesday and the obstacle cleared on Thursday. What state should it hold on Thursday morning?
    Not run. Clearing a block does not produce a result; it only makes execution possible again. The case goes back into the queue and takes whatever state its next actual run produces. Marking it passed because the obstacle disappeared is how untested cases end up counted as verified.
  • Besides the state itself, what should a blocked row carry?
    A reason in words, a link to the obstacle if one is tracked, the owner who can remove it, and the date the block started so its age is visible. Without an owner it is nobody's job to clear; without an age nobody notices that a two-hour block has become a four-day one.
  • If 95 percent of executed cases passed but a third of the plan is blocked or not run, what does the 95 percent tell you?
    Only that the subset you managed to reach behaved. It carries no information about the unreached third, and if the blocked cases cluster in one area — as they usually do, since blocks share a cause — the unverified part is not a random sample. Always quote it next to the share of the plan executed.

A failed case is a test drive where the car pulled to the left. A blocked case is a test drive that never happened because the keys were missing — telling the mechanic about it is a category error.

saying these in an interview costs you the question

  • Puts blocked cases in the failed bucket to keep the count tidy
  • Quotes a pass rate without saying how much of the plan ran
  • Leaves blocked entries with no reason, owner or age
  • Uses blocked and not-run interchangeably
  • Raises a product defect for a case that never actually executed
  • Marks a case passed once its blocker is removed

context