CI: автоматические тесты

Continuous Integration (CI) — практика автоматического запуска тестов при каждом пуше кода, чтобы сломанный код не попал в основную ветку.

Зачем нужно

Автоматические тесты в CI дают немедленную обратную связь: разработчик узнаёт о сломанном коде до code review, а не после деплоя. Это особенно важно в командной работе — CI блокирует merge, если тесты не прошли, и гарантирует, что main-ветка всегда в рабочем состоянии.

Где используется

  • Запуск unit- и integration-тестов при каждом Pull Request в GitHub
  • Проверка линтинга и типов (ESLint, TypeScript) в пайплайне перед слиянием
  • E2E-тесты (Playwright, Cypress) при деплое на staging-среду
  • Тесты для monorepo: запускаются только тесты изменённых пакетов

Основной контент

Типичный CI-пайплайн для Node.js

# .github/workflows/ci.yml
name: CI

on:
  push:
    branches: [main, develop]
  pull_request:
    branches: [main]

jobs:
  test:
    runs-on: ubuntu-latest

    strategy:
      matrix:
        node-version: [20.x, 22.x]   # тестируем на двух версиях Node

    steps:
      - uses: actions/checkout@v4

      - name: Use Node.js ${{ matrix.node-version }}
        uses: actions/setup-node@v4
        with:
          node-version: ${{ matrix.node-version }}
          cache: 'npm'

      - name: Install dependencies
        run: npm ci

      - name: Run linter
        run: npm run lint

      - name: Run tests
        run: npm test -- --coverage

      - name: Upload coverage
        uses: codecov/codecov-action@v4

Параллельные джобы

jobs:
  lint:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - run: npm ci && npm run lint

  test:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - run: npm ci && npm test

  typecheck:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - run: npm ci && npx tsc --noEmit

Кэширование зависимостей

- name: Cache node_modules
  uses: actions/cache@v4
  with:
    path: ~/.npm
    key: ${{ runner.os }}-node-${{ hashFiles('**/package-lock.json()') }}
    restore-keys: |
      ${{ runner.os }}-node-

Статус-бейджи

![CI](https://github.com/myuser/myrepo/actions/workflows/ci.yml/badge.svg)

Частые ошибки

  • npm install вместо npm ci в пайплайне — npm ci воспроизводим и быстрее
  • Тесты, зависящие от локальной БД: в CI нужен сервис (service containers) или моки
  • Отсутствие кэша зависимостей — каждый запуск скачивает node_modules заново (медленно)
  • Игнорирование провалившегося пайплайна ради скорости: CI теряет смысл

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

Ресурсы