Запуск Protractor в CI окружении

Архитектура Protractor и особенности CI

Protractor является инструментом для энд-ту-энд тестирования Angular и AngularJS приложений. В контексте CI/CD его основная задача — автоматическая проверка функциональности на различных этапах сборки проекта. Для корректной работы в CI окружении необходимо учитывать особенности:

  • Безголовый режим браузера — запуск браузера без графического интерфейса снижает нагрузку на сервер и ускоряет выполнение тестов.
  • Синхронизация с Angular — Protractor автоматически ждёт завершения асинхронных операций Angular, что обеспечивает стабильность тестов.
  • Изоляция среды — каждый CI-агент должен запускать тесты в чистом окружении, чтобы избежать влияния предыдущих прогонов.

Установка зависимостей

Для работы в CI окружении требуется корректная установка Node.js и Protractor. Минимальный набор:

npm install -g protractor
webdriver-manager update

webdriver-manager скачивает необходимые бинарные файлы для Selenium Server и драйверы для браузеров. В CI лучше использовать локальный запуск драйверов через directConnect, чтобы не зависеть от отдельного Selenium сервера:

exports.config = {
  directConnect: true,
  capabilities: {
    'browserName': 'chrome',
    chromeOptions: {
      args: ['--headless', '--disable-gpu', '--window-size=1920,1080']
    }
  },
  framework: 'jasmine',
  specs: ['specs/**/*.spec.js'],
};

Настройка headless режима

В CI окружении графический интерфейс отсутствует, поэтому обязательна конфигурация headless режима для Chrome или Firefox. Для Chrome:

chromeOptions: {
  args: [
    '--headless',
    '--disable-gpu',
    '--no-sandbox',
    '--disable-dev-shm-usage',
    '--window-size=1920,1080'
  ]
}

Параметры --no-sandbox и --disable-dev-shm-usage критичны для Docker контейнеров и Linux серверов, где sandboxing может блокировать запуск браузера.

Конфигурация времени ожиданий

CI окружения могут иметь нестабильную производительность, поэтому важно корректно настраивать таймауты:

allScriptsTimeout: 11000,
getPageTimeout: 10000,
jasmineNodeOpts: {
  defaultTimeoutInterval: 30000
}

allScriptsTimeout определяет время ожидания выполнения скриптов в браузере, getPageTimeout — время загрузки страницы. Таймаут Jasmine defaultTimeoutInterval предотвращает преждевременное завершение долгих тестов.

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

Protractor легко интегрируется с популярными CI/CD платформами: Jenkins, GitLab CI, GitHub Actions, TeamCity. Основные принципы:

  1. Установка Node.js и зависимостей на CI агенте.
  2. Обновление WebDriver перед запуском тестов:
webdriver-manager update --standalone
  1. Запуск тестов через npm скрипт:
"scripts": {
  "test:e2e": "protractor protractor.conf.js"
}
  1. Сбор артефактов — логов, скриншотов и видео тестов для последующего анализа.

Логи и отчетность

Для стабильной отладки важно сохранять логи и результаты прогонов. Protractor поддерживает интеграцию с различными репортерами, например jasmine-spec-reporter:

const { SpecReporter } = require('jasmine-spec-reporter');

onPrepare: () => {
  jasmine.getEnv().addReporter(new SpecReporter({
    spec: { displayStacktrace: true }
  }));
}

Для CI полезно сохранять скриншоты при падении теста:

afterEach(async function() {
  const fs = require('fs');
  const path = require('path');
  if (this.currentTest.failedExpectations.length > 0) {
    const png = await browser.takeScreenshot();
    const filePath = path.resolve('reports/screenshots', `${this.currentTest.description}.png`);
    fs.writeFileSync(filePath, png, { encoding: 'base64' });
  }
});

Параллельный запуск тестов

Для ускорения прогонов можно использовать параллельное выполнение через shardTestFiles:

capabilities: {
  browserName: 'chrome',
  shardTestFiles: true,
  maxInstances: 3,
  chromeOptions: { args: ['--headless'] }
}

Каждый shard запускает отдельный экземпляр браузера с частью тестов, что снижает общее время выполнения.

Особенности работы в Docker

В CI окружениях часто используется Docker для изоляции. Важно учитывать:

  • Образ должен содержать браузер и драйвер (например, selenium/standalone-chrome или node:20-bullseye + установка Chrome).
  • Настройка volume для логов и скриншотов.
  • Использование --no-sandbox и --disable-dev-shm-usage для корректного запуска браузера.

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

  • Всегда использовать headless режим в CI.
  • Настраивать таймауты выше, чем в локальной разработке.
  • Хранить скриншоты и логи для анализа.
  • Разбивать тесты на отдельные spec файлы для параллельного запуска.
  • Обновлять webdriver перед каждым прогоном на CI, чтобы исключить несовместимости.

Эти шаги обеспечивают стабильный, быстрый и воспроизводимый запуск Protractor тестов в любом CI/CD окружении.