Docker containers

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).

Интеграция Karma с Docker

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.


Настройка 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 гарантирует, что тесты завершатся после выполнения.

Оптимизация запуска тестов в Docker

  1. Кэширование зависимостей Разделение копирования package.json и исходного кода позволяет кэшировать слой с установкой npm-пакетов:

    COPY package*.json ./
    RUN npm install
    COPY . .
  2. Использование volume для live-reload Для разработки можно подключить тома, чтобы изменения тестов сразу отражались внутри контейнера:

    docker run -v $(pwd):/app karma-container
  3. Параллельный запуск браузеров Karma поддерживает запуск нескольких браузеров одновременно, что ускоряет тестирование:

    browsers: ['ChromeHeadlessNoSandbox', 'FirefoxHeadless']

Интеграция с CI/CD

Контейнеризация позволяет легко подключать 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-run
  • GitHub 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 start

Поддержка нескольких окружений

Karma можно настроить для разных браузеров и платформ через отдельные конфигурации:

if (process.env.CI) {
  config.browsers = ['ChromeHeadlessNoSandbox'];
} else {
  config.browsers = ['Chrome', 'Firefox'];
}

Это позволяет запускать быстрые headless-тесты в CI и полнофункциональные тесты локально.


Вывод

Karma в сочетании с Docker обеспечивает стабильное и воспроизводимое тестовое окружение. Контейнеризация упрощает интеграцию с CI/CD, позволяет избегать конфликтов версий и ускоряет тестирование за счет использования headless-браузеров и параллельного запуска. Правильная настройка конфигурации и кастомных launcher’ов позволяет запускать тесты в любых условиях без потери надежности и производительности.