Ответ
В моем последнем проекте мы использовали многоуровневую стратегию тестирования с автоматизацией в CI/CD.
Стек и процесс:
- Юнит-тесты: PHPUnit для тестирования отдельных классов и методов. Мы стремились к покрытию ключевой бизнес-логики.
- Интеграционные тесты: Также на PHPUnit, для проверки взаимодействия с базой данных, внешними API (через моки) и между сервисами.
- End-to-End (E2E) тесты: Для критических пользовательских сценариев использовали Laravel Dusk.
CI/CD пайплайн (GitLab CI):
test:unit:
stage: test
script:
- composer install --no-progress
- vendor/bin/phpunit --testsuite=Unit --coverage-text --colors=never
test:integration:
stage: test
services:
- mysql:latest
variables:
MYSQL_ROOT_PASSWORD: root
DB_HOST: mysql
script:
- php artisan migrate:fresh --env=testing
- php artisan db:seed --class=TestDatabaseSeeder --env=testing
- vendor/bin/phpunit --testsuite=Integration
lint:
stage: test
script:
- vendor/bin/pint --test # Запуск PHP CS Fixer
- vendor/bin/phpstan analyse --no-progress # Статический анализ
Особенности:
- База данных: Для интеграционных тестов в CI поднималась изолированная БД в Docker. Мы использовали транзакции (
DatabaseTransactionstrait) или пересоздание базы (RefreshDatabase) для изоляции тестов. - Параллельный запуск: Этапы
test:unitиlintчасто запускались параллельно для ускорения пайплайна. - Предкоммитные хуки: У многих в команде были настроены хуки в Git (через Husky или native git hooks) для запуска Pint и PHPUnit перед коммитом.