E2E-тесты не защищают от регрессий, если их гонять «когда вспомнил» вручную. Они работают только в связке с конвейером: каждое изменение → автоматический прогон → результат виден команде. Но у сквозных тестов есть особенность: они медленные. Поэтому в CI важны две вещи — уложиться по времени и дать разбираемый отчёт о падении, чтобы чинить без воспроизведения локально.
Как устроен запуск
Playwright в CI работает без окна браузера (headless-режим). Браузеры нужно установить заранее — это делается один раз в начале шага.
Минимальный пайплайн выглядит так:
- run: npm ci
- run: npx playwright install --with-deps
- run: npx playwright test
Перед запуском тестов должно работать само приложение. Можно поднять его вручную в пайплайне, а можно дать Playwright сделать это самому через webServer в конфиге — он запустит приложение и дождётся готовности перед первым тестом:
// playwright.config.ts
webServer: {
command: "npm run start",
url: "http://localhost:3000",
reuseExistingServer: !process.env.CI,
},
В CI переменная CI всегда выставлена, поэтому каждый прогон поднимает свежий сервер.
Проблема скорости — и как её решают
E2E-тест открывает браузер, кликает, ждёт ответа сервера. Один тест — несколько секунд. Сто тестов — минуты. По мере роста проекта набор тестов растёт, и суммарное время пайплайна становится неприемлемым.
Два инструмента решают это:
Параллельные воркеры — Playwright по умолчанию запускает тесты параллельно в нескольких воркерах на одной машине. Количество воркеров настраивается в конфиге или флагом --workers.
Sharding — разбивка набора между несколькими машинами. Каждая машина берёт свою часть и гоняет её параллельно с остальными:
strategy:
matrix:
shard: [1, 2, 3, 4]
steps:
- run: npx playwright test --shard=${{ matrix.shard }}/4
Четыре раннера вместо одного — набор завершается примерно вчетверо быстрее. Число частей выбирают исходя из размера набора и желаемого времени.
Почему падения в CI так тяжело чинить
Классическая ситуация: тест прошёл локально, упал в CI. Воспроизвести не получается — окружение другое, данные другие, гонки таймингов. Без записи прогона приходится гадать.
Playwright решает это через артефакты падения. Три инструмента:
Trace — полная запись прогона: каждый шаг, состояние DOM в момент выполнения, сетевые запросы, консоль. Открывается в Trace Viewer — можно промотать к любому шагу и посмотреть, что было на странице. Обычно включают on-first-retry: первый провал идёт без trace, если тест падает снова — запись включается.
Скриншот — снимок страницы в момент падения.
Видео — запись всего прогона теста.
use: {
trace: "on-first-retry",
screenshot: "only-on-failure",
video: "retain-on-failure",
},
Эти файлы сохраняются как артефакты CI-шага — их можно скачать и изучить после прогона.
HTML-отчёт
Playwright генерирует HTML-отчёт: список тестов, время каждого, статус, ссылки на артефакты падений. Отчёт публикуют как артефакт CI — и каждый в команде видит картину прогона без того, чтобы лезть в сырые логи.
Зелёный статус — всё прошло. Красный — кликнуть на упавший тест, открыть trace, разобраться.
Когда гонять и что именно
Не все тесты нужны на каждый коммит. E2E — дорогие, и гонять тяжёлый полный набор на каждое изменение замедляет разработку. Практичная стратегия:
- На каждый PR — только критические пути: вход, главный сценарий, оплата (если есть). Быстрый набор, который не даёт пропустить поломку главного.
- Перед релизом или по расписанию — полный набор, включая длинные и редкие сценарии.
Таким образом разработчик получает быструю обратную связь на PR, а полная уверенность формируется перед каждым выпуском.
Коротко
- Playwright в CI работает headless; браузеры устанавливают через
npx playwright install --with-deps. webServerв конфиге поднимает приложение перед прогоном — удобно для CI без ручных шагов.- Воркеры распараллеливают тесты на одной машине, sharding — между несколькими раннерами.
- Trace (
on-first-retry), скриншот и видео при падении делают разбор возможным без локального воспроизведения. - HTML-отчёт показывает результаты и артефакты всей команде.
- Критические пути — на каждый PR; полный набор — перед релизом или по расписанию.
Что почитать дальше
- Настройка Playwright — конфиг, baseURL и webServer подробнее.
- Flaky-тесты — почему тесты нестабильны в CI и как это лечить.
- Принципы конвейера доставки — место e2e в общей схеме CI/CD.