A test case review looks for the missing case

A test case review that starts with the cases finds typos. Starting with the requirement finds the missing case and the case that cannot fail.

Six glass test cards leave one orange empty slot in an incomplete ring

A QA lead handed a colleague’s test cases to review before a release reads them top to bottom and corrects the steps. That review finds typos. The finding worth having is the case that is missing, and nothing in the suite points at it; only the requirement does, which is why the review starts there.

The missing case is found from the requirement

A suite is a list of what somebody thought of. Reading it tells the reviewer what is covered and nothing about what is not, because an absent case leaves no mark in the document. Reviewers who read the cases first end up reviewing the writing: the steps get tightened, the titles made consistent, and the suite comes back looking better with the same holes in it.

The review that finds the hole runs the other way round. The reviewer reads the requirement, or the story and its acceptance criteria, and writes their own list of conditions before opening the suite: the limits the requirement states, the combinations of conditions that change the outcome, the states in which the same action means something different, and what must not happen. Then the suite is diffed against that list. A condition on the reviewer’s list with no case against it is the finding, and it is the one finding an author cannot make about their own work, because the author’s list is the suite.

That order has a cost. The reviewer has to know the requirement well enough to enumerate its conditions, which takes longer than reading twenty cases, and it is why a review by somebody who does not know the feature is a proofread with a different name.

What a review catches that a run never will

A run answers one question: does the build do what the case predicts. It says nothing about whether the prediction was worth making. The defects that live inside the case itself pass every run, which is how they survive until a release goes out with the case green.

Defect in the caseWhat a run showsWhat the reviewer asks
A case that cannot failGreen, every releaseWould this fail against the build from before the feature existed?
An expected result copied from the buildGreenWhere in the requirement does this outcome come from?
Two conditions in one caseGreen, or one failure nobody can attributeWhich condition does the verdict belong to?
Test data that lives in the author’s headGreen for the author, failed for everyone elseCould I run this with the account and data named here?
A precondition written as a stepGreen, slowlyDoes the run start where the case says it starts?
A negative condition with no caseGreenWhat does the requirement say must not happen?

The first row is the one to check first, and it has a mechanical test: a case that would also pass against the build from before the feature is describing the build rather than the requirement. The second row is the same defect caught earlier. An expected result the author wrote by looking at the screen is the build acting as its own oracle, and it can be spotted because the requirement contains that sentence nowhere.

The fourth row is the one most reviews skip, because the reviewer knows the same accounts the author does. The test is whether the test data the case depends on is named in the case or in a fixture the case points at. A case that says “a valid code” was written for one afternoon.

A review has three verdicts, and one of them is removal

Most reviews only add. A reviewer who returns a suite with more cases in it than they received looks diligent, and a suite that only ever grows is how a test suite comes to spend its run time checking the same login form a dozen ways. The verdicts a review can give on a case are accept, rewrite and remove, and the third needs a reviewer because deleting a case is a verdict authors do not pass on their own work. Add, the fourth row below, is a verdict on the suite rather than on a case.

VerdictWhen it appliesWhat goes back to the author
AcceptThe expected result traces to the requirement and a stranger could run itNothing; the case is recorded as reviewed against that version of the requirement
RewriteThe condition is right and the case does not reach itThe condition, and which defect in the table above the case has
RemoveThe case duplicates another, cannot fail, or predicts a requirement that no longer existsThe reason, because a case whose removal is unexplained gets rewritten from memory next quarter
AddThe reviewer’s condition list has an entry with no caseThe condition only; the author writes the case, since the author maintains it

The last row carries a rule about who writes what: a reviewer who writes the missing case has taken over authorship of the suite, and the next review of it is a review of their own work.

Read the last release’s failed runs before the cases

The cheapest evidence a reviewer has is what the suite produced last time. Every case that failed in the previous release and was filed left a ticket, and the ticket’s fate is a verdict on the case. A failure that was fixed was a case doing its job. A failure closed as irreproducible is either a defect that got away or a case with a weak expected result or an unreachable precondition, and a reviewer can usually tell which by reading what the ticket carried. Our QA checklist asks that a regression run’s failures be triaged as real defects or as test defects, and the test defects from the last round are the list a review opens with.

That reading is only possible when the failed run was filed with what the run saw. A ticket that gives the case number and nothing else cannot tell the reviewer whether the runner hit a real defect on an unstated browser or ran the case with the wrong data. A failed run filed through evidence capture on the page under test keeps what that run saw, the browser it ran on, the path it was on and the console and requests at the moment of failure, so a reviewer a month later can tell an unstated browser from wrong data without re-running the case.

A case whose failures keep closing as irreproducible has a pattern the reviewer should name: the same missing precondition, or the same data nobody else holds, or an outcome two runners read differently. Those cases go to the rewrite column first.

The review is an exit criterion, not a release step

A review scheduled the week before release finds the missing case after the time to write and run it has gone. What the reviewer then holds is a decision about risk, ship without the case or slip, that the author cannot make and the reviewer was not asked to make.

The way out is timing rather than speed. The review belongs at the point where the requirement is settled and the cases are written, as the exit criterion of test design and the entry criterion of the run, so that a missing case is a task on the board rather than a release decision. A team that reviews only before release will keep finding its gaps at the moment they cost the most.

The condition list from the first section has to outlive the review. A review leaves no artefact unless the reviewer writes one, and a review made against a requirement that has since changed is indistinguishable from no review at all. Recording which version of the requirement the suite was reviewed against is the only thing that lets the next reviewer diff instead of starting again, and it is the reviewer’s to record, because nobody else was in the room.

Common questions

What does a test case review check?

Whether every condition the requirement states has a case, whether each expected result traces to the requirement rather than to the current build, whether a case could fail at all, whether a stranger could run it with the data and account it names, and whether any case duplicates or contradicts another. Step wording is checked last.

Who should review test cases?

Somebody other than the author who knows the requirement well enough to list its conditions without opening the suite. A reviewer who does not know the feature can tighten the steps and nothing else. The product owner is a useful second reviewer for the expected results alone, since those are claims about what the feature should do.

How is a test case review different from running the test cases?

A run checks whether the build does what the case predicts. A review checks whether the prediction was worth making: whether it comes from the requirement, whether it could fail, and whether anything the requirement demands has no case at all. Defects in the case itself pass every run, which is why they need a reviewer.

When should test cases be reviewed?

When the requirement is settled and the cases are written, as the exit criterion of test design and the entry criterion of the run. A review held the week before release finds the missing case after the time to write and run it has gone, and turns a gap into a release decision.

What is a test defect?

A test defect is a failed run whose cause is the case rather than the build: a guessed expected result, test data that expired, a precondition the runner could not reach, or two conditions sharing one verdict. Triaging each failure as a real defect or a test defect gives the next review its starting list.

Should a test case review remove cases?

A review that only adds produces a suite that only grows, and a suite that grows without pruning spends its run time on duplicates. Removal is the verdict an author will not give their own work, so it is the reviewer's, and the reason for each removal is recorded so the case does not quietly come back.

The Notarus team

The people who build Notarus. We write up the decisions behind the product when the reasoning is worth more than the changelog line.

Keep reading

Reports with the evidence attached.

Start free, one script tag.

<script src="…/widget.js" data-key="pb_pub_…">