Here is a little convention I have adopted for check-in comments when fixing red lights in NUnit:
- A failing test is when the issue lies in production code. It fails because the code it is testing has bugs or isn't fully implemented to spec yet.
- A buggy test is when the test itself has an issue, and the production code is totally fine. For us these most commonly occur when we forget to set something up e.g. null test objects or unconfigured mocks.
- A deprecated test fails because the behaviour of the code is now intentionally different than before, and the assertions it makes are no longer valid.
A fourth, more insidious case is the missing test, where possible paths through production code exist without any tests that specify what their behaviour should be. If you're doing TDD this should never happen, but when it does it can be quite difficult to track down. A coverage tool like NCover can help, but only if you miss a whole block or method. Otherwise you need to use your programmer spidey sense and stay on the look-out for uncovered situations.
Hopefully most of your red lights are due to failing and deprecated tests. If you get a lot of buggy or missing ones, then it probably means you are skipping the red step of red-green-refactor.