- Tests protect behavior, not coverage.
- Prefer high-signal tests.
- Tests must fail only on real regressions.
- Test observable behavior, never implementation details.
- Mandatory for: new features, bug fixes, behavior refactors, non-trivial logic, critical paths.
- Not required for: trivial getters/setters, wiring, config, generated code.
- Default: unit tests
- Use integration tests at system boundaries.
- Use E2E tests only for critical business flows.
- Prefer integration over heavy mocking.
- Tests must be independent, deterministic, fast, readable.
- Structure: Arrange → Act → Assert.
- Avoid multi-purpose tests.
- Business logic
- Edge cases
- Failure paths
- Boundaries & invariants
should_<expected_behavior>_when_<condition>
- Assert outputs, state, and side effects.
- Never assert private methods, internal variables, or call order.
- Mock only: external services, DB, queues, filesystem, time.
- Never mock: domain logic, value objects, pure functions.
- Prefer fakes/in-memory adapters.
- Use builders/factories.
- Keep data minimal and expressive.
- Every bug fix requires a failing regression test.
- Add tests before behavior refactors.
- Never generate shallow coverage tests.
- Avoid snapshot tests unless requested.
- Ask for clarification instead of guessing behavior.