Quality assurance
The Bug You Can't See Is the One You Should Fear
By Zainab Khalid · Code Huddle · Product engineering guides
A user taps Save. The screen says everything worked. They close the app, open it again, and the change is gone. Nothing crashed. No red error appeared. A quick test might even pass. Yet, from the user's point of view, the feature is broken. Some defects don't announce themselves. They show up only after a particular action, in a particular state, or when two parts of a product interact. Finding them means looking past the obvious result and checking what actually happened.
Look at the whole experience, not just the screen
A useful question is not only "Did this button work?" but also "What changed because I pressed it, and does that change remain correct?" For a feature that saves information, a stronger check is:
- Make a change and submit it.
- Notice the immediate response, including any loading or confirmation state.
- Leave the screen and return to it.
- Check whether the value is still correct.
- Look at any related screen or workflow that uses the same information.
Not every test needs a long checklist. Match the depth of the check to the risk of the feature.
A small investigation: the missing workout update
A coach edits a workout session in a fitness app. The app shows a success message, so the tester marks the case as passed. Later, the athlete opens the plan and sees the old session. Instead of repeating the same happy path, investigate:
- Does the change remain after reopening the session? Separates a temporary screen update from a saved result.
- Does the issue affect every session or only certain plans? Helps narrow down the data or conditions involved.
- Does it happen on another supported device or app version? Checks whether the behavior is environment-specific.
- Was the save interrupted, delayed, or tapped more than once? Explores timing and repeated-action possibilities.
- Do other views show the same updated details? Checks whether connected parts of the product agree.
Change one condition at a time where possible; otherwise, it becomes difficult to tell which variation affected the result.
A practical way to investigate an unexpected issue
- Describe the symptom precisely. Write what you observed without guessing at the cause.
- Establish the starting conditions. Note the account state, data, app version, and device.
- Repeat the original steps. Confirm whether it happens consistently, occasionally, or not again.
- Vary one factor. Try a different network, account state, device, or timing.
- Compare expected and actual outcomes. Check the visible result and, where appropriate, the underlying data.
- Preserve evidence. Capture steps, timestamps, screenshots or recordings, and available logs.
- Share the findings. Include both successful and failed attempts so developers can see the pattern.
Symptom vs. cause: A report such as "the app randomly loses data" describes a symptom, not why it happens. The cause could be a failed request, stale display data, or a synchronization delay. QA's job is to provide reliable observations and evidence—not to present an unverified theory as fact.
Common mistakes that let hidden bugs through
- Trusting the confirmation message. A "Saved" banner shows the screen reacted, not that the data was stored correctly.
- Testing only with clean data. A new account behaves differently from one with years of history or expired plans.
- Retesting only the happy path after a fix. Run the original failing conditions again, not just a nearby scenario that passes.
- Writing vague or guessed bug reports. "It doesn't work" or "it's probably the server" gives developers nothing solid to act on.
- Dismissing a bug that won't reproduce. Failing once doesn't make the report invalid. Keep notes and try again.
What to include in a hard-to-reproduce bug report
- Summary: Edited workout details revert after reopening the session.
- Starting state: Existing plan assigned to an athlete; session details available to edit.
- Steps: Edit the session, save, leave the screen, reopen it.
- Expected result: The edited details remain visible.
- Actual result: The previous details appear again.
- Frequency: Observed once in five attempts (an example—record only what your own testing found).
- Environment and evidence: App/build version, device, timestamp, and a recording if available.
Only include details you have actually observed. If the issue hasn't happened again, say so rather than inventing a frequency or claiming it is fixed.
Before you call the check complete
- Did I verify the result after the immediate confirmation?
- Could a different account state or data condition change the outcome?
- Are there connected screens or workflows that should agree?
- Have I considered interruptions, timing, or environment differences?
- After a fix, did I retest the conditions that exposed the issue?
Make the invisible observable
The most useful QA mindset is curiosity backed by evidence. A green check on one scenario is encouraging, but it isn't the whole story. You can't guarantee that every hidden defect will be found before release. You can, however, make fewer assumptions, investigate unexpected behavior carefully, and give your team the information it needs to act before a quiet failure becomes a user's problem.