P
pytest-code-review
About pytest-code-review
pytest-code-review is a skill for reviewing pytest tests, aimed at reviewers checking async tests, fixtures, and mocks. Its gates require scoped files, applicable references, and specific locations before pytest-related issues are reported.
Key features
- 01List files in review scope
- 02Distinguish synchronous and async tests
- 03Check fixture scope and cleanup
- 04Verify mock and patch usage locations
- 05Require file paths or test node IDs for findings
Use cases
- 01Review async tests and AsyncMock usage
- 02Check conftest.py fixtures and resource cleanup
- 03Verify patch targets and mock call assertions
- 04Identify parameterizable or duplicated test logic
Install
Copy the command and run it in a terminal.
$
npx skills add https:/ / github.com/ existential-birds/ beagle --skill pytest-code-reviewAfter installing, type/pytest-code-reviewin Claude Code to confirm it loaded.
Bundled files
References and scripts installed along with SKILL.md.
references/async-testing.mdfixtures.mdmocking.mdparametrize.mdDetails
From the project READMEPytest 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 gates
Work in order. Do not assert pytest-specific problems until each applicable gate passes.
- Scoped files — Pass when: You list every
test_*.pyand anyconftest.pyyou 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.pypath(s) or state none; for yield fixtures, confirm cleanup exists before claiming resource leaks. - patch / mocks — Pass when: For any
patchor 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?
Comments
Markdown supported