При работе с 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. Важно помнить:
import, он будет включён в бандл.exclude работает только с файлами, указанными в
files.* и ** позволяют гибко исключать
группы файлов.included: false нужен для серверной
доступности без автоматической загрузки.Эти механизмы позволяют точно управлять тестовой средой, минимизировать конфликтные файлы и ускорять выполнение тестов в крупных проектах.