- Runner: pytest
- Property-based: Hypothesis
- Coverage target: 80%+ (src/)
uv run pytest # all tests
uv run pytest --cov=src # with coverage
uv run pytest -x # stop on first failure
uv run pytest -k "test_parse" # filter by name
uv run pytest tests/unit/ # unit tests only
uv run pytest tests/property/ # Hypothesis tests onlytests/
├── unit/ # Pure unit tests — no I/O, no network
├── integration/ # Tests that hit the filesystem or pandas
├── property/ # Hypothesis property-based tests
└── conftest.py # Shared fixtures
- Every public function has at least one unit test
- Parsers and validators get Hypothesis
@giventests - Fixtures live in
conftest.py, not in test files - No
print()— usecaplogorcapsys - Mock external I/O at the boundary (file reads, HTTP)
Tests run automatically on every PR via GitHub Actions. All checks must pass before merge.