Для запуска Protractor-тестов в GitLab CI требуется корректно настроенное окружение. В качестве базового контейнера обычно используют node:16 или новее, чтобы обеспечить совместимость с современными версиями Protractor и Selenium WebDriver. Также необходимо установить браузеры, используемые в тестах, чаще всего Chrome или Firefox, и их драйверы.
Пример фрагмента .gitlab-ci.yml для установки
зависимостей и браузера:
image: node:16
stages:
- test
before_script:
- apt-get update
- apt-get install -y unzip xvfb libxi6 libgconf-2-4 wget
- wget https://dl.google.com/linux/direct/google-chrome-stable_current_amd64.deb
- dpkg -i google-chrome-stable_current_amd64.deb || apt-get -f install -y
- npm ci
protractor_test:
stage: test
script:
- Xvfb :99 -screen 0 1280x1024x24 &
- export DISPLAY=:99
- npx protractor protractor.conf.js
Ключевые моменты:
Xvfb необходимо для запуска браузеров в
headless-режиме на сервере CI, где отсутствует графическая
оболочка.npm ci предпочтительнее npm install в CI,
так как обеспечивает воспроизводимость установленных версий
зависимостей.Файл protractor.conf.js требует отдельной настройки для
непрерывной интеграции:
exports.config = {
directConnect: true,
framework: 'jasmine',
specs: ['specs/**/*.spec.js'],
capabilities: {
browserName: 'chrome',
chromeOptions: {
args: ['--headless', '--no-sandbox', '--disable-gpu', '--window-size=1280,1024']
}
},
jasmineNodeOpts: {
showColors: true,
defaultTimeoutInterval: 60000
}
};
Важные моменты:
--no-sandbox требуется для корректного запуска Chrome в
контейнерах Docker.--headless позволяет запускать тесты без графического
интерфейса.defaultTimeoutInterval учитывает возможные
задержки в CI, особенно при параллельных запусках.Protractor поддерживает параллельное выполнение сценариев, что ускоряет тестирование на CI:
multiCapabilities: [
{
browserName: 'chrome',
shardTestFiles: true,
maxInstances: 3
}
]
Пояснения:
shardTestFiles: true разделяет тесты между несколькими
экземплярами браузера.maxInstances контролирует количество одновременных
браузеров, что важно для балансировки нагрузки на CI-агента.Для анализа результатов в GitLab CI необходимо настроить вывод логов и интеграцию с отчётными форматами, например, JUnit:
const { SpecReporter } = require('jasmine-spec-reporter');
const jasmineReporters = require('jasmine-reporters');
exports.config = {
onPrepare: () => {
jasmine.getEnv().addReporter(new SpecReporter({ spec: { displayStacktrace: true } }));
jasmine.getEnv().addReporter(new jasmineReporters.JUnitXmlReporter({
savePath: 'reports',
consolidateAll: false
}));
}
};
Особенности:
JUnitXmlReporter позволяет GitLab CI собирать тестовые
отчёты через встроенный функционал анализа артефактов.SpecReporter улучшает читаемость логов в
консоли CI.Для оптимизации сборок рекомендуется сохранять артефакты и кешировать зависимости:
cache:
paths:
- node_modules/
artifacts:
when: always
paths:
- reports/
node_modules ускоряет повторные
сборки.reports позволяет GitLab CI отображать
результаты тестов в интерфейсе.Тестовый этап Protractor обычно располагают после сборки и перед деплоем. Типовая структура пайплайна:
stages:
- build
- test
- deploy
build_job:
stage: build
script:
- npm ci
- npm run build
test_job:
stage: test
script:
- Xvfb :99 -screen 0 1280x1024x24 &
- export DISPLAY=:99
- npx protractor protractor.conf.js
artifacts:
paths:
- reports/
deploy_job:
stage: deploy
script:
- echo "Deploying application"
only:
- main
Это обеспечивает строгую последовательность: сборка → тестирование → деплой, с возможностью остановки пайплайна при падении тестов.
browser.wait или
ExpectedConditions) вместо статических sleep,
особенно в CI, где задержки сети могут варьироваться.Эта конфигурация обеспечивает надёжный и воспроизводимый запуск Protractor-тестов в GitLab CI, интегрируя их в автоматизированные пайплайны и формируя читаемые отчёты для анализа результатов.