CI/CD и автоматические тесты
Интеграция тестов в CI/CD пайплайн — ключевой элемент качества: тесты запускаются автоматически при каждом изменении кода и блокируют деплой при провале.
Зачем нужно
Ручной запуск тестов перед деплоем легко забыть или пропустить. Тесты в CI/CD запускаются автоматически и являются обязательным условием для продвижения кода дальше по пайплайну. Это создаёт культуру quality gate: плохой код физически не может попасть в продакшн.
Где используется
- Unit-тесты (Jest, Vitest) — при каждом push и PR
- Integration-тесты с реальной БД — через service containers в GitHub Actions
- E2E-тесты (Playwright, Cypress) — перед деплоем на staging
- Snapshot-тесты компонентов — блокируют нежелательные визуальные изменения
Основной контент
Уровни тестирования в пайплайне
Push → Lint → Unit тесты → Integration тесты → Build → E2E → Deploy
↑ быстро (< 1 мин) ↑ медленнее (2-5 мин) ↑ самые медленные
Unit-тесты в GitHub Actions
jobs:
unit-test:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/setup-node@v4
with:
node-version: 20
cache: npm
- run: npm ci
- run: npm run test:unit -- --coverage --reporter=verbose
Integration-тесты с PostgreSQL
jobs:
integration-test:
runs-on: ubuntu-latest
services:
db:
image: postgres:16-alpine
env:
POSTGRES_USER: testuser
POSTGRES_PASSWORD: testpass
POSTGRES_DB: testdb
ports:
- 5432:5432
options: --health-cmd pg_isready --health-interval 10s --health-retries 5
steps:
- uses: actions/checkout@v4
- uses: actions/setup-node@v4
with:
node-version: 20
cache: npm
- run: npm ci
- name: Run migrations
run: npm run db:migrate
env:
DATABASE_URL: postgres://testuser:testpass@localhost:5432/testdb
- name: Run integration tests
run: npm run test:integration
env:
DATABASE_URL: postgres://testuser:testpass@localhost:5432/testdb
E2E-тесты с Playwright
jobs:
e2e:
needs: [unit-test, integration-test]
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/setup-node@v4
with:
node-version: 20
cache: npm
- run: npm ci
- name: Install Playwright browsers
run: npx playwright install --with-deps chromium
- name: Start app
run: npm start &
env:
NODE_ENV: test
- name: Run E2E tests
run: npx playwright test
- uses: actions/upload-artifact@v4
if: failure
with:
name: playwright-report
path: playwright-report/
Coverage-репорт
- name: Upload coverage to Codecov
uses: codecov/codecov-action@v4
with:
token: ${{ secrets.CODECOV_TOKEN }}
fail_ci_if_error: true
Частые ошибки
- Тесты зависят от порядка выполнения: каждый тест должен быть независимым
- Отсутствие
--forceExitв Jest при незакрытых соединениях с БД — пайплайн зависает - E2E запускаются без ожидания готовности сервера (
wait-onрешает проблему) - Игнорирование failed тестов с флагом
continue-on-error: true— потеря смысла CI
Связанные темы
- _MOC DevOps
- CI -- автоматические тесты
- Автоматический деплой
- DevOps -- что такое и зачем
- Линтинг и форматирование в CI