Skip to main content
Reproduction Tips

Reproduction Tips: How to Write a Bug Report That Gets Fixed

A bug report without reproduction steps is a wish. Learn how to write reproduction steps that actually lead to a fix, based on real-world practices and standards.

Who This Is For

Imagine you're a developer, and a bug report lands in your queue: 'The app crashes when I click the button.' No steps, no environment, no expected behavior. You try clicking the button—it works. You close the ticket as 'Not a Bug.' The reporter is frustrated, you're frustrated, and the bug lives on in the shadows.

I've been on both sides of this exchange, and I've learned that the quality of a bug report is the single biggest factor in whether a bug gets fixed—and fixed quickly. This article is for testers, QA engineers, and developers who file bugs, and for anyone who's ever wondered why their bug reports get ignored. I'm going to walk you through a practical, step-by-step approach to writing reproduction steps that actually help the person on the other end.

Step 1: Understand the Difference Between Severity and Priority

Before you write a single word, you need to know what you're reporting. Severity measures how much the bug affects the system or the user; priority measures how urgent it is to fix (Atlassian). They're not the same thing. A cosmetic typo on the login page might be low severity, but if it's on the CEO's demo account, it could be high priority. Conversely, a data-corrupting bug in an obscure admin function might be high severity but low priority if no one uses that function.

When I'm about to file a bug, I ask myself: 'If this were the only bug in the world, would I ship?' That helps me set severity. Then I ask, 'Who's waiting on this?' That helps me set priority. And I always include both in the report, because the developer needs to know how bad it is and how fast to move. Don't make them guess.

Step 2: Write Reproduction Steps That Are Repeatable

Now the core of it: the reproduction steps. I've seen so many reports that say 'Go to the settings page and change the theme.' That's not a reproduction step; that's a vague suggestion. A good reproduction step is like a recipe: it has a clear starting point, a list of ingredients, and an expected outcome at each stage.

Here's my template:

1. Start from a known state: Fresh database? Logged in as admin? On a clean browser profile? State it.

2. List each action in order: 'Click the 'Settings' icon in the top right.' Not 'Open settings.'

3. Include exact inputs: If you typed something, type it. 'Enter '[email protected]' in the email field.' Not 'enter an email.'

4. State the expected behavior: 'A success message should appear.'

5. State the actual behavior: 'Instead, the page goes blank.'

That's the bare minimum. But I also add environment details: browser, OS, screen resolution, and any relevant configuration. And if you can, attach a screenshot or a short screen recording. Visual proof is worth a thousand words.

I remember a time when a tester filed a bug about a crash in our web app, but only said 'It crashes when I click the button.' We spent an hour trying to reproduce it, and finally asked for their browser version—it was an old version we didn't support. The bug was real, but the missing environment details made it impossible to find. Don't be that tester.

Step 3: Use a Consistent Workflow and Lifecycle

A bug report isn't a one-way message; it's the start of a conversation that follows a standard lifecycle. In most bug trackers, a defect moves through New, Open, Assigned, In Progress, Fixed, Pending Retest, Retest, Verified, and Closed (Atlassian). But many teams simplify that to a leaner flow: Open → In Progress → In Review → Done → Closed (Atlassian).

My recommendation: keep it simple. The more states you have, the more time you spend moving tickets around instead of fixing bugs. But whatever workflow you use, make sure everyone understands it. And when a bug comes back as 'Not Reproducible' or 'Rejected' (common states for when the repro steps fail), don't get defensive. Go back to your steps, add more detail, and try again. That's the real craft of bug reporting.

Step 4: Include Expected vs. Actual Behavior and Visual Proof

I've already touched on this, but it's worth its own step because it's so critical. A complete defect report includes reproduction steps, expected vs. actual behavior, severity and priority, environment details, and visual proof (Atlassian).

Expected vs. actual is the heart of the matter. If you don't say what you expected, the developer might think the current behavior is intended. For example, if you click 'Save' and nothing happens, but the save actually worked silently, the developer might say 'working as intended' if you don't state that you expected a confirmation message.

Visual proof is also non-negotiable in my book. A screenshot of the error, a screen recording of the steps, even a console log—anything that shows what you saw. I've seen bugs get fixed in minutes when the reporter included a GIF of the glitch, versus days when they just described it.

Step 5: Assign and Track with Traceability

Once you've written a stellar report, it needs to go to the right person. Assign the bug to the appropriate developer, and after they fix it, reassign it back to the original tester for validation (Atlassian). If you find new bugs during retesting, log them as separate issues—don't reopen the old one with a laundry list.

Traceability is another practice I swear by: link the bug to the user story, the test case, and the code change that caused it. That way, when you're doing root cause analysis, you can see the whole chain. And if you're in a regulated industry, traceability is often a compliance requirement. It's not just about fixing the bug; it's about understanding why it happened and preventing it from recurring.

What Can Go Wrong: The Delayed Issue Effect

Here's a warning that might surprise you. Conventional wisdom says that the longer a bug stays in the system, the more it costs to fix. But a large study of 171 software projects from 2006 to 2014 found no evidence that issues resolved in a later phase cost consistently more effort than those fixed early (Menzies et al.). The 'delayed issue effect' appears only in certain kinds of projects, not as a universal rule.

What does that mean for you? Don't panic if a bug goes unfixed for a while—it might not be the time bomb you think it is. But don't use that as an excuse to file sloppy reports either. The point is to focus on writing clear, actionable reports from the start, not to game the system by filing everything as 'Blocker' to get attention.

What I'd Actually Do

If you take one thing from this article, make it this: invest in your reproduction steps. I'd rather receive a bug report with three well-written steps and a screenshot than a 10-page essay with no steps. And I'd rather file a report that takes me an extra five minutes to write than spend an hour going back and forth with a developer.

My specific recommendation: adopt a template for bug reports in your team. Make it mandatory to include reproduction steps, expected vs. actual, and environment. Use a simple workflow like Open → In Progress → In Review → Done → Closed, and stick to it. And always, always, attach visual proof.

Remember, the goal isn't to file the most bugs or the longest reports. It's to get bugs fixed. And that starts with making them reproducible.

Sources

  • Atlassian (bug life cycle) - https://www.atlassian.com/software/jira/guides/bug-tracking/bug-life-cycle
  • Atlassian (issue priority vs severity) - https://www.atlassian.com/software/jira/guides/issues/priorities
  • arXiv (Menzies et al. 2016, delayed issue effect) - https://arxiv.org/abs/1609.04886

Share this article:

Comments (0)

No comments yet. Be the first to comment!