· Concise: As simple as possible.
· Self-Checking: Test reports its own results; needs no human interpretation.
· Repeatable: Test can be run many times in a row without human intervention.
· Robust: Test produces same result now and forever. Tests are not affected by changes in the external environment.
· Sufficient: Tests verify all the requirements of the software being tested.
· Necessary: Everything in each test contributes to the specification of desired behavior.
· Clear: Every statement is easy to understand.
· Efficient: Tests run in a reasonable amount of time.
· Specific: Each test failure points to a specific piece of broken functionality; unit test failures provide "defect triangulation".
· Independent: Each test can be run by itself or in a suite with an arbitrary set of other tests in any order.
· Maintainable: Tests should be easy to understand and modify and extend.
· Traceable: To and from the code it tests and to and from the requirements.