Python/pytest TDD specialist for test-driven development workflows. Use when writing tests, auditing test quality, running pytest, or generating test reports...
Activate this skill when the user needs help with:
TESTING_REPORT.local.mdpyproject.tomlRED - Write a failing test first
GREEN - Write minimal code to pass
REFACTOR - Improve code while keeping tests green
project/
src/
module.py
tests/
conftest.py # Shared fixtures
test_module.py # Tests for module.py
pyproject.toml # Pytest configuration
test_*.py or *_test.pytest_*Test*mock_database, sample_user)import pytest
@pytest.fixture
def sample_config():
return {"key": "value"}
@pytest.fixture
def mock_client(mocker):
return mocker.MagicMock()
@pytest.mark.parametrize("input,expected", [
("hello", "HELLO"),
("world", "WORLD"),
("", ""),
])
def test_uppercase(input, expected):
assert input.upper() == expected
import pytest
@pytest.mark.asyncio
async def test_async_function():
result = await async_operation()
assert result == expected
def test_raises_value_error():
with pytest.raises(ValueError, match="invalid input"):
process_input(None)
uv run pytest # Run all tests
uv run pytest tests/test_module.py # Run specific file
uv run pytest -k "test_name" # Run by name pattern
uv run pytest -v --tb=short # Verbose with short traceback
uv run pytest --cov=src --cov-report=term # With coverage
-v / --verbose - Detailed output-x / --exitfirst - Stop on first failure--tb=short - Short tracebacks--tb=no - No tracebacks-k EXPR - Run tests matching expression-m MARKER - Run tests with marker--cov=PATH - Coverage for path--cov-report=term-missing - Show missing lines[tool.pytest.ini_options]
asyncio_mode = "auto"
testpaths = ["tests"]
[tool.pytest.ini_options]
asyncio_mode = "auto"
asyncio_default_fixture_loop_scope = "function"
testpaths = ["tests"]
python_files = ["test_*.py", "*_test.py"]
python_functions = ["test_*"]
python_classes = ["Test*"]
addopts = "-v --tb=short"
markers = [
"slow: marks tests as slow",
"integration: marks integration tests",
]
filterwarnings = [
"ignore::DeprecationWarning",
]
[tool.coverage.run]
source = ["src"]
branch = true
omit = ["tests/*", "*/__init__.py"]
[tool.coverage.report]
exclude_lines = [
"pragma: no cover",
"if TYPE_CHECKING:",
"raise NotImplementedError",
]
fail_under = 80
show_missing = true
The TESTING_REPORT.local.md file should contain:
When the user asks to write tests:
/tdd-pytest:init - Initialize pytest configuration/tdd-pytest:test [path] - Write tests using TDD (context-aware)/tdd-pytest:test-all - Run all tests/tdd-pytest:report - Generate/update TESTING_REPORT.local.md