Jest: coverage отчёты

Coverage (покрытие кода) в Jest — метрика, показывающая какая доля строк, ветвей, функций и выражений выполняется во время тестов.

Зачем нужно

Coverage-отчёт позволяет найти непроверенные ветви кода и снизить риск скрытых багов. CI-пайплайн может блокировать мерж если покрытие упало ниже порога — это дисциплинирует команду. Важно понимать: 100% coverage не означает отсутствие багов, но низкий процент — верный признак рисков.

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

  • CI/CD: проверка coverage-threshold перед мержем в main
  • Code review: быстрая идентификация непокрытых ветвей
  • Рефакторинг: убедиться, что тест действительно проходит по изменённому коду
  • Onboarding: новый разработчик видит, что вообще покрыто тестами

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

Запуск сбора coverage

npx jest --coverage

# Или через скрипт в package.json
# "test:coverage": "jest --coverage"

Конфигурация в jest.config.js

module.exports = {
  collectCoverage: true,
  coverageDirectory: 'coverage',
  coverageReporters: ['text', 'lcov', 'html'],

  coverageThreshold: {
    global: {
      branches: 80,
      functions: 80,
      lines: 80,
      statements: 80,
    },
  },

  collectCoverageFrom: [
    'src/**/*.{js,ts}',
    '!src/**/*.d.ts',
    '!src/index.js',
  ],
};

Метрики coverage

Метрика Что считает
Statements Отдельные выражения
Branches Ветви if/else, тернарные, &&, ??
Functions Объявленные функции
Lines Строки с кодом

Исключение строк из coverage

function devOnly() {
  /* istanbul ignore next */
  if (process.env.NODE_ENV === 'development') {
    console.log('debug');
  }
}

HTML-отчёт

После запуска открой coverage/lcov-report/index.html — интерактивный отчёт с подсветкой непокрытых строк и ветвей по каждому файлу.

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

  • Coverage 100% = безопасность — тесты могут проходить строки, но не проверять корректность результата
  • Не задан collectCoverageFrom — неиспортируемые файлы не попадут в отчёт
  • Порог 100% с первого дня — блокирует работу; начинай с 70–80% и повышай постепенно
  • Коммит папки coverage/ — добавь её в .gitignore

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

Ресурсы