Конфигурация coverage

В процессе разработки тестов важно не только проверять корректность работы кода, но и следить за его покрытием тестами. Coverage — это метрика, показывающая, какую часть исходного кода покрывают тесты. Jest предоставляет мощные инструменты для конфигурирования покрытия тестами, позволяя настроить различные аспекты сбора и отображения этой информации. Настройка покрытия помогает обнаружить «слепые зоны» в проекте, повышая качество кода и уменьшая вероятность ошибок в будущем.

Включение coverage

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

Пример запуска с командной строки:

jest --coverage

Если проект использует скрипты в package.json, то запуск будет выглядеть следующим образом:

"scripts": {
  "test": "jest --coverage"
}

Теперь при каждом запуске тестов Jest будет собирать информацию о покрытии кода и выводить её в консоль.

Конфигурация через файл jest.config.js

Для более гибкой настройки покрытия в Jest, можно использовать файл конфигурации jest.config.js. В этом файле можно задать различные параметры, такие как исключения файлов, пути для отчётов и уровни покрытия.

Пример базовой конфигурации:

module.exports = {
  collectCoverage: true,  // Включение сбора покрытия
  coverageDirectory: "coverage",  // Папка для хранения отчётов
  coverageProvider: "v8",  // Использование движка для сбора покрытия (по умолчанию: v8)
  collectCoverageFrom: [  // Указание файлов, для которых будет собираться покрытие
    "src/**/*.js",  // Все файлы JavaScript в папке src
    "!src/**/*.test.js",  // Исключение тестовых файлов
  ],
  coverageThreshold: {  // Минимальные значения покрытия для успешного теста
    global: {
      statements: 80,  // Минимум 80% покрытия для всех операторов
      branches: 70,    // Минимум 70% покрытия для ветвлений
      functions: 75,   // Минимум 75% покрытия для функций
      lines: 80,       // Минимум 80% покрытия для строк кода
    },
  },
};

Параметры конфигурации coverage

collectCoverage

Этот параметр включает или выключает сбор покрытия. Значение по умолчанию — false. При установке в true Jest будет собирать статистику покрытия для всех тестируемых файлов.

coverageDirectory

Задаёт папку, в которой будут сохраняться отчёты о покрытии. По умолчанию отчёты сохраняются в директории coverage в корне проекта. Если необходимо изменить местоположение, достаточно указать нужный путь.

coverageProvider

Jest поддерживает два разных движка для сбора покрытия: v8 и babel. Использование v8 предпочтительнее, так как это встроенный движок, работающий быстрее и точнее. Тем не менее, для проектов, использующих Babel, может быть полезен движок babel.

collectCoverageFrom

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

Примеры использования:

collectCoverageFrom: [
  "src/**/*.js",   // Все JavaScript файлы
  "!src/**/*.test.js"  // Исключаем тестовые файлы
]

coverageThreshold

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

Пример:

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

Это заставит Jest выдать ошибку, если покрытие тестами будет ниже 80% по строкам или 70% по функциям для любого файла.

Форматы отчётов

Jest поддерживает несколько форматов отчётов о покрытии, которые можно настроить в конфигурации. По умолчанию Jest генерирует отчёты в консоль в виде текста, но можно включить и другие форматы:

  • text — выводит информацию в консоль.
  • lcov — генерирует отчет в формате lcov, который можно просматривать в инструментах, таких как Codecov.
  • json — выводит отчёт в формате JSON.
  • clover — создаёт отчёт в формате Clover (используется в некоторых CI-системах).
  • html — генерирует отчёт в виде HTML, который можно открыть в браузере для наглядного анализа покрытия.

Для добавления дополнительных форматов отчётов в конфигурацию:

module.exports = {
  coverageReporters: ["text", "lcov", "html"],
};

Исключение файлов из покрытия

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

Для этого используется параметр coveragePathIgnorePatterns, в который можно передать регулярные выражения для исключения файлов.

Пример:

module.exports = {
  coveragePathIgnorePatterns: [
    "/node_modules/",  // Исключение всех файлов в node_modules
    "/src/utils/"      // Исключение всех файлов в папке utils
  ],
};

Покрытие в CI/CD

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

Для этого необходимо в конфигурации указать формат lcov в качестве одного из отчётов и настроить CI-систему для загрузки этого отчёта.

Пример конфигурации для CI:

module.exports = {
  coverageReporters: ["lcov"],
};

После этого CI-система должна быть настроена на загрузку этого отчёта.

Настройка покрытия для разных окружений

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

Для этого можно использовать настройки Jest с условными операторами или параметрами командной строки. Например, можно отключить сбор покрытия в продакшн-окружении, чтобы не замедлять выполнение тестов:

module.exports = {
  collectCoverage: process.env.NODE_ENV !== 'production',  // Включение покрытия только в режиме разработки
};

Советы по использованию coverage

  1. Итеративный подход. Не стоит сразу стремиться к 100% покрытию. Начинайте с базового покрытия, а затем постепенно увеличивайте его, улучшая тесты.
  2. Тестируйте критически важные участки. Сосредоточьтесь на тех частях кода, которые наиболее важны для работы приложения, таких как бизнес-логика, алгоритмы и ключевые компоненты.
  3. Используйте инструменты анализа покрытия. Воспользуйтесь инструментами, такими как Codecov или Coveralls, для визуализации отчётов и анализа покрытия.

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