Let's take an example bug from the hypothetical Superball Sorter that I described a few weeks ago. Imagine that when you tested the feature, you discovered that if three of the children have a rule where they accept only large balls of some color, the small purple ball is never sorted.
Here are the components of a well-logged bug:
Title: The title of the bug should begin with the area of the application it is referring to. For example, if a bug was found in the Contacts section of your application, you could begin the title with "Contacts". In this case, the area of the application is the Superball Sorter. After the application area, you should continue the title with a concise statement of the problem.
RIGHT: Superball Sorter: Small purple ball is not sorted when three children have large ball rules
WRONG: Small purple ball not sorted
While the second example gives at least a clue as to what the bug is about, it will be hard to find among dozens of other bugs later, when you might try to search by "Superball". Moreover, it doesn't state what the conditions are when the ball is not sorted, so if there is another bug found later where this same ball isn't sorted, there could be confusion as to which bug is which.
Description: The first sentence of the bug should describe the issue in one sentence. This sentence can provide a bit more detail than the title. I often start this sentence with "When", as in "when I am testing x, then y happens".
RIGHT: When three children have sorting rules involving large balls, the small purple ball is not sorted.
WRONG: Doug doesn't get the small purple ball
There are a number of things wrong with this second example. Firstly, the issue happens regardless of which three children have rules where they get only large balls, so referring to Doug here could be misleading. Secondly, the statement doesn't describe what rules have been set up. A developer could read this sentence and assume that the small purple ball is never sorted, regardless of what rules are set up.
Environment and browser details: These can be optional if it's assumed that the issue was found in the QA environment and if the issue occurs on all browsers. But if there's any chance that the developer won't know what environment you are referring to, be sure to include it. And if the issue is found on one browser but not others, be sure to mention that detail.
RIGHT: This is happening in the Staging environment, on the Edge browser only
Steps to reproduce: The steps should include any configuration and login information, and clearly defined procedures to display the problem.
RIGHT:
1. Log in with the following user:
username: foobar
password: mebs47
2. Assign Amy a rule where she gets large red balls only
Assign Bob a rule where he gets large orange balls only
Assign Carol a rule where she gets large yellow balls only
3. Create a set of superballs to be sorted, and ensure that there is at least one small purple ball
4. Run the superball sorter
5. Check each child’s collection for the small purple ball or balls
WRONG:
Everyone has a rule but Doug, and no one is getting the small purple ball
The above example doesn't provide nearly enough information. The developer won't know the login credentials for the user, and won't know that the three rules should be for large balls.
ALSO WRONG:
1. Open the application
2. Type “foobar” in the username field
3. Type “mebs47” in the password field
4. Click the login button
5. Go to the Superball Sorter rules page
6. Click on Amy’s name
7. Click on the large ball button
8. Click on the red ball button
9. Click the save button
10. Click on Bob’s name
etc. etc. etc.
These steps provide WAY too much information. It can be safely assumed that the developer knows how to log in; simply providing the credentials should be enough. It can also be safely assumed that the dev knows how to set a rule in the Superball Sorter, since he or she wrote the code.
Expected and Actual Result: For the sake of clarity, it's often a good idea to state what behavior you were expecting, and what behavior you got instead. This can help prevent misunderstandings, and it's also helpful when a bug has been sitting on the backlog for months and you've forgotten how the feature is supposed to work.
RIGHT:
Expected result: Doug gets the small purple ball, because he is the only child configured to accept it
Actual result: Doug does not get the small purple ball, and the ball remains unsorted
Screenshot or Stack Trace: Include this information only if it will be helpful.
RIGHT:
Exception: Ball was not recognized
Caused by: Ball.sort(Ball.java:11)
WRONG:
Exception: An unknown error occurred
ALSO WRONG:
The above screenshot is not particularly helpful. While it shows that Doug doesn't have a small purple ball, that is easily conveyed by the Actual Result that has already been described; no picture is needed.
A clearly written bug is helpful to everyone: to the product owner, who prioritizes bug fixes; to the developer, who has to figure out what's wrong and fix it; and to the tester, who will need to retest the issue once it's fixed. When you take care to log bugs well, it prevents frustration and saves everyone time.