Pytest Code Review
Quick Reference
| Issue Type | Reference | |------------|-----------| | async def test_*, AsyncMock, await patterns | references/async-testing.md | | conftest.py, factory fixtures, scope, cleanup | references/fixtures.md | | @pytest.mark.parametrize, DRY patterns | references/parametrize.md | | AsyncMock tracking, patch patterns, when to mock | references/mocking.md |
Review Checklist
- [ ] Test functions are
async def test_*for async code under test - [ ] AsyncMock used for async dependencies, not Mock
- [ ] All async mocks and coroutines are awaited
- [ ] Fixtures in conftest.py for shared setup
- [ ] Fixture scope appropriate (function, class, module, session)
- [ ] Yield fixtures have proper cleanup in finally block
- [ ] @pytest.mark.parametrize for similar test cases
- [ ] No duplicated test logic across multiple test functions
- [ ] Mocks track calls properly (assert_called_once_with)
- [ ] patch() targets correct location (where used, not defined)
- [ ] No mocking of internals that should be tested
- [ ] Test isolation (no shared mutable state between tests)
When to Load References
- Reviewing async test functions → async-testing.md
- Reviewing fixtures or conftest.py → fixtures.md
- Reviewing similar test cases → parametrize.md
- Reviewing mocks and patches → mocking.md
Review Questions
- Are all async functions tested with async def test_*?
- Are fixtures properly scoped with appropriate cleanup?
- Can similar test cases be parametrized to reduce duplication?
- Are mocks tracking calls and used at the right locations?