Karma — это тестовый раннер для JavaScript, который позволяет запускать тесты в реальных браузерах, обеспечивая интеграцию с фреймворками вроде Jasmine, Mocha или QUnit. Установка осуществляется через npm:
npm install --save-dev karma karma-cli
После установки необходимо инициализировать конфигурационный файл:
npx karma init
Этот файл karma.conf.js содержит все настройки: список
файлов для тестирования, фреймворки, браузеры, плагины и параметры
запуска.
Основные параметры конфигурации:
frameworks: массив фреймворков (например,
['jasmine']).files: список файлов и шаблонов для тестирования.browsers: браузеры для запуска тестов
(Chrome, Firefox, PhantomJS и
т.д.).autoWatch: автоматический перезапуск тестов при
изменении файлов.singleRun: запуск тестов один раз (полезно для
CI/CD).Docker позволяет создавать изолированные контейнеры, что гарантирует одинаковую среду для тестов на всех машинах. Для Karma это особенно полезно, если требуется запускать тесты в headless-браузерах без необходимости устанавливать их локально.
Пример структуры проекта:
project/
├─ src/
├─ test/
├─ package.json
├─ karma.conf.js
└─ Dockerfile
Dockerfile для Karma с Chrome Headless:
FROM node:20-alpine
# Установка зависимостей для запуска Chrome
RUN apk add --no-cache \
chromium \
nss \
freetype \
harfbuzz \
ca-certificates \
ttf-freefont \
bash \
git
WORKDIR /app
COPY package*.json ./
RUN npm install
COPY . .
# Установка переменной окружения для Chromium
ENV CHROME_BIN=/usr/bin/chromium-browser
ENV DISPLAY=:99
CMD ["npx", "karma", "start", "--single-run"]
В данном Dockerfile используется легковесный образ
node:alpine, добавляются необходимые библиотеки для запуска
Chromium, копируются зависимости проекта и исходный код, а затем
запускаются тесты Karma.
Для корректной работы headless-браузера в Docker нужно указать путь к
бинарнику Chrome. В конфигурации Karma это делается через
customLaunchers:
module.exports = function(config) {
config.set({
frameworks: ['jasmine'],
files: [
'src/**/*.js',
'test/**/*.spec.js'
],
browsers: ['ChromeHeadlessNoSandbox'],
customLaunchers: {
ChromeHeadlessNoSandbox: {
base: 'ChromeHeadless',
flags: ['--no-sandbox', '--disable-gpu', '--disable-dev-shm-usage']
}
},
singleRun: true
});
};
Ключевые моменты:
--no-sandbox необходим для запуска Chromium в
контейнере.--disable-dev-shm-usage предотвращает ошибки, связанные
с нехваткой shared memory в Docker.singleRun: true гарантирует, что тесты завершатся после
выполнения.Кэширование зависимостей Разделение копирования
package.json и исходного кода позволяет кэшировать слой с
установкой npm-пакетов:
COPY package*.json ./
RUN npm install
COPY . .Использование volume для live-reload Для разработки можно подключить тома, чтобы изменения тестов сразу отражались внутри контейнера:
docker run -v $(pwd):/app karma-containerПараллельный запуск браузеров Karma поддерживает запуск нескольких браузеров одновременно, что ускоряет тестирование:
browsers: ['ChromeHeadlessNoSandbox', 'FirefoxHeadless']Контейнеризация позволяет легко подключать Karma в конвейеры CI/CD:
GitLab CI:
test:
image: node:20-alpine
script:
- apk add --no-cache chromium nss freetype harfbuzz ttf-freefont
- npm ci
- npx karma start --single-runGitHub Actions:
jobs:
test:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- uses: actions/setup-node@v3
with:
node-version: '20'
- run: npm ci
- run: sudo apt-get install -y chromium-browser
- run: npx karma start --single-runКонтейнер гарантирует одинаковое окружение на локальной машине и в CI, что исключает ошибки, связанные с разными версиями Node.js, npm или браузеров.
Для анализа проблем тестирования в контейнере можно:
Использовать флаг
--browsers ChromeHeadlessNoSandbox --log-level debug для
детализированного вывода.
Подключать том с логами:
VOLUME /app/logsЗапускать тесты интерактивно в браузере, монтируя проект:
docker run -it -v $(pwd):/app karma-container /bin/bash
npx karma startKarma можно настроить для разных браузеров и платформ через отдельные конфигурации:
if (process.env.CI) {
config.browsers = ['ChromeHeadlessNoSandbox'];
} else {
config.browsers = ['Chrome', 'Firefox'];
}
Это позволяет запускать быстрые headless-тесты в CI и полнофункциональные тесты локально.
Karma в сочетании с Docker обеспечивает стабильное и воспроизводимое тестовое окружение. Контейнеризация упрощает интеграцию с CI/CD, позволяет избегать конфликтов версий и ускоряет тестирование за счет использования headless-браузеров и параллельного запуска. Правильная настройка конфигурации и кастомных launcher’ов позволяет запускать тесты в любых условиях без потери надежности и производительности.