Better Call QALet’s talk ↗
← Back to the journal

QA thinking · 3 MIN READ

Software quality starts with a shared definition of done

Before writing more tests, agree what the product must do, which failures matter most, and what evidence will show that it works.

A team can build exactly what a ticket describes and still disappoint the person using the product. The missing piece is often a shared understanding of the outcome: what should happen, for whom, and under which conditions?

Quality assurance starts with making those expectations concrete. Testing becomes more useful when developers, product owners and testers are answering the same question.

Describe the outcome, not only the screen

“Add a booking form” describes a piece of interface. It does not explain what makes a booking successful.

For an illustrative appointment app, useful expectations might include:

  • A customer can choose an available time and understand the total price before confirming.
  • Two customers cannot successfully reserve the same exclusive appointment slot.
  • A failed submission does not leave the customer believing that a booking exists.
  • After success, the saved booking and the confirmation show the same time and service.

These examples are not a universal specification. They show the questions a team needs to resolve before deciding how to test its own product.

Make uncertainty visible early

Words such as “fast”, “intuitive” and “works on mobile” can mean different things to different people. Turn them into concrete expectations that fit the audience.

Which devices and browsers are supported? What feedback should appear while a request is processing? Can a person correct a mistake without starting again? What should happen if the connection disappears?

When nobody can answer a question, record it as an open decision with an owner. Quietly guessing can turn an unresolved requirement into a defect that is expensive to untangle later.

Prioritize the failures that hurt

Not every part of the product needs the same depth of testing. Start with the consequences of failure and how likely the changed behavior is to be exercised.

In the appointment example, an incorrect booking or lost confirmation deserves more attention than a slightly uneven icon. A rarely used permission setting may still be important if getting it wrong exposes another user's information.

Consider recent changes, complex integrations and areas with a history of defects. Use those signals to choose where to explore more deeply. Risk-based testing is a way to allocate limited time; it is not a reason to ignore everything outside the main journey.

Agree what “done” requires

A useful definition of done connects implementation to evidence. For a particular change, the team might agree that:

  • The expected outcomes and important failure cases have been reviewed.
  • The agreed checks have run against an identified build and environment.
  • Findings have been investigated, prioritized and assigned.
  • Agreed fixes have been retested, including nearby behavior that could be affected.
  • Remaining risks and coverage gaps are visible to the person making the release decision.

The exact criteria should match the product. A small content update and a new payment flow should not automatically require identical checks.

Keep quality a shared responsibility

A tester can investigate, challenge assumptions and explain findings. Developers contribute through implementation and review. Product owners clarify expected behavior and priorities. The release owner decides whether the remaining risk is acceptable.

That shared responsibility matters more than handing a finished feature to QA and asking for a final stamp of approval.

For a focused website testing review, start by sharing the customer journeys and the decisions you are uncertain about. Clear expectations make it easier to choose useful checks and produce findings your team can act on.