Какие этапы тестирования есть в процессе сборки приложения (CI/CD)?

«Какие этапы тестирования есть в процессе сборки приложения (CI/CD)?» — вопрос из категории CI/CD, который задают на 23% собеседований Devops Инженер. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

В CI/CD-пайплайне я выстраиваю многоуровневую пирамиду тестирования, где быстрые и дешевые тесты запускаются раньше медленных и дорогих:

  1. Статический анализ (SAST): Проверка кода и конфигураций без его запуска. Я интегрировал trivy для сканирования Docker-образов на уязвимости, checkov или tfsec для инфраструктурного кода (Terraform), и sonarqube для анализа качества кода приложения.
  2. Модульное тестирование (Unit Tests): Быстрые тесты, изолирующие и проверяющие отдельные функции или классы. Они выполняются первыми в пайплайне. Для Go я использовал go test, для Python — pytest.
  3. Интеграционное тестирование: Тесты, проверяющие взаимодействие нескольких компонентов приложения (например, сервиса с базой данных или кэшем). В CI я часто разворачивал временный docker-compose или поды в тестовом namespace Kubernetes для этих целей.
  4. End-to-End (E2E) тестирование: Сквозные тесты, имитирующие действия реального пользователя в почти готовом окружении (staging). Я использовал cypress для веб-приложений и k6 для скриптов проверки API.
  5. Нагрузочное тестирование (Performance/Load Testing): Проверка поведения системы под нагрузкой. Я запускал k6 или vegeta в пайплайне на staging-окружении, чтобы убедиться, что изменения не деградировали производительность.
  6. Тестирование безопасности (DAST): Динамическое тестирование на проникновение. Инструменты вроде OWASP ZAP можно запускать автоматически против staging-среды.
  7. Smoke-тесты после деплоя: После каждого деплоя (как в staging, так и в production) автоматически запускаются базовые health-check тесты, чтобы убедиться, что приложение запустилось и отвечает на запросы.

Пример порядка в GitLab CI:

stages:
  - security
  - test
  - integration
  - e2e
  - performance

sast:
  stage: security
  script:
    - trivy fs --severity HIGH,CRITICAL .

unit-tests:
  stage: test
  script:
    - npm run test:unit

integration-tests:
  stage: integration
  script:
    - docker-compose -f docker-compose.test.yml up -d
    - npm run test:integration
    - docker-compose down

e2e-tests:
  stage: e2e
  script:
    - kubectl apply -f k8s/manifests-staging/  # Deploy to test env
    - npm run test:e2e
  environment:
    name: staging