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

Связанные темы

Ресурсы