Writing Effective Bug Reports

5 min read

The single highest-leverage skill in QA is writing bug reports a developer will actually act on. A great report gets fixed quickly, the right way, the first time. A bad report bounces back and forth in comments, wastes hours of developer time, and quietly trains everyone to ignore your reports next time. Investing 10 extra minutes per report pays back many hours per release.

Anatomy of a great bug report

Step 1 of 6

Title

Clear, specific summary: 'Login button unresponsive on Safari 17 after failed attempt'

Every great bug report contains the same components:

1. A clear, specific title. "Bug" tells the developer nothing. "Login fails with valid credentials on Safari 17" tells them everything they need to triage in one line. The title should answer: what feature, what behaviour, what condition.

2. Steps to reproduce. Numbered, atomic, copy-paste-runnable. "1. Open /login. 2. Enter test@example.com / correct-password. 3. Click 'Sign in'." A developer should be able to follow the steps without thinking.

3. Expected behaviour. One sentence, ideally tied to a spec or user story. "User is redirected to the dashboard."

4. Actual behaviour. One sentence, plus any error message. "User remains on /login and an error 'Something went wrong' appears."

5. Evidence. A screenshot, a screen recording, browser console logs, network requests. The more, the better — within reason. A 30-second video of the bug happening saves the developer 30 minutes of "I can't repro."

6. Environment. OS, browser, app version, account type, region, anything else relevant. "macOS 14.4, Safari 17.3, account in EU region, logged in as a Pro user."

7. Severity and priority. A first-pass guess — triage will refine.

8. Notes. Anything else relevant: when it started, related bugs, customer impact, suspected cause if you have one.

A bad report vs a good one

Bad: Login broken

The login is broken on Safari. Please fix.

Good: Login fails silently with valid credentials on Safari 17

Steps to reproduce:

  1. Open https://app.example.com/login on Safari 17.3 (macOS 14.4)
  2. Enter a known-valid email and password (account: qa+staging-1@example.com)
  3. Click "Sign in"

Expected: Redirect to /dashboard within 2 seconds.

Actual: No redirect. URL stays on /login. A red banner appears: "Something went wrong, please try again." Browser console shows: TypeError: Cannot read property 'token' of undefined at auth.js:142. The /api/login request returns 200 with body {"success": true} (verified in Network tab).

Environment: macOS 14.4, Safari 17.3, staging environment, account region: EU.

Severity: High (blocks all Safari users from logging in). Priority: P1.

Note: Started after the deploy at 14:30 UTC today. Chrome and Firefox are unaffected. Reverting the deploy on staging makes the issue go away — likely related to PR #4521.

The good report contains everything a developer needs to start work without asking a single follow-up question. That is the bar.

The "swap roles" mental check

Before submitting, read your report from the developer's point of view. Ask:

  • Could I reproduce this from the steps alone, without asking the reporter anything?
  • Could I tell someone else why this is broken from the report alone?
  • Could I write the fix from the report alone?

If any answer is no, add what's missing. Ten extra minutes here saves an hour of back-and-forth later.

What to leave out

A great report is also disciplined about what it does not include:

  • Speculation about the fix. "I think this is because the cache is stale" is fine as a footnote, but the report's job is to describe the bug, not prescribe the fix.
  • Editorial language. "This is a stupid issue" or "How was this not caught?" hurt your credibility and put the developer on the defensive.
  • Multiple bugs in one report. If you find three bugs while reproducing one, file three reports. Tracking bundled bugs is a nightmare.
  • Personal data. Never paste real customer emails, payment details, or PII into a tracker. Use synthetic data or redact.

Tools that help

A handful of tools sharpen the practice:

  • Built-in screen recording (Cmd+Shift+5 on macOS, Snipping Tool on Windows). 30-second clips dwarf written explanations.
  • Browser dev tools. The Console and Network tabs are full of clues that pasting a screenshot would not capture.
  • Reproducibility tools like rrweb or LogRocket capture full session replay — invaluable for hard-to-reproduce bugs.
  • Curl conversion. Right-click any failing network request → Copy as cURL. Paste into the report. The developer can run it directly.

What you should walk away with

A bug report is a tool of communication. Its job is to make a developer's next 30 minutes as productive as possible. Steps, expected, actual, evidence, environment — every great report has all five. The next lesson tackles the field every triage meeting argues about: severity vs priority.

// tip to track lessons you complete and pick up where you left off across devices.