All insights
Test management

Writing Acceptance Criteria That Turn Into Test Cases

Vague acceptance criteria don't just read badly, they produce test cases nobody agrees on. Here's the same story written badly and well, side by side.

Sep 27, 20267 min read
Writing Acceptance Criteria That Turn Into Test Cases — Tesbo

A QA lead opens a ticket the morning before sprint planning and finds a single line: "user can filter search results." That is the whole acceptance criteria. Three testers write three different sets of cases from it. None of them agree on what "filter" even covers. The standup spends twenty minutes arguing about scope before anyone writes a line of test code. That twenty minutes happens every sprint, on every vague ticket, and it is entirely avoidable.

Acceptance criteria are the conditions a piece of work must meet to be considered done, written from the user's or business's point of view. A definition of done is different. It is the team's fixed checklist that applies to every ticket, things like "code reviewed" or "tests passing." Acceptance criteria change per story. A definition of done does not.

The same story, written badly and written well

Here is a user story about search filtering, written two ways.

Written vaguely: "As a user, I want to filter search results so I can find what I'm looking for."

That is a real ticket. It states a goal but gives no boundary. A tester reading it has no way to know which filters, what happens with zero results, or whether filters combine with each other.

Written well: "As a shopper, I want to filter search results by price range and in stock status, so I can narrow 200 results down to what I can actually buy today."

  • Given a search returns 40 or more results, when I apply a price filter of 20 to 50 dollars, then only items in that range show.
  • Given I apply both a price filter and the in stock filter, then results match both conditions at once.
  • Given a filter combination returns zero results, then the page shows a clear "no matches" message, not a blank screen.
  • Given I clear a filter, then the full result set returns without a page reload.

The difference is not length for its own sake. The good version names the specific filters. It states what happens at zero results, and it settles whether filters combine. Nothing in it is left for the tester to guess.

What each version produces once a tester picks it up

Hand the vague version to three testers and you get three different case sets. One tester assumes a single filter dropdown. Another assumes multiple filters that combine. A third assumes filters reset on every new search. None of them is wrong, because nothing in the ticket says otherwise. Now someone has to referee which interpretation ships.

In practice the vague version tends to produce about three cases. None of them has an expected result the team can agree on without going back to whoever wrote the ticket. That round trip costs a day, sometimes more if the product owner is out.

The well written version above produces seven cases that write themselves: one for each filter alone, one for combining filters, one for zero results, one for clearing filters, plus the edge of a single boundary price like exactly 20 dollars. Each case has an expected result nobody has to guess at, because the criteria already stated it.

  • The price filter alone at the boundary values.
  • The in stock filter alone.
  • Both filters combined.
  • Zero results state.
  • Clearing filters returns to the full set.
  • A boundary price exactly at 20 or 50 dollars.
  • Filters persisting or resetting on a new search, if the criteria specify which.

The test that tells you criteria are finished

There is a simple check for whether acceptance criteria are actually done: can someone who was not in the room write the expected result without asking anyone a question? If a tester who joined the team yesterday can read the criteria and know exactly what "pass" looks like, the criteria are finished. If they have to walk over and ask what happens with zero results, the criteria still have a gap.

This test works because it removes the writer's own assumptions from the picture. The person who wrote the story knows what they meant. The question is whether the words on the ticket carry that meaning to someone who was not there.

A useful habit for a QA lead reviewing new tickets is to read each one and try to write the first test case cold, using only what is on the ticket. Any place the pen stops is a gap in the criteria, not a gap in the tester's understanding.

A quick way to spot vague criteria before they cost a sprint

Most vague criteria share the same three gaps. Watching for these during backlog grooming catches them before a sprint starts, not during it.

  • No boundary stated. The ticket says "filter by price" but never says what happens at the exact edge of a range, like a price of exactly 20 dollars.
  • No error or empty state. The ticket describes the success path only, and says nothing about what a user sees when nothing matches.
  • No interaction rule. When a story has more than one control, like two filters, nothing says whether they combine, override each other, or work independently.

A five minute pass through a backlog with this list in hand usually finds the same handful of gaps sprint after sprint. Fixing them at grooming time is far cheaper than fixing them mid sprint, when a developer has already built the feature around their own guess.

Turning criteria gaps into a five minute review habit

A QA lead does not need a new tool to catch these gaps, only a habit. Read every new story before it enters a sprint. Ask three questions out loud: what is the boundary, what is the empty state, and do the controls interact. If any answer is missing, send the ticket back with the specific question attached, not a vague "please clarify."

This works because it turns a subjective complaint into a specific, answerable gap. "This ticket feels thin" is hard to act on. "What happens with zero results" gets answered in one sentence. A product owner cannot easily respond to a vague complaint without calling a meeting.

Teams that adopt this habit tend to see the same benefit show up in sprint planning. Stories that already answer the three questions move through refinement faster, because there is nothing left to negotiate. Stories that do not get flagged before the sprint starts, not during the second day of testing when a developer has already built around a guess.

Where this fits with the rest of test case management

Acceptance criteria sit upstream of every case a team writes. Get them right and the case writing step becomes almost mechanical, as the search filter example above shows. Get them wrong and the team spends its testing time negotiating scope instead of finding defects. This is why acceptance criteria belong at the center of test case management, not off to the side as a writing exercise for product owners.

The criteria also connect forward to two related practices. They are the raw material behind acceptance testing, where a business owner ultimately signs off on the finished feature. Writing them early, rather than after a feature is built, is a core piece of shift left testing, which moves quality decisions earlier in the process where they are cheaper to fix.

Questions people ask

What is the difference between acceptance criteria and a definition of done?

Acceptance criteria are specific to one story and describe what "done" means for that piece of work. A definition of done is a fixed checklist that applies to every story regardless of its content.

Who should write acceptance criteria, product or QA?

Product typically owns the story, but QA input early catches gaps like the zero results case before a sprint starts, rather than during testing.

How many acceptance criteria should one story have?

There is no fixed number. A story is ready when someone outside the writer can produce the expected result for every scenario without asking a question.

Does Tesbo write acceptance criteria automatically?

No. Tesbo documents the test cases that criteria produce and links them back to the criteria, it does not generate the criteria themselves or integrate with a specific issue tracker by default.

What happens if criteria are added after a story is already in development?

It works, but it is slower. Gaps get discovered mid build instead of before it starts, which is exactly the delay that writing criteria well upfront is meant to avoid.

The twenty minutes a standup loses arguing over a vague ticket is not a testing problem, it is a writing problem that shows up during testing. Fix it where it starts, in the criteria, and the case writing that follows stops being a negotiation.

Keep going

Try Tesbo, or get the next useful idea

Start building your testing workflow now, or get one practical email a month.

Start free

One email a month

What we shipped, what we learned, and the occasional infographic worth pinning. Unsubscribe in one click.