Профили конфигурации

Protractor — это инструмент для энд-ту-энд тестирования Angular и AngularJS приложений. Центральной частью работы с Protractor является конфигурационный файл, который задаёт параметры запуска тестов, браузеры, пути к спецификациям и множество других опций. Одной из ключевых возможностей является использование профилей конфигурации, позволяющих создавать разные сценарии запуска тестов без необходимости менять основной конфигурационный файл.

Основы конфигурационных файлов

Конфигурационный файл Protractor обычно пишется на JavaScript и экспортируется через exports.config. Простейший пример:

exports.config = {
  framework: 'jasmine',
  seleniumAddress: 'http://localhost:4444/wd/hub',
  specs: ['specs/**/*.spec.js'],
  capabilities: {
    browserName: 'chrome'
  }
};

Здесь задаются:

  • framework — тестовый фреймворк (Jasmine, Mocha, Cucumber);
  • seleniumAddress — адрес сервера Selenium;
  • specs — путь к тестовым файлам;
  • capabilities — характеристики браузера, в котором будут запускаться тесты.

Для разных целей (локальная разработка, CI/CD, тестирование в разных браузерах) менять эти значения вручную неудобно. Для этого применяются профили конфигурации.

Использование нескольких профилей

Профиль конфигурации — это отдельный объект конфигурации или файл, который наследует общие параметры и переопределяет только необходимые. Простейший способ реализации — создание нескольких конфигурационных файлов и выбор нужного при запуске:

protractor conf/local.conf.js
protractor conf/ci.conf.js

local.conf.js может содержать:

exports.config = {
  baseUrl: 'http://localhost:4200',
  capabilities: {
    browserName: 'chrome'
  },
  specs: ['specs/unit/**/*.spec.js']
};

А ci.conf.js:

exports.config = {
  baseUrl: 'http://ci-server:4200',
  capabilities: {
    browserName: 'firefox'
  },
  specs: ['specs/e2e/**/*.spec.js']
};

Такой подход упрощает поддержку разных сред и задач тестирования.

Профили внутри одного файла

Для более удобного управления можно использовать один конфигурационный файл с объектом profiles и логикой выбора профиля через переменную окружения:

const profiles = {
  local: {
    baseUrl: 'http://localhost:4200',
    capabilities: { browserName: 'chrome' },
    specs: ['specs/unit/**/*.spec.js']
  },
  ci: {
    baseUrl: 'http://ci-server:4200',
    capabilities: { browserName: 'firefox' },
    specs: ['specs/e2e/**/*.spec.js']
  }
};

const profileName = process.env.TEST_PROFILE || 'local';

exports.config = {
  framework: 'jasmine',
  seleniumAddress: 'http://localhost:4444/wd/hub',
  ...profiles[profileName]
};

Запуск с профилем ci:

TEST_PROFILE=ci protractor conf/profiles.conf.js

Этот подход позволяет централизованно хранить конфигурацию и минимизировать дублирование.

Переопределение capabilities

Capabilities — важная часть конфигурации, отвечающая за браузер и его свойства. При использовании профилей можно менять:

  • browserName (chrome, firefox, safari);
  • chromeOptions (например, запуск в headless режиме, установка аргументов командной строки);
  • firefoxOptions (профили Firefox, отключение уведомлений, headless режим).

Пример для Chrome в headless:

capabilities: {
  browserName: 'chrome',
  chromeOptions: {
    args: ['--headless', '--disable-gpu', '--window-size=1920,1080']
  }
}

Для CI-сред профили с headless запуском часто используют для ускорения тестов и экономии ресурсов.

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

Профили конфигурации особенно полезны при автоматизации через CI/CD. В разных этапах конвейера можно использовать разные профили:

  • Unit tests — локальная база, быстрые тесты.
  • Integration/E2E tests — staging-сервер, полный набор сценариев.
  • Cross-browser tests — запуск тестов в нескольких браузерах через Selenium Grid.

Переключение между профилями в CI выполняется через переменные окружения или аргументы командной строки, что позволяет полностью автоматизировать процесс без изменений исходного кода.

Динамическая конфигурация

Protractor позволяет конфигурировать тесты динамически, используя функции и условия внутри exports.config. Например, можно выбирать браузер на основе переменной окружения:

exports.config = {
  framework: 'jasmine',
  seleniumAddress: 'http://localhost:4444/wd/hub',
  specs: ['specs/**/*.spec.js'],
  capabilities: (() => {
    const browser = process.env.BROWSER || 'chrome';
    if (browser === 'firefox') {
      return { browserName: 'firefox' };
    }
    return {
      browserName: 'chrome',
      chromeOptions: { args: ['--headless'] }
    };
  })()
};

Такой подход сочетает гибкость и компактность, позволяя полностью отказаться от множества отдельных конфигурационных файлов.

Рекомендации по организации профилей

  • Разделять конфигурацию на локальную, CI, кроссбраузерную.
  • Минимизировать дублирование через общий базовый объект.
  • Использовать переменные окружения для переключения профилей.
  • Применять динамическое формирование capabilities для сложных сценариев.
  • Хранить специфичные пути и настройки браузеров в отдельных полях, чтобы облегчить масштабирование.

Профили конфигурации делают Protractor более управляемым инструментом, позволяя легко переключаться между разными средами, оптимизировать время тестирования и централизованно управлять настройками.