Focus the majority of your testing efforts on testing methods that you (or other stakeholders) intend to call from other packages/modules. Everything else is just an implementation detail.
Use mocks only when necessary (like for third-party HTTP APIs). They make your test setup more complicated and your tests overall less resistant to refactoring.
Plus, they can result in false positives.
A test is valuable only when it protects you against regressions, allows you to refactor, and provides you with fast feedback.
There's no single right way to test your software.
Nonetheless, it's easier and faster to test logic when it's not coupled with your database.
You can add GIVEN, WHEN, THEN as a docstring to your tests to better express your intent.
def test_all(self): """ GIVEN a PhoneBook with a records property WHEN the all method is called THEN all numbers should be returned in ascending order """ phone_book = PhoneBook( records=[ ("John Doe", "03 234 567 890"), ("Marry Doe", "01 234 567 890"), ("Donald Doe", "02 234 567 890"), ] ) previous = "" for record in phone_book.all(): assert record > previous previous = record
When practicing Test-driven Development with pair programming, try having one developer write the failing test while the other writes the code to get it to pass. The first developer is the responsible for any refactoring.
- It's fun.
- This can accelerate the learning of a less experienced developer when paired with a more experienced developer.
For more TDD benefits, check out What is Test-Driven Development? .