В Karma entry points определяют, какие файлы
загружаются в браузер для выполнения тестов. Это ключевой элемент,
обеспечивающий корректную инициализацию тестовой среды и контроль над
зависимостями. В конфигурации Karma файлы указываются через опцию
files, а порядок их подключения влияет на стабильность
тестирования.
Формат подключения файлов:
files: [
'src/**/*.js', // исходный код приложения
'test/**/*.spec.js', // тесты
{ pattern: 'assets/**/*', included: false } // ресурсы, не включаемые автоматически
]
included: true — файл подключается через
<script> автоматически.included: false — файл доступен в браузере, но не
выполняется сразу, используется, например, для ассетов или динамических
импортов.served: true/false — управляет тем, доступен ли файл
через сервер Karma.watched: true/false — отслеживание изменений файла для
авто-перезапуска тестов.Особенности работы с зависимостями
Порядок подключения файлов критичен, если проект не использует модульные загрузчики (Webpack, SystemJS). Karma выполняет файлы в том порядке, в котором они перечислены. Например, библиотеки должны идти перед исходным кодом:
files: [
'node_modules/jquery/dist/jquery.js',
'src/lib/**/*.js',
'src/**/*.js',
'test/**/*.spec.js'
]
Использование шаблонов с **/* позволяет автоматически
включать новые файлы без изменения конфигурации.
Для современных проектов с модульной системой Karma часто
интегрируется с Webpack через
karma-webpack. В этом случае entry point указывается как
файл, импортирующий все тесты:
files: [
'test/test-index.js'
],
preprocessors: {
'test/test-index.js': ['webpack']
}
Содержимое test-index.js может быть динамическим:
const context = require.context('./', true, /\.spec\.js$/);
context.keys().forEach(context);
Такой подход гарантирует, что Webpack создаст единую сборку тестов, автоматически включающую все модули. Это упрощает управление зависимостями и обеспечивает совместимость с ES6-модулями.
Lazy loading и included: false Если
проект содержит большие ассеты или сторонние библиотеки, их можно
загружать только при необходимости. Пример для JSON-файлов:
files: [
{ pattern: 'test/fixtures/**/*.json', watched: true, included: false, served: true }
]
В тестах они будут доступны через URL, предоставляемый Karma:
fetch('/base/test/fixtures/data.json')
.then(res => res.json())
.then(data => {
expect(data).toBeDefined();
});
Группировка entry points Для больших проектов удобно
создавать несколько entry points, например, unit-tests.js и
integration-tests.js. В конфигурации Karma можно подключать
их через массив files или переключать через
karma.conf.js:
files: process.env.TEST_TYPE === 'integration'
? ['test/integration-tests.js']
: ['test/unit-tests.js']
При работе с TypeScript entry points обрабатываются через препроцессоры:
files: [
'test/**/*.ts'
],
preprocessors: {
'test/**/*.ts': ['karma-typescript']
}
karma-typescript компилирует TS в JS перед выполнением,
сохраняя source maps для отладки. Важно корректно настроить
tsconfig.json, чтобы пути модулей совпадали с конфигурацией
Karma.
Karma предоставляет несколько способов контроля порядка загрузки:
included: true и директивами
before/after в сборщиках — для
сложных зависимостей.Неправильный порядок подключения часто вызывает ошибки типа
ReferenceError или TypeError, особенно при
тестировании глобальных объектов.
included: false для больших файлов и
ассетов..spec.js.Такое управление entry points обеспечивает масштабируемость тестовой инфраструктуры, контроль зависимостей и сокращает время настройки тестов при расширении проекта.