Настройка сбора покрытия

Покрытие кода (code coverage) — это метрика, которая отображает, какая часть исходного кода была покрыта тестами. В Jest сбор покрытия является одной из важнейших возможностей, позволяющих разработчикам увидеть, насколько полно тесты проверяют их код, а также улучшить качество тестов. Настройка сбора покрытия в Jest довольно гибкая и может быть настроена под конкретные требования проекта.

Включение сбора покрытия

По умолчанию Jest поддерживает сбор покрытия, но его необходимо явно активировать. Для этого в конфигурации Jest нужно добавить параметр collectCoverage, установив его значение в true.

Пример базовой настройки:

{
  "collectCoverage": true
}

Этот параметр можно добавить в файл конфигурации jest.config.js, package.json или в команду, которую запускает Jest. После активации Jest будет собирать информацию о покрытии в процессе выполнения тестов.

Выбор файлов для покрытия

Для более точной настройки сбора покрытия в Jest предусмотрено несколько опций, которые позволяют указать, какие именно файлы должны быть охвачены анализом покрытия. Эти параметры задаются через настройки в конфигурационном файле:

  • collectCoverageFrom — позволяет указать шаблоны файлов, которые нужно анализировать на покрытие.

Пример настройки, которая собирает покрытие только для файлов в папке src:

{
  "collectCoverageFrom": ["src/**/*.js"]
}

Если нужно исключить определённые файлы или директории, это можно сделать с помощью параметра coveragePathIgnorePatterns:

{
  "coveragePathIgnorePatterns": ["/node_modules/", "/tests/"]
}

Этот параметр исключает файлы, расположенные в папке node_modules и в папке с тестами.

Форматы отчётов о покрытии

Jest поддерживает несколько форматов отчётов о покрытии, что позволяет интегрировать результаты с различными инструментами и процессами. Форматы указываются через параметр coverageReporters. Важно выбрать правильные форматы в зависимости от того, как вы планируете анализировать и визуализировать данные о покрытии.

Некоторые популярные форматы отчётов:

  • text — выводит отчёт в консоль в виде текстового отчёта, с процентами покрытия по каждому файлу.
  • lcov — генерирует HTML-отчёт, который можно просматривать в браузере.
  • json — сохраняет данные о покрытии в формате JSON.
  • clover — использует формат XML для интеграции с системами Continuous Integration.

Пример настройки с несколькими форматами отчётов:

{
  "coverageReporters": ["text", "lcov", "json"]
}

После этого Jest будет генерировать отчёты в указанных форматах. Для формата lcov обычно генерируется директория coverage/lcov-report, в которой будет доступен HTML-отчёт.

Настройки минимального покрытия

Jest позволяет задать минимальные пороги покрытия, чтобы тесты не проходили, если покрытие не соответствует заданным требованиям. Это полезно для обеспечения высокого качества тестов и предотвращения ситуаций, когда важные части кода остаются без тестирования.

Настройка минимального покрытия осуществляется через параметры:

  • coverageThreshold — позволяет указать минимальные значения покрытия для каждого типа покрытия (строки, функции, линии, блоки). Эти пороги могут быть заданы для глобального уровня или для конкретных файлов.

Пример настройки с минимальными требованиями к покрытию:

{
  "coverageThreshold": {
    "global": {
      "branches": 80,
      "functions": 90,
      "lines": 95,
      "statements": 95
    },
    "src/utils.js": {
      "branches": 100
    }
  }
}

В этом примере глобально задаются минимальные значения для всех файлов, а для файла src/utils.js требуется 100% покрытия по ветвям.

Игнорирование покрытия

Иногда бывает необходимо исключить определённые участки кода из анализа покрытия, например, для кодов, которые невозможно или не нужно тестировать (конфигурации, сгенерированные файлы и т. д.).

Для исключения кода из покрытия используются комментарии:

/* istanbul ignore next */
function ignoredFunction() {
  // Эта функция не будет учтена в покрытии
}

Такой комментарий исключает функцию ignoredFunction из отчёта о покрытии. Также можно игнорировать целые блоки:

/* istanbul ignore file */

Этот комментарий исключает весь файл из анализа покрытия.

Интеграция с CI/CD

Интеграция с системами Continuous Integration (CI) позволяет автоматизировать процесс сбора покрытия и проверку минимальных порогов покрытия. С помощью параметра coverageThreshold можно настроить так, чтобы сбор покрытия был обязательным этапом CI-процесса.

Для этого важно настраивать отчёты в формате json, который можно использовать для анализа в других системах:

{
  "coverageReporters": ["json"]
}

После этого можно интегрировать данные покрытия в такие системы, как Jenkins или GitLab CI, для автоматической проверки.

Оптимизация сбора покрытия

Сбор покрытия может быть дорогим с точки зрения времени выполнения тестов, особенно в крупных проектах с множеством файлов. Поэтому важно оптимизировать процесс тестирования, чтобы он оставался быстрым и эффективным.

  • Инициализация покрытия только для изменений — с помощью опции --onlyChanged можно собирать покрытие только для изменённых файлов, что значительно ускоряет процесс тестирования.

    Пример команды для запуска тестов только для изменённых файлов:

    jest --coverage --onlyChanged
  • Параллельный запуск тестов — Jest поддерживает параллельное выполнение тестов, что позволяет ускорить сбор покрытия для больших проектов. Этот параметр включён по умолчанию, но его можно настроить через maxWorkers.

Заключение

Настройка сбора покрытия в Jest даёт мощные инструменты для контроля качества кода и тестов. Гибкость настройки позволяет точно определить, какие файлы и участки кода должны быть покрыты тестами, а также задать пороговые значения для гарантии высокой полноты покрытия. Важно правильно интегрировать сбор покрытия в процесс CI/CD, чтобы обеспечить автоматическую проверку качества тестов на всех этапах разработки.