askill
pytest-advanced

pytest-advancedSafety 98Repository

Advanced pytest patterns including fixtures, markers, parametrization, and parallel execution. Use when implementing test infrastructure, organizing test suites, writing fixtures, or running tests with coverage. Covers pytest-cov, pytest-asyncio, pytest-xdist, pytest-mock.

16 stars
1.2k downloads
Updated 4 days ago

Package Files

Loading files...
SKILL.md

Advanced Pytest Patterns

Advanced pytest features for robust, maintainable test suites.

When to Use This Skill

Use this skill when...Use python-testing instead when...
Writing fixtures with scopes/factoriesBasic test structure questions
Parametrizing with complex dataSimple assert patterns
Setting up pytest plugins (cov, xdist)Running existing tests
Organizing conftest.py hierarchyTest discovery basics
Async testing with pytest-asyncioSynchronous unit tests

Installation

# Core + common plugins
uv add --dev pytest pytest-cov pytest-asyncio pytest-xdist pytest-mock

Configuration (pyproject.toml)

[tool.pytest.ini_options]
testpaths = ["tests"]
addopts = [
    "-v",
    "--strict-markers",
    "--tb=short",
    "-ra",
    "--cov=src",
    "--cov-report=term-missing",
    "--cov-fail-under=80",
]
markers = [
    "slow: marks tests as slow (deselect with '-m \"not slow\"')",
    "integration: marks tests as integration tests",
]
asyncio_mode = "auto"

[tool.coverage.run]
branch = true
source = ["src"]

[tool.coverage.report]
exclude_lines = ["pragma: no cover", "if TYPE_CHECKING:", "@abstractmethod"]

Fixtures

Scopes and Lifecycle

import pytest
from typing import Generator

# function (default) - fresh per test
@pytest.fixture
def db() -> Generator[Database, None, None]:
    database = Database(":memory:")
    database.create_tables()
    yield database
    database.close()

# session - shared across all tests
@pytest.fixture(scope="session")
def app():
    return create_app("testing")

# autouse - applies automatically
@pytest.fixture(autouse=True)
def reset_state():
    clear_cache()
    yield
ScopeLifetime
functionEach test (default)
classEach test class
moduleEach test file
sessionEntire test run

Parametrized Fixtures

@pytest.fixture(params=["sqlite", "postgres", "mysql"])
def database_backend(request) -> str:
    return request.param  # Test runs 3 times

# Indirect parametrization
@pytest.fixture
def user(request) -> User:
    return User(**request.param)

@pytest.mark.parametrize("user", [
    {"name": "Alice", "age": 30},
    {"name": "Bob", "age": 25},
], indirect=True)
def test_user_validation(user: User):
    assert user.name

Factory Pattern

@pytest.fixture
def user_factory() -> Callable[[str], User]:
    created: list[User] = []
    def _create(name: str, **kwargs) -> User:
        user = User(name=name, **kwargs)
        created.append(user)
        return user
    yield _create
    for u in created:
        u.delete()

Markers

# Built-in markers
@pytest.mark.skip(reason="Not implemented")
@pytest.mark.skipif(sys.version_info < (3, 12), reason="Requires 3.12+")
@pytest.mark.xfail(reason="Known bug #123")
@pytest.mark.timeout(10)

# Parametrize
@pytest.mark.parametrize("input,expected", [
    pytest.param(2, 4, id="two"),
    pytest.param(3, 9, id="three"),
    pytest.param(-2, 4, id="negative"),
])
def test_square(input: int, expected: int):
    assert input ** 2 == expected
# Run by marker
pytest -m unit                    # Only unit tests
pytest -m "not slow"              # Skip slow tests
pytest -m "integration and not slow"  # Combine markers

Key Plugins

PluginPurposeKey Command
pytest-covCoveragepytest --cov=src --cov-report=term-missing
pytest-xdistParallelpytest -n auto
pytest-asyncioAsync testsasyncio_mode = "auto" in config
pytest-mockMockingmocker fixture
pytest-timeoutTimeouts@pytest.mark.timeout(10)

Async Testing (pytest-asyncio)

@pytest.mark.asyncio
async def test_async_function():
    result = await fetch_data()
    assert result is not None

@pytest.fixture
async def async_client() -> AsyncGenerator[AsyncClient, None]:
    async with AsyncClient() as client:
        yield client

Mocking (pytest-mock)

def test_with_mock(mocker):
    mock_api = mocker.patch("myapp.external.api_call")
    mock_api.return_value = {"data": "test"}
    result = my_function()
    assert result["data"] == "test"
    mock_api.assert_called_once()

Running Tests

# Execution
pytest                           # All tests
pytest tests/test_models.py::test_user  # Specific test
pytest -k "user and not slow"    # Pattern matching

# Parallel
pytest -n auto                   # All CPUs
pytest -n 4                      # 4 workers

# Coverage
pytest --cov=src --cov-report=html --cov-report=term-missing

# Failed tests
pytest --lf                      # Last failed only
pytest --ff                      # Failed first
pytest -x                        # Stop on first failure
pytest --maxfail=3               # Stop after 3

# Debugging
pytest -x --pdb                  # Debug on failure
pytest -s                        # Show print output
pytest --collect-only            # Dry run

CI Integration

# .github/workflows/test.yml
- name: Run tests
  run: |
    uv run pytest \
      --cov=src \
      --cov-report=xml \
      --cov-report=term-missing \
      --junitxml=test-results.xml

Agentic Optimizations

ContextCommand
Quick checkpytest -x --tb=short -q
Fail fastpytest -x --maxfail=1 --tb=short
Parallel fastpytest -n auto -x --tb=short -q
Specific testpytest tests/test_foo.py::test_bar -v
By markerpytest -m "not slow" -x --tb=short
Coverage checkpytest --cov=src --cov-fail-under=80 -q
CI modepytest --junitxml=results.xml --cov-report=xml -q
Last failedpytest --lf --tb=short
Debugpytest -x --pdb -s

For detailed patterns on conftest.py hierarchy, async testing, test organization, and common patterns, see REFERENCE.md.

Install

Download ZIP
Requires askill CLI v1.0+

AI Quality Score

84/100Analyzed 2 days ago

High-quality technical reference skill for advanced pytest patterns. Well-structured with comprehensive sections on fixtures, markers, plugins, and CI integration. Includes actionable "When to Use" guidance and an Agentic Optimizations table for efficient test execution. Though located in a plugin-specific subdirectory, the content is broadly applicable to any Python pytest project. Minor gap is referencing external REFERENCE.md for complete details.

98
87
72
82
88

Metadata

Licenseunknown
Version-
Updated4 days ago
Publisherlaurigates

Tags

ci-cddatabasegithubgithub-actionstesting