Unnamed Skill
Advanced Python testing strategies with Pytest, covering fixtures, matrix testing with parametrization, and async test architecture. Triggers: pytest, fixtures, parametrize, pytest-asyncio, matrix-testing, yield-fixture.
$ 安裝
git clone https://github.com/majiayu000/claude-skill-registry /tmp/claude-skill-registry && cp -r /tmp/claude-skill-registry/skills/testing/pytest-patterns ~/.claude/skills/claude-skill-registry// tip: Run this command in your terminal to install the skill
SKILL.md
name: pytest-patterns description: Advanced Python testing strategies with Pytest, covering fixtures, matrix testing with parametrization, and async test architecture. Triggers: pytest, fixtures, parametrize, pytest-asyncio, matrix-testing, yield-fixture.
Pytest Advanced Patterns
Overview
Pytest is a powerful testing framework that emphasizes modularity via fixtures and scalability via parametrization. It simplifies setup/teardown logic and enables complex test matrices with minimal code.
When to Use
- Resource Intensive Tests: Using scoped fixtures for database or API connections to avoid redundant setup.
- Input Combinations: Using parametrization to test a single function against dozens of inputs.
- Async Codebases: Testing coroutines directly without manual event loop management.
Decision Tree
- Is the setup expensive (e.g., creating a DB)?
- YES: Use a fixture with
scope='session'orscope='module'.
- YES: Use a fixture with
- Do you need to cleanup after a test?
- YES: Use a
yieldfixture.
- YES: Use a
- Do you have 3+ similar test cases for one function?
- YES: Use
@pytest.mark.parametrize.
- YES: Use
Workflows
1. Defining a Scoped Setup/Teardown
- Create a fixture using the
@pytest.fixture(scope="module")decorator for expensive resources like database connections. - Use
yieldto provide the resource to tests. - Add cleanup code (e.g., closing the connection) after the
yieldstatement. - Request the fixture by name in any test function within the module.
2. Matrix Testing with Stacked Parametrize
- Apply
@pytest.mark.parametrize("user", ["admin", "guest"])to a test. - Apply a second
@pytest.mark.parametrize("action", ["read", "write"])to the same test. - Pytest will run the test 4 times, once for each combination (admin-read, admin-write, etc.).
3. Testing Async Code
- Install
pytest-asyncio. - Mark the test function with
@pytest.mark.asyncio. - Define the test as an
async def. - Use
awaitfor the code under test and assertions.
Non-Obvious Insights
- Fixture Caching: Fixtures are executed once per requested scope and the return value is cached for all tests in that scope.
- Reverse Teardown: Teardown logic in
yieldfixtures is executed in the exact reverse order of the setup sequence. - Auto-Async Marking: Modern
pytest-asynciocan be configured to treat allasync deftests as async without needing the explicit decorator on every function.
Evidence
- "pytest won’t execute them again for that test... return values are cached." - Pytest Docs
- "Yield fixtures yield instead of return... Any teardown code for that fixture is placed after the yield." - Pytest Docs
- "provides support for coroutines as test functions. This allows users to await code inside their tests." - pytest-asyncio
Scripts
scripts/pytest-patterns_tool.py: Examples of fixtures, parametrization, and async tests.scripts/pytest-patterns_tool.js: (Comparison) Equivalent logic in Vitest/Jest.
Dependencies
pytestpytest-asyncio
References
Repository

majiayu000
Author
majiayu000/claude-skill-registry/skills/testing/pytest-patterns
0
Stars
0
Forks
Updated17h ago
Added1w ago