Работа с entry points

В 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'
]

Использование шаблонов с **/* позволяет автоматически включать новые файлы без изменения конфигурации.


Использование entry points с Webpack

Для современных проектов с модульной системой 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

При работе с TypeScript entry points обрабатываются через препроцессоры:

files: [
  'test/**/*.ts'
],
preprocessors: {
  'test/**/*.ts': ['karma-typescript']
}

karma-typescript компилирует TS в JS перед выполнением, сохраняя source maps для отладки. Важно корректно настроить tsconfig.json, чтобы пути модулей совпадали с конфигурацией Karma.


Контроль порядка и зависимостей

Karma предоставляет несколько способов контроля порядка загрузки:

  1. Прямое перечисление файлов — гарантирует строгую последовательность.
  2. Шаблоны с included: true и директивами before/after в сборщиках — для сложных зависимостей.
  3. Использование модульных загрузчиков (Webpack, Browserify) — полностью снимает проблему ручного порядка.

Неправильный порядок подключения часто вызывает ошибки типа ReferenceError или TypeError, особенно при тестировании глобальных объектов.


Практические рекомендации

  • Разделять тестовые и рабочие entry points.
  • Использовать included: false для больших файлов и ассетов.
  • Для модульных проектов применять Webpack или Browserify.
  • Поддерживать единый entry point для тестов с динамическим импортом всех .spec.js.
  • Следить за порядком подключения библиотек и зависимостей.
  • Для TypeScript или современных ES-модулей обязательно подключать соответствующие препроцессоры.

Такое управление entry points обеспечивает масштабируемость тестовой инфраструктуры, контроль зависимостей и сокращает время настройки тестов при расширении проекта.