Запуск тестов в headless режиме

Headless режим в Cypress позволяет запускать тесты без открытия графического интерфейса браузера. Это критически важно для интеграции в CI/CD процессы, автоматизации тестирования на сервере и ускорения выполнения большого количества тестов. В headless режиме браузер работает «в фоне», что значительно снижает потребление ресурсов и ускоряет выполнение тестов по сравнению с режимом с GUI.

Основные команды для запуска

Cypress поддерживает несколько способов запуска тестов в headless режиме через CLI. Основные команды:

npx cypress run

По умолчанию команда запускает тесты в браузере Electron в headless режиме. Для запуска в другом браузере, например Chrome, используется флаг:

npx cypress run --browser chrome

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

npx cypress run --spec "cypress/e2e/login.cy.js"

Отличия headless режима от обычного

  1. Отсутствие GUI — визуализация тестов не выполняется, но Cypress продолжает делать скриншоты и записывать видео (при включенных настройках).
  2. Скорость выполнения — тесты в headless режиме проходят быстрее, так как не нужно рендерить интерфейс.
  3. Логирование — вывод логов в терминал более компактный и удобный для CI.

Настройка видео- и скриншот-записи

Cypress умеет сохранять видео выполнения тестов даже в headless режиме. Настройки находятся в cypress.config.js:

module.exports = {
  video: true,
  screenshotsFolder: 'cypress/screenshots',
  videosFolder: 'cypress/videos'
};

Видео записывается автоматически при падении теста. Скриншоты также могут сохраняться при ошибках или по ручному вызову команды cy.screenshot().

Параллельный запуск и CI/CD интеграция

Headless режим идеально подходит для параллельного запуска тестов в CI/CD. Для этого используются флаги:

npx cypress run --record --parallel
  • --record — отправка результатов тестов на Cypress Dashboard.
  • --parallel — распределение тестов между несколькими раннерами для ускорения.

В сочетании с параметром --group <название> можно логически разделять тесты по группам:

npx cypress run --record --parallel --group "smoke-tests"

Настройка браузеров для headless режима

Cypress поддерживает несколько браузеров в headless режиме:

  • Electron (по умолчанию)
  • Chrome / Chromium / Edge
  • Firefox

Запуск в headless режиме для конкретного браузера выглядит так:

npx cypress run --browser firefox --headless

Для некоторых браузеров --headless можно не указывать, так как запуск через CLI уже подразумевает headless режим.

Логирование и отладка

В headless режиме полезно использовать флаги для подробного логирования:

DEBUG=cypress:* npx cypress run

Это позволяет отслеживать внутренние процессы Cypress, шаги тестов и запросы к сети. Для отладки сложных сценариев можно включить видео-запись и скриншоты, что позволяет воспроизвести ошибку без GUI.

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

  • Тесты должны быть независимыми друг от друга, так как headless запуск часто используется параллельно.
  • Избегать использования таймаутов, завязанных на визуальные элементы, которые могут вести себя иначе в headless режиме.
  • Для стабильности сетевых запросов использовать cy.intercept вместо прямых ожиданий (cy.wait) по фиксированным таймингам.
  • Проверять, что тесты проходят как в headless, так и в GUI режиме, чтобы исключить специфические ошибки рендеринга.

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

Headless режим отлично подходит для контейнеризации тестов. Пример команды для запуска Cypress в Docker:

docker run -it -v $PWD:/e2e -w /e2e cypress/included:12.0.0

Этот образ уже содержит Cypress и все зависимости, тесты запускаются в headless режиме по умолчанию, что облегчает CI/CD интеграцию.

Заключение по особенностям headless режима

  • Повышенная скорость и меньшие ресурсы.
  • Возможность записи видео и скриншотов.
  • Полная совместимость с CI/CD пайплайнами.
  • Необходимость проверки тестов в GUI для исключения визуальных ошибок.

Headless режим является стандартом для автоматизации и масштабирования тестирования в профессиональной среде, особенно при интеграции с CI/CD и контейнеризацией.