Python testing skill
Test Python services with pytest, async coverage, monkeypatch, and boundary-focused fakes.
by HoangNguyen0403·MIT license·★ 569 Stars on the repo·GitHub ↗
Use now
npx degit HoangNguyen0403/agent-skills-standard/skills/python/python-testing#develop ~/.claude/skills/python-testingChecked ·commit develop
Files of Python testing
SKILL.md
Show the full text63 lines
Python Testing
Priority: P0 (CRITICAL)
Core Rule Anchors
[BE-TEST-01]Parametrized Tests for Equivalent Inputs: Preferpytest.mark.parametrizefor equivalent inputs and boundary permutations. Distinct scenarios may stay separate.[BE-TEST-02]Ban on Brittle SQL String Matching: Test pure domain calculations directly or use fakes/testcontainers; do not regex-match SQL strings in mocks.[BE-TEST-03]Ban on Shallow Assertions: Never assert onlyassert resultwithout inspecting domain attributes and invariants.[BE-TEST-04]Ban on Pass-Through Seam Mocks: Repositories and adapters must test contract compliance and error mapping; ban 1:1 pass-through mock echoing.[BE-TEST-05]Bug-First Regression Lock: Every PR fixing a bug ticket or with titlefix(...)must introduce a failing test reproducing the defect before fixing it.
Rules
- Use
pytestandpytest-asynciofor async boundaries. - Add regression tests around contract parsing, workflow routing, and verifier outcomes (
[BE-TEST-05]). - Prefer
pytest.mark.parametrizefor equivalent inputs; distinct scenarios may stay separate ([BE-TEST-01]). - Prefer fakes or monkeypatch at external seams: DB, RPC, Telegram, subprocess, Docker (
[BE-TEST-02],[BE-TEST-04]). - Verify behavior and domain invariants, not shallow truthiness or implementation trivia (
[BE-TEST-03]). - Coverage is diagnostic and project-configured; verify risk-weighted critical paths rather than padding code for an arbitrary percentage.
Recipe
- Write the failing test first for the boundary or regression (
[BE-TEST-05]). - Patch one seam high enough to keep the test readable (
[BE-TEST-04]). - Assert structured outcomes: metadata, route result, blocker text, emitted command (
[BE-TEST-03]). - Use async tests for async code; avoid spinning real event loops manually.
- Cover negative paths for malformed packets, stale runtime state, and missing env.
Anti-Patterns
[BE-TEST-01]Stylistic parametrize rewrites: Do not demand parameterized rewrites of passing tests without a behavioral gap.[BE-TEST-02]SQL regex matching: Do not regex-match SQL strings in mocks.[BE-TEST-03]Shallow assertions: Never assert onlyassert result; always verify domain attributes and invariants.[BE-TEST-04]Pass-through seam mocks: Ban 1:1 mock echoing without contract assertions.[BE-TEST-05]Bug fix without reproduction test: Ban bug fixes without a reproduction test.- No live network or DB in unit tests: Use fakes or testcontainers.
- No broad monkeypatch spray: Patch the boundary, not every helper under it.
- No smoke-only proof for shared runtime changes: Add focused assertions too.
References
| 1 | |
| 2 | name python-testing |
| 3 | description Test Python services with pytest, async coverage, monkeypatch, and boundary-focused fakes. Use when writing Python tests, fixtures, async tests, regression tests, or dependency-isolated verification. |
| 4 | metadata |
| 5 | triggers |
| 6 | files |
| 7 | - "tests/**/*.py" |
| 8 | - "pytest.ini" |
| 9 | - "**/conftest.py" |
| 10 | - "**/test_*.py" |
| 11 | - "**/*_test.py" |
| 12 | keywords |
| 13 | - pytest |
| 14 | - monkeypatch |
| 15 | - fixture |
| 16 | - async test |
| 17 | - regression test |
| 18 | |
| 19 | |
| 20 | # Python Testing |
| 21 | |
| 22 | ## **Priority: P0 (CRITICAL)** |
| 23 | |
| 24 | ## Core Rule Anchors |
| 25 | |
| 26 | **`[BE-TEST-01]` Parametrized Tests for Equivalent Inputs**: Prefer `pytest.mark.parametrize` for equivalent inputs and boundary permutations. Distinct scenarios may stay separate. |
| 27 | **`[BE-TEST-02]` Ban on Brittle SQL String Matching**: Test pure domain calculations directly or use fakes/testcontainers; do not regex-match SQL strings in mocks. |
| 28 | **`[BE-TEST-03]` Ban on Shallow Assertions**: Never assert only `assert result` without inspecting domain attributes and invariants. |
| 29 | **`[BE-TEST-04]` Ban on Pass-Through Seam Mocks**: Repositories and adapters must test contract compliance and error mapping; ban 1:1 pass-through mock echoing. |
| 30 | **`[BE-TEST-05]` Bug-First Regression Lock**: Every PR fixing a bug ticket or with title `fix(...)` must introduce a failing test reproducing the defect before fixing it. |
| 31 | |
| 32 | ## Rules |
| 33 | |
| 34 | Use `pytest` and `pytest-asyncio` for async boundaries. |
| 35 | Add regression tests around contract parsing, workflow routing, and verifier outcomes (`[BE-TEST-05]`). |
| 36 | Prefer `pytest.mark.parametrize` for equivalent inputs; distinct scenarios may stay separate (`[BE-TEST-01]`). |
| 37 | Prefer fakes or monkeypatch at external seams: DB, RPC, Telegram, subprocess, Docker (`[BE-TEST-02]`, `[BE-TEST-04]`). |
| 38 | Verify behavior and domain invariants, not shallow truthiness or implementation trivia (`[BE-TEST-03]`). |
| 39 | Coverage is diagnostic and project-configured; verify risk-weighted critical paths rather than padding code for an arbitrary percentage. |
| 40 | |
| 41 | ## Recipe |
| 42 | |
| 43 | **Write the failing test first** for the boundary or regression (`[BE-TEST-05]`). |
| 44 | **Patch one seam high enough** to keep the test readable (`[BE-TEST-04]`). |
| 45 | **Assert structured outcomes**: metadata, route result, blocker text, emitted command (`[BE-TEST-03]`). |
| 46 | **Use async tests for async code**; avoid spinning real event loops manually. |
| 47 | **Cover negative paths** for malformed packets, stale runtime state, and missing env. |
| 48 | |
| 49 | ## Anti-Patterns |
| 50 | |
| 51 | **`[BE-TEST-01]` Stylistic parametrize rewrites**: Do not demand parameterized rewrites of passing tests without a behavioral gap. |
| 52 | **`[BE-TEST-02]` SQL regex matching**: Do not regex-match SQL strings in mocks. |
| 53 | **`[BE-TEST-03]` Shallow assertions**: Never assert only `assert result`; always verify domain attributes and invariants. |
| 54 | **`[BE-TEST-04]` Pass-through seam mocks**: Ban 1:1 mock echoing without contract assertions. |
| 55 | **`[BE-TEST-05]` Bug fix without reproduction test**: Ban bug fixes without a reproduction test. |
| 56 | **No live network or DB in unit tests**: Use fakes or testcontainers. |
| 57 | **No broad monkeypatch spray**: Patch the boundary, not every helper under it. |
| 58 | **No smoke-only proof for shared runtime changes**: Add focused assertions too. |
| 59 | ## References |
| 60 | |
| 61 | [Framework Map] |
| 62 | [Pytest Patterns] |
| 63 |
Discussion
Alternatives
Code migrationMove code from one implementation to another function by function, tests first and code second, and check two implementations of one app for parity, with jscpd --compare as the progress measure and a coverage map binding each function to its tests. Use when porting a library or app to another language or framework (Java to Kotlin, JavaScript to Rust, a Python library to TypeScript, an iOS app to Android), when asked what is left to port, or when comparing the Android and iOS versions of an app.
Ahrefs pythonManages Ahrefs API usage in Python using `ahrefs-python` library. Use when working with SEO / marketing related tasks or with data including backlinks, keywords, domain ratings, organic traffic, site audits, rank tracking, and brand monitoring. Covers `ahrefs-python` usage including AhrefsClient / AsyncAhrefsClient, typed request/response models, error handling, and all API sections.adeuDocx ↔ LLM translator. Projects .docx office files to Markdown for editing. Projects edits back to OOXML as tracked changes (redlines). Python and Node.js implementations.Competitive programming assistantA competitive programming assistant that helps you write efficient and clean code .
Browse more free Claude skills or everything in Development.