Cypress является мощным инструментом для end-to-end тестирования веб-приложений на JavaScript. Его интеграция с CI/CD системами, такими как GitLab CI, позволяет автоматизировать выполнение тестов при каждом изменении кода, обеспечивая стабильность продукта и предотвращая регрессии.
Для запуска Cypress в GitLab CI используется файл
.gitlab-ci.yml, который описывает пайплайны и стадии
сборки. Минимальная структура пайплайна для Cypress включает следующие
стадии:
stages:
- install
- test
Стадия install отвечает за установку зависимостей
проекта:
install_dependencies:
stage: install
image: cypress/base:18
script:
- npm ci
artifacts:
paths:
- node_modules/
image — базовый Docker-образ с предустановленным
Node.js и инструментами для запуска браузеров.npm ci — установка зависимостей строго по
package-lock.json, что обеспечивает воспроизводимость
сборки.artifacts.paths — сохранение node_modules,
чтобы не устанавливать зависимости повторно на следующих стадиях.Стадия test выполняет тесты Cypress:
run_cypress_tests:
stage: test
image: cypress/base:18
dependencies:
- install_dependencies
script:
- npx cypress run
artifacts:
when: always
paths:
- cypress/screenshots
- cypress/videos
dependencies гарантирует, что на стадии тестирования
будут доступны артефакты из предыдущей стадии.npx cypress run — стандартная команда для запуска
тестов в headless режиме.artifacts.when: always сохраняет скриншоты и видео даже
при падении тестов, что критично для анализа ошибок.Cypress предоставляет несколько базовых образов:
cypress/base:<node-version> — содержит Node.js и
зависимости для сборки приложений, но без браузеров.cypress/browsers:<browser>-<version> —
включает предустановленные браузеры (Chrome, Firefox, Edge).Для полноценного E2E тестирования рекомендуется использовать образы с браузерами, например:
image: cypress/browsers:node18.16.0-chrome116-ff116
Для безопасного хранения секретов (API-ключи, токены) используются переменные GitLab CI:
variables:
CYPRESS_BASE_URL: "https://staging.example.com"
CYPRESS_API_TOKEN: $API_TOKEN
В тестах Cypress переменные доступны через
Cypress.env('API_TOKEN') или напрямую через
Cypress.config('baseUrl').
GitLab CI поддерживает параллельные джобы, что ускоряет выполнение тестов:
run_cypress_parallel:
stage: test
image: cypress/browsers:node18.16.0-chrome116-ff116
parallel: 4
script:
- npx cypress run --record --key $CYPRESS_RECORD_KEY
parallel: 4 делит тесты на 4 параллельные группы.--record позволяет собирать результаты в Cypress
Dashboard, что упрощает анализ и отчетность.Для ускорения пайплайнов важно кэшировать зависимости:
cache:
key: ${CI_COMMIT_REF_SLUG}
paths:
- node_modules/
- cypress/cache/
cypress/cache хранит загруженные браузеры и бинарники
Cypress, что экономит время при повторных сборках.Для локального тестирования CI-конфигурации удобно использовать Docker Compose:
services:
- name: cypress/browsers:node18.16.0-chrome116-ff116
alias: cypress
Такой подход позволяет воспроизводить окружение пайплайна на локальной машине, избегая проблем с различиями в версиях Node.js или браузеров.
Cypress умеет генерировать отчеты в формате JUnit, что интегрируется с GitLab CI для отображения результатов в веб-интерфейсе:
script:
- npx cypress run --reporter junit --reporter-options "mochaFile=reports/junit/results-[hash].xml"
artifacts:
when: always
reports:
junit: reports/junit/*.xml
--reporter junit — генерация отчета в формате
JUnit.cypress/browsers.--headless.npm ci вместо npm install обеспечивает
воспроизводимость.echo $VARIABLE
перед запуском тестов.GitLab CI вместе с Cypress обеспечивает стабильную автоматизацию тестирования и позволяет быстро выявлять регрессии при изменениях кода, поддерживая высокое качество продукта.