python-pytest-patterns
npx machina-cli add skill aiskillstore/marketplace/python-pytest-patterns --openclawFiles (1)
SKILL.md
4.9 KB
Python pytest Patterns
Modern pytest patterns for effective testing.
Basic Test Structure
import pytest
def test_basic():
"""Simple assertion test."""
assert 1 + 1 == 2
def test_with_description():
"""Descriptive name and docstring."""
result = calculate_total([1, 2, 3])
assert result == 6, "Sum should equal 6"
Fixtures
import pytest
@pytest.fixture
def sample_user():
"""Create test user."""
return {"id": 1, "name": "Test User"}
@pytest.fixture
def db_connection():
"""Fixture with setup and teardown."""
conn = create_connection()
yield conn
conn.close()
def test_user(sample_user):
"""Fixtures injected by name."""
assert sample_user["name"] == "Test User"
Fixture Scopes
@pytest.fixture(scope="function") # Default - per test
@pytest.fixture(scope="class") # Per test class
@pytest.fixture(scope="module") # Per test file
@pytest.fixture(scope="session") # Entire test run
Parametrize
@pytest.mark.parametrize("input,expected", [
(1, 2),
(2, 4),
(3, 6),
])
def test_double(input, expected):
assert double(input) == expected
# Multiple parameters
@pytest.mark.parametrize("x", [1, 2])
@pytest.mark.parametrize("y", [10, 20])
def test_multiply(x, y): # 4 test combinations
assert x * y > 0
Exception Testing
def test_raises():
with pytest.raises(ValueError) as exc_info:
raise ValueError("Invalid input")
assert "Invalid" in str(exc_info.value)
def test_raises_match():
with pytest.raises(ValueError, match=r".*[Ii]nvalid.*"):
raise ValueError("Invalid input")
Markers
@pytest.mark.skip(reason="Not implemented yet")
def test_future_feature():
pass
@pytest.mark.skipif(sys.platform == "win32", reason="Unix only")
def test_unix_feature():
pass
@pytest.mark.xfail(reason="Known bug")
def test_buggy():
assert broken_function() == expected
@pytest.mark.slow
def test_performance():
"""Custom marker - register in pytest.ini."""
pass
Mocking
from unittest.mock import Mock, patch, MagicMock
def test_with_mock():
mock_api = Mock()
mock_api.get.return_value = {"status": "ok"}
result = mock_api.get("/endpoint")
assert result["status"] == "ok"
@patch("module.external_api")
def test_with_patch(mock_api):
mock_api.return_value = {"data": []}
result = function_using_api()
mock_api.assert_called_once()
pytest-mock (Recommended)
def test_with_mocker(mocker):
mock_api = mocker.patch("module.api_call")
mock_api.return_value = {"success": True}
result = process_data()
assert result["success"]
conftest.py
# tests/conftest.py - Shared fixtures
import pytest
@pytest.fixture(scope="session")
def app():
"""Application fixture available to all tests."""
return create_app(testing=True)
@pytest.fixture
def client(app):
"""Test client fixture."""
return app.test_client()
Quick Reference
| Command | Description |
|---|---|
pytest | Run all tests |
pytest -v | Verbose output |
pytest -x | Stop on first failure |
pytest -k "test_name" | Run matching tests |
pytest -m slow | Run marked tests |
pytest --lf | Rerun last failed |
pytest --cov=src | Coverage report |
pytest -n auto | Parallel (pytest-xdist) |
Additional Resources
./references/fixtures-advanced.md- Factory fixtures, autouse, conftest patterns./references/mocking-patterns.md- Mock, patch, MagicMock, side_effect./references/async-testing.md- pytest-asyncio patterns./references/coverage-strategies.md- pytest-cov, branch coverage, reports./references/integration-testing.md- Database fixtures, API testing, testcontainers./references/property-testing.md- Hypothesis framework, strategies, shrinking./references/test-architecture.md- Test pyramid, organization, isolation strategies
Scripts
./scripts/run-tests.sh- Run tests with recommended options./scripts/generate-conftest.sh- Generate conftest.py boilerplate
Assets
./assets/pytest.ini.template- Recommended pytest configuration./assets/conftest.py.template- Common fixture patterns
See Also
Related Skills:
python-typing-patterns- Type-safe test codepython-async-patterns- Async test patterns (pytest-asyncio)
Testing specific frameworks:
python-fastapi-patterns- TestClient, API testingpython-database-patterns- Database fixtures, transactions
Source
git clone https://github.com/aiskillstore/marketplace/blob/main/skills/0xdarkmatter/python-pytest-patterns/SKILL.mdView on GitHub Overview
This skill covers modern pytest patterns for effective Python testing, including fixtures, parametrization, mocking, and conftest usage. It helps you write cleaner, scalable tests, improve test coverage, and detect defects early.
How This Skill Works
It demonstrates practical templates: define fixtures with scoped lifetimes, parameterize tests to cover multiple inputs, and use pytest.raises for exception checks. Tests can be organized with conftest.py for shared setup and with markers or mocks to isolate behavior.
When to Use It
- When building robust unit tests with shared setup via fixtures
- When testing multiple input combinations via parametrization
- When validating that code raises specific exceptions
- When organizing tests with shared setup in conftest.py and fixture scopes
- When isolating dependencies using mocks or the pytest-mock integration
Quick Start
- Step 1: Create a test file with simple assertions (e.g., test_basic).
- Step 2: Add fixtures using @pytest.fixture and inject them into tests.
- Step 3: Run pytest, and iterate with parametrize, raises, and mocks as needed.
Best Practices
- Prefer fixtures over in-test setup and choose the appropriate scope (function, class, module, session)
- Parameterize tests instead of duplicating test logic for multiple inputs
- Use pytest.raises to assert exception type and message
- Leverage markers (skip, skipif, xfail, slow) to control test execution
- Keep tests fast, deterministic, and well-documented with descriptive names and docstrings
Example Use Cases
- Basic tests with simple assertions (test_basic, test_with_description)
- Fixtures injected by name (test_user with sample_user fixture)
- Parametrize usage (test_double and test_multiply)
- Exception testing with pytest.raises (test_raises, test_raises_match)
- Mocking external dependencies (test_with_mock, test_with_patch and pytest-mock example)
Frequently Asked Questions
Add this skill to your agents