Исключение файлов

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


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

Файл конфигурации karma.conf.js является центральным местом, где управляется поведение тестового раннера. Исключение файлов происходит с помощью свойства exclude, которое принимает массив строк с путями к файлам или шаблонам.

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

module.exports = function(config) {
  config.set({
    basePath: '',
    frameworks: ['jasmine'],
    files: [
      'src/**/*.js',
      'test/**/*.spec.js'
    ],
    exclude: [
      'src/experimental/**/*.js',
      'src/vendor/**'
    ],
    browsers: ['ChromeHeadless'],
    singleRun: true
  });
};

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

  • Пути в exclude могут быть относительными относительно basePath.
  • Поддерживается глобовое исключение через шаблоны с * и **.
  • Файлы, указанные в exclude, не загружаются в браузер, даже если они попадают под общий шаблон files.

Шаблоны и маски файлов

Karma использует систему масок, похожую на glob-паттерны:

  • * — соответствует любой последовательности символов в одном сегменте пути.
  • ** — соответствует любой последовательности сегментов пути.
  • ? — соответствует одному символу.

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

exclude: [
  'src/**/temp-*.js',       // исключить все файлы temp-*.js в любых подпапках src
  'test/helpers/**/*.js',   // исключить все вспомогательные файлы тестов
  '**/*.min.js'              // исключить все минифицированные JS файлы
]

Исключение файлов с included: false

В некоторых случаях файлы нужно оставить доступными через сервер Karma, но не включать в тестовую страницу. Для этого используется параметр included: false внутри массива files.

Пример:

files: [
  { pattern: 'src/vendor/**/*.js', included: false },
  'src/**/*.js',
  'test/**/*.spec.js'
]

Здесь файлы из src/vendor не будут автоматически загружаться в браузер, но их можно будет динамически подключать через require или другой механизм модуляции. Это полезно при тестировании модульных библиотек, где часть кода подключается вручную.


Динамическое исключение файлов

Karma позволяет создавать динамические исключения, вычисляемые программно:

const fs = require('fs');
const path = require('path');

function getExperimentalFiles() {
  return fs.readdirSync(path.join(__dirname, 'src/experimental'))
           .map(file => 'src/experimental/' + file);
}

module.exports = function(config) {
  config.set({
    files: ['src/**/*.js', 'test/**/*.spec.js'],
    exclude: getExperimentalFiles()
  });
};

Такой подход удобен для больших проектов с часто меняющимися наборами тестируемых файлов.


Исключение в зависимости от среды

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

const isCI = process.env.CI === 'true';

module.exports = function(config) {
  config.set({
    files: ['src/**/*.js', 'test/**/*.spec.js'],
    exclude: isCI ? ['test/manual/**/*.spec.js'] : []
  });
};

Это позволяет запускать полный набор тестов локально и урезанный набор на CI, снижая время сборки.


Особенности при использовании плагинов

Некоторые плагины Karma, например karma-webpack или karma-rollup-preprocessor, могут изменять способ обработки files и exclude. Важно помнить:

  • webpack/rollup обрабатывают файлы через свой граф зависимостей. Если файл исключён в Karma, но подключён через import, он будет включён в бандл.
  • Для корректного исключения следует использовать совместное указание exclude в Karma и соответствующих конфигурациях сборщика.

Резюме принципов

  1. exclude работает только с файлами, указанными в files.
  2. Маски с * и ** позволяют гибко исключать группы файлов.
  3. Параметр included: false нужен для серверной доступности без автоматической загрузки.
  4. Динамическое и условное исключение повышает управляемость больших проектов.
  5. При интеграции с сборщиками модулей важно синхронизировать исключения, чтобы избежать нежелательного включения файлов.

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