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