| name | testing |
| description | Use when writing or modifying tests, fixing bugs with TDD, reviewing test code, or when user mentions "test", "tests", "testing", "TDD", "test-driven", "pytest", "add tests", "write tests", "unit test", "integration test", "test coverage", "bug fix", "fix bug", "verify", "edge case", "mocking", "patch.object". |
Testing Best Practices
Core Philosophy
Write invariant-based tests that verify what SHOULD be true, not bug-affirming tests that prove bugs existed.
Test-Driven Development (TDD)
ALWAYS use TDD when fixing bugs:
- Find existing tests for the broken functionality
- Run them to verify they pass (shouldn't catch bug)
- Improve tests until they fail (exposing the bug)
- Fix the code to make tests pass
- Verify all tests pass
Quick Start
grep -r "@pytest.fixture" tests/conftest.py
ls tests/test_<module_name>/
pytest --cov=src --cov-report=term-missing
Critical Rules Quick Reference
Mocking
@patch.object(MyClass, 'method_name')
generator = NewsPostGenerator()
generator._queries_chain = AsyncMock()
await generator.generate_news_post(...)
Test Data
return UserResult(user_id=user_id, name="Test User", ...)
DEFAULT_TIMEOUT = 60
STALE_THRESHOLD = DEFAULT_TIMEOUT + 10
Invariant Testing
def test_selector_populated_with_all_names():
"""INVARIANT: Selector contains all names from config."""
config = make_config_with_items(["item1", "item2", "item3"])
page = setup_page_with_config(config)
assert page.item_selector.options == ["item1", "item2", "item3"]
E2E Testing
await service.process_request(request_input)
published_event = mock_queue.publish.call_args.kwargs["output"]
assert published_event.data is not None
Intent & Testability
def apply_suffix(user_id: str, name: str, is_special: bool) -> tuple[str, str]:
"""Pure function - easily testable without mocks."""
if is_special:
return f"{user_id}_special", f"{name}_special"
return user_id, name
@pytest.mark.parametrize("user_id,name,is_special,expected_id,expected_name", [
("alice", "Alice", True, "alice_special", "Alice_special"),
("alice", "Alice", False, "alice", "Alice"),
])
def test_suffix_behavior(user_id, name, is_special, expected_id, expected_name):
result_id, result_name = apply_suffix(user_id, name, is_special)
assert result_id == expected_id
Testing Checklist
Before committing:
Reference Files
For detailed patterns and examples:
Remember: When user reports bug, use TDD - find tests -> run -> improve until fail -> fix code -> verify pass.