Write a QA Bug Report Someone Can Reproduce

updated October 16, 2026

A test fails. The report says only that the total is wrong. Another person still needs the app setup, exact steps and expected result.

A useful bug report lets someone repeat the problem. It records what happened and what should have happened. It also makes the remaining uncertainty clear.

Start with the behaviour that is wrong

Use a title that names the feature and the failure. For the local order example, a clear title is:

Order total is 500 cents for two items costing 500 cents each

This title names the observed calculation problem. It does not invent a customer incident or a business loss.

State the environment

An environment is the setup where the app and test run. Name the app version or example used. Record the browser or runtime when it matters. A runtime is the program that executes the code.

This worked report uses the downloadable order API in broken mode. It was checked with Node.js v23.11.0. The API is an invented local example. It is separate from TestAcademy graded problems.

For a real project, include the deployed version or commit when available. A commit identifies a saved version of the project code. Avoid descriptions such as the latest version, which change over time.

Write steps that start from a known state

Include the data needed to repeat the problem. State whether the app must be running. Name the account role when access rights matter.

For this example:

  1. Download the order example and extract it.
  2. Open a terminal in that folder. Run node server.mjs --broken.
  3. Keep it open. In another terminal in the same folder, run node --test total.test.mjs.

The commands run locally. They do not run in the TestAcademy browser editor. Node.js 22 or newer is needed. No extra packages are required.

Separate the expected and actual results

The order has two items at 500 cents each. This example has no taxes or delivery fees. The requirement is a total of 1000 cents.

Expected: The API returns totalCents: 1000. The total assertion passes.

Actual: The API returns HTTP 200 with totalCents: 500. The total assertion fails.

A reproducible report names the local setup, exact steps, expected total of 1000 cents and actual total of 500 cents.
Use values from the actual run and the stated requirement.

An assertion is a check that fails when a result is wrong. The failure output for this run is:

The total must include both items.

500 !== 1000

The report should include that evidence, not only the word failed. A screenshot can support it, but selectable error text is easier to inspect.

Describe impact without inventing it

A wrong total could affect a checkout that uses that amount. This example does not include a payment operation. The test does not show whether anyone was charged incorrectly.

State the observed effect separately from a possible effect. A team can then decide severity using the actual product context. Severity describes how serious the defect is in that context.

Give the reader a complete worked report

Read the worked order bug report. Its steps and values come from the executed example. Stop the example server with Ctrl+C when you finish.

The same test passes against the working API. That comparison supports the reported calculation difference. It does not establish that every order operation works.

The API response guide explains why HTTP 200 did not catch this error.

Remove unnecessary private data

Include only the data needed to reproduce the issue. Do not publish passwords, access tokens or customer records. A token is a value used to access an account or service.

Use an example account you are allowed to share. If a private attachment is needed, use your team's approved place for it.

Record what remains unknown

Say if you have not repeated the failure. If you suspect a cause, label it as a possibility. A failed test does not automatically prove where the app code is wrong.

For explaining the investigation, read how to discuss a failing test in a QA interview. For presenting your wider work, see the QA portfolio guide.

Download the blank bug report template. Replace its fields with facts from your own issue.

Remember this

Give someone a known setup, repeatable steps and a clear difference between expected and actual results. State what the evidence does not show.

Reference: Creating an issue on GitHub.

Put it into practice

Solve a graded problem: write a test, and we check it would catch a real bug.

Browse the problems →

Keep reading