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

Karma — это тестовый раннер для JavaScript, который тесно интегрируется с инструментами покрытия кода, такими как Istanbul/nyc. Часто возникает необходимость исключить определённые файлы или директории из анализа покрытия, чтобы отчёты отражали только релевантный код, а тестирование оставалось точным и информативным. Это особенно важно для вспомогательных скриптов, конфигурационных файлов или библиотек, которые не влияют на бизнес-логику.

Настройка исключений через karma.conf.js

В конфигурационном файле Karma ключевую роль играет свойство coverageReporter. В нём можно задать параметр exclude, чтобы исключить файлы по маске.

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

module.exports = function(config) {
  config.set({
    frameworks: ['jasmine'],
    files: [
      'src/**/*.js',
      'test/**/*.spec.js'
    ],
    preprocessors: {
      'src/**/*.js': ['coverage']
    },
    reporters: ['progress', 'coverage'],
    coverageReporter: {
      type: 'html',
      dir: 'coverage/',
      exclude: [
        'src/utils/**',        // Исключение всех файлов в папке utils
        'src/config/*.js',     // Исключение всех js файлов в config
        'src/main.js'          // Исключение конкретного файла
      ]
    }
  });
};

Ключевые моменты:

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

Исключение файлов на уровне препроцессоров

Иногда требуется более точечный контроль, исключая файлы ещё до генерации покрытия. В разделе preprocessors можно применять маски только к нужным файлам:

preprocessors: {
  'src/**/*.js': ['coverage'],
  '!src/vendor/**/*.js': [] // Исключение сторонних библиотек
}

Здесь символ ! используется для инверсии маски, что позволяет не включать указанные директории в обработку coverage. Этот метод особенно полезен при большом проекте с множеством вспомогательных библиотек.

Использование karma-coverage-istanbul-reporter

В современном стеке часто применяется плагин karma-coverage-istanbul-reporter, который расширяет возможности фильтрации:

coverageIstanbulReporter: {
  reports: ['html', 'lcovonly', 'text-summary'],
  dir: 'coverage/',
  fixWebpackSourcePaths: true,
  skipFilesWithNoCoverage: true,
  'report-config': {
    html: { subdir: 'html' }
  },
  thresholds: {
    global: { statements: 80, lines: 80, branches: 75, functions: 80 }
  },
  exclude: [
    'src/helpers/**', 
    'src/config/*.js'
  ]
}

Особенности:

  • skipFilesWithNoCoverage — пропускает файлы, которые не имеют тестов.
  • fixWebpackSourcePaths — корректирует пути после сборки через Webpack.
  • exclude работает аналогично параметру в обычном coverageReporter, но с улучшенной интеграцией для сложных проектов.

Исключение файлов через .nycrc или package.json

При использовании nyc (Istanbul CLI) можно управлять исключениями на уровне конфигурации:

{
  "nyc": {
    "all": true,
    "include": ["src/**/*.js"],
    "exclude": ["src/config/*.js", "src/utils/**", "src/vendor/**"],
    "reporter": ["html", "text-summary"]
  }
}
  • all: true гарантирует, что покрытие собирается даже для файлов без тестов.
  • exclude фильтрует ненужные пути для генерации отчёта.
  • Совместим с Karma через плагин karma-coverage-istanbul-reporter.

Лучшие практики исключения

  1. Чётко разделять тестируемый код и вспомогательные файлы — это упрощает настройку исключений.
  2. Исключать только ненужные файлы, чтобы отчёты покрытия оставались максимально информативными.
  3. Использовать глобальные шаблоны (**) для директорий, а конкретные маски для отдельных файлов.
  4. Комбинировать exclude на уровне препроцессоров и coverageReporter — это даёт точный контроль и предотвращает случайное включение нежелательного кода.
  5. Автоматизировать проверку покрытия с помощью threshold — исключённые файлы не влияют на общие показатели.

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