Как запускались тесты в прошлой компании?

«Как запускались тесты в прошлой компании?» — вопрос из категории Тестирование, который задают на 24% собеседований PHP Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

В моем последнем проекте мы использовали многоуровневую стратегию тестирования с автоматизацией в 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 # Статический анализ

Особенности:

  1. База данных: Для интеграционных тестов в CI поднималась изолированная БД в Docker. Мы использовали транзакции (DatabaseTransactions trait) или пересоздание базы (RefreshDatabase) для изоляции тестов.
  2. Параллельный запуск: Этапы test:unit и lint часто запускались параллельно для ускорения пайплайна.
  3. Предкоммитные хуки: У многих в команде были настроены хуки в Git (через Husky или native git hooks) для запуска Pint и PHPUnit перед коммитом.