PHP Testing
Priority: P1 (HIGH)
Structure
See implementation examples for test directory layout.
Write Tests with PHPUnit and Pest
- Standards: Use
PHPUnit(9/10+) orPest. Organize intoUnit/,Integration/, andFeature/. Class names should extendTestCase. - TDD Workflow: Follow Red-Green-Refactor. Write failing test first, implement minimal logic, then refactor.
See implementation examples for PHPUnit service test with mock.
Apply Assertions and Data Providers
- Fluent Assertions: Use
assertSame(===) overassertEqualsto avoid type coercion. Also useassertCount()andassertMatchesRegularExpression(). - Data Providers: Use
#[DataProvider('statusProvider')](PHPUnit 10+) ordataset(Pest).
See implementation examples for Pest expressive syntax with datasets.
Isolate Test Dependencies
- Mocking: Use
createMock()for dependencies. DO NOT mock simple Data Objects. - Isolation: Ensure tests are Independent and Repeatable. DB tests must use
TransactionsorSQLite :memory:. - Coverage: Aim for
80%+line coverage. Usephpunit.xmlto whitelist specific directories. - Automation: Run tests on every PR using GitHub Actions or GitLab CI.
Anti-Patterns
- No testing private methods: Test through public interfaces only.
- No over-mocking internals: Mock only external boundaries.
- No real network/DB in unit tests: Use in-memory databases or mocks.
- No coverage-metric chasing: Prioritize meaningful assertions.