Back to Blog

The Art of Writing Bug Reports That Developers Actually Fix

AlternateQA Team
A vague bug report creates friction, delays fixes, and damages the relationship between QA and development. Master the craft of writing precise, compelling bug reports that get actioned immediately.

Why Most Bug Reports Fail

Think about the last bug you filed that came back with "Cannot Reproduce" or sat in a backlog for weeks. The root cause is almost always the same: the bug report didn't give the developer everything they needed to immediately understand, reproduce, and prioritize the issue.

A bug report is fundamentally a communication tool. It bridges the gap between the environment where a QA engineer found a problem and the developer's machine where they need to reproduce and fix it. Writing an effective one is a craft that separates good QA engineers from great ones.

The Anatomy of a Perfect Bug Report

1. Title: Be Specific and Searchable

Bad: "Login broken" Bad: "Page crashes" Good: "Login with SSO fails with 500 error when email contains a '+' character" Good: "Checkout page freezes on mobile Safari 17 when applying a discount code"

A good title:

  • Names the specific feature or component
  • Describes the exact symptom
  • Includes relevant context (browser, device, user role) if applicable
  • Is searchable — future testers can find it before filing a duplicate

2. Environment Details

This section removes the most common reason for "Cannot Reproduce":

  • Browser/OS: Chrome 125 on macOS 14.4, or Firefox 126 on Windows 11
  • App version/build: v2.4.1-beta, build #1847
  • Environment: Staging, or production, or local dev
  • User type/role: Admin user, free-tier user, user with 0 items in cart
  • Test data used: Specific account email or test fixture ID

3. Steps to Reproduce: The Heart of the Report

This section is where most bugs are poorly written. Every step must be:

  • Atomic: One action per step
  • Explicit: No assumptions about what the reader knows
  • Ordered: Numbered list, never prose

Bad:

Log in and try to apply a coupon code in the cart.

Good:

  1. Navigate to https://staging.myapp.com/login
  2. Log in with account: testuser_free@example.com / TestPass123!
  3. Click "Products" in the top navigation
  4. Click "Add to Cart" on the first product (e.g., "Widget Pro - $49.99")
  5. Click the cart icon in the top right
  6. Type SAVE20 in the "Coupon Code" field
  7. Click "Apply Coupon"

4. Expected vs. Actual Result

This two-field structure is the clearest way to communicate a bug:

Expected Result: A green confirmation message appears: "Coupon SAVE20 applied! You saved $10.00." The order total updates to $39.99.

Actual Result: The page freezes for 5 seconds, then displays a blank white screen with no error message. The total does not change and the coupon field is cleared.

This format forces clarity — you must know what the correct behavior should be, which is itself a valuable QA exercise.

5. Visual Evidence: Screenshots and Videos

Attach evidence for every non-trivial bug. Use these tools:

  • Screenshots: Annotate with red boxes and arrows to highlight exactly what's wrong. Don't make the developer hunt for the problem in a full-page screenshot.
  • Screen recordings: For interaction bugs (a button that misbehaves on the second click), a 15-second recording is worth a thousand screenshots. Tools like Loom, ShareX, or macOS Screen Capture work well.
  • Browser console logs: Always check and attach the browser DevTools console output. A JavaScript error in the console is often the fastest path to the root cause.
  • Network logs (HAR file): For API-related bugs, export the network activity as a HAR file so developers can see the exact request and response that failed.

6. Severity and Priority

These two fields are often confused but serve different purposes:

  • Severity: How bad is the technical impact? (Critical, High, Medium, Low)

    • Critical: Data loss, security breach, complete feature failure
    • High: Major functionality broken, no workaround
    • Medium: Feature works but with significant friction
    • Low: Cosmetic, typos, minor visual issues
  • Priority: How urgently does this need to be fixed? (P1, P2, P3, P4)

    • Priority is a business decision. A cosmetic bug on the home page (Low severity) might be P1 because the CEO sees it. A broken report export (High severity) might be P3 because it's used by 2 users per month.

7. Additional Context: The "Journalist's Notes"

Great bug reporters go beyond the minimum. Add:

  • Frequency: "Happens 100% of the time" vs. "Happened twice out of 30 attempts"
  • Workaround: "Refreshing the page and re-applying the coupon works"
  • Affected users: "All free-tier users are affected; premium users are not"
  • Regression: "This worked in build #1840. Broke in build #1841. This might be related to PR #456 which changed coupon validation logic."
  • Related bugs: Link to similar or related issues in the tracker

Communication Etiquette

Be objective, not emotional. "This is completely broken and someone should have caught this" is not a bug description. It's a complaint that creates defensiveness. Stick to facts.

Assume good intent. Bugs happen. Write your report as if you're collaborating with the developer to solve a mystery together, not accusing them of incompetence.

Follow up responsibly. If a bug sits unactioned for a week, a polite comment asking for a status update is appropriate. Escalate to your manager only if the issue is critical and being ignored.

Verify the fix. When a developer marks a bug as "Fixed," it's QA's job to verify it in the correct environment. Close the ticket with a brief verification note: "Verified fixed in build #1850 on staging. Coupon applies correctly and total updates as expected."

A well-written bug report is a professional asset. It demonstrates technical depth, clear communication skills, and respect for your colleagues' time. Make it a personal standard to write every bug report as if your own reputation depends on it — because it does.