Pytest Code Review#
Quick Reference#
Issue TypeReferenceasync def test_*, AsyncMock, await patternsreferences/async-testing.mdconftest.py, factory fixtures, scope, cleanupreferences/fixtures.md@pytest.mark.parametrize, DRY patternsreferences/parametrize.mdAsyncMock tracking, patch patterns, when to mockreferences/mocking.md
Review gates#
Work in order. Do not assert pytest-specific problems until each applicable gate passes.
- Scoped files — Pass when: You list every
test_*.py and any conftest.py you will cite; no findings for files outside that list.
- Async vs sync — Pass when: Per scoped file, you note whether it uses
async def test_* / await; if yes, open references/async-testing.md before criticizing async usage.
- Fixtures — Pass when: If shared setup matters, you name the
conftest.py path(s) or state none; for yield fixtures, confirm cleanup exists before claiming resource leaks.
- patch / mocks — Pass when: For any
patch or mock critique, you give the import path where the symbol is used (call site), or mark N/A; open references/mocking.md when mocking is central to the review.
- Findings — Pass when: Each finding includes a file path and line(s) or test node id, not a generic rule restatement.
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?