Question: what are the properties which make a test a good unit test? If you have a good answer, check out my answer and add to it in the comments. If you don't here is mine.
Long Descriptive Name: For example returnsNullWhenCalledOnEmptyList is a nice name for a test
Simple Clean Structure: A test performs necessary setup, executes the method to be tested and performs its assertions. Not more not less
Fast: one thousand tests should run in less than a minute. This allows an extensive test suite to run often during development. If your tests are slower, you might be doing integration tests.
Test a Single Feature or behavior: This is sometimes phrased as 'one assertion', which I consider misleading. If you need multiple assertion in order to assert one behavior thats OK, although you might consider a new assert method for that.
Reliable: For the same code base a test should produce the same result every time. A test that fails every 10th time will fail for a real bug and you won't know it.
Stable: The test only fails, when the code under test doesn't behave as expected, not because anything else changed.
Easy to Understand: Just as normal code, the intention of a test should be easy to understand. Names help with this. Extracting setup code in a properly named method helps as well.
Should Not Use Production Classes, Except The Class Under Test: This helps with the 'Stable' and the 'Fast' property. It's ok to use simple classes like String or Integer.
Don't Try to Squeeze All Tests for a Class in a Single Test Class: For many classes you will have more then one test class. The different test classes will probably differ in the setup needed for the contained tests.
Independent: No Test should depend on any other Test or on the order of execution.
Wan't to meet me in person to tell me how stupid I am? You can find me at the following events: