Unit Testing Tenets¶
Tres Seaver’s unit testing tenets.
Goals¶
Unit tests should:
- be as simple as possible while still exercising the app under test.
 - run as quickly as possible to encourage running them frequently.
 - avoid couplings with other tests, or with parts of the codebase they are not responsible for testing.
 - be idempotent.
 
Tests should not:
- replace narrative or API documentation.
 
Rules¶
- Never import the module under test at test module scope.
 - Each test case method tests Just One Thing.
 - Test case names indicate what they test.
 - Don’t share test fixtures between test modules.
 
Guidelines¶
- Minimize module-scope dependencies.
 - Do as little work as possible in the execution path of a single test.
 - Make fixtures as simple as possible.
 - Use globals judiciously.
 - Use stub/mock objects to clarify dependent contracts.
 
Conclusions¶
- Tests are straightforward to write.
 - Excellent coverage.
 - Easy to debug/diagnose.
 - Quick to run.
 - Clarifies thinking about the code and its dependencies.
 
Demonstration¶
Let’s go back and improve the tests we wrote using Tres’ tenets.
What Do We Want To Fix¶
- Bad test practices (importing things under-test at module scope).
 - Bad/missing stubs or mocks.
 - Bad fixtures.
 - Misuse of globals.
 
API Talk (Tangent)¶
- Avoid Global State When Possible
 - Avoid Designing for Convenience (Don’t Give In To 
importFascination) - Composition Usually Beats Inheritance
 - Avoid Using Others’ Code That Breaks These Rules