QA Interview Hub · База знань · Тести
Cypress
CI, паралелізація, звіти
запуск у пайплайні
Як запустити Cypress у GitHub Actions?
Найпростіше — офіційна дія cypress-io/github-action: вона встановлює залежності з кешем, за потреби запускає застосунок, чекає на нього і проганяє тести. Артефакти зі скріншотами завантажують при падінні.
name: e2e
on: [pull_request]
jobs:
cypress:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: cypress-io/github-action@v6
with:
browser: chrome
start: npm start
wait-on: 'http://localhost:3000'
env:
CYPRESS_USER_PASSWORD: DOLLAR{{ secrets.USER_PASSWORD }}
- uses: actions/upload-artifact@v4
if: failure()
with:
name: screenshots
path: cypress/screenshots
На співбесіді: Я використовую офіційну дію cypress-io github-action: вона ставить залежності з кешем, піднімає застосунок, чекає на нього і запускає тести. Секрети передаються з secrets репозиторію, а при падінні скріншоти зберігаються як артефакти. Тести запускаються на кожен pull request.
А в Playwright:- run: npm ci
- run: npx playwright install --with-deps
- run: npx playwright test
- uses: actions/upload-artifact@v4
if: always()
with:
name: playwright-report
path: playwright-report
Є й офіційний Docker-образ з браузерами — mcr.microsoft.com/playwright.
Як паралелізувати тести Cypress?
На одній машині Cypress паралельно не запускає: один процес, один браузер, спеки по черзі. Паралелізація — лише між кількома машинами.
- Cypress Cloud:
cypress run --record --parallel розподіляє спеки між машинами з урахуванням тривалості. Це платний сервіс після безкоштовного ліміту.
- Безкоштовно: матриця в CI плюс плагін cypress-split, який ділить спеки між запусками.
Одиниця розподілу — спек-файл, тому великі спеки краще розбивати.
strategy:
matrix:
containers: [1, 2, 3, 4]
steps:
- uses: cypress-io/github-action@v6
env:
SPLIT: 4
SPLIT_INDEX: DOLLAR{{ strategy.job-index }}
На співбесіді: На одній машині Cypress виконує спеки послідовно, тому паралелізація — тільки між кількома машинами. Офіційний шлях — Cypress Cloud з прапорцями record і parallel, але це платно. Безкоштовно можна зробити матрицю в CI і поділити спеки плагіном cypress-split. Одиниця розподілу — спек-файл, тому я тримаю спеки невеликими.
А в Playwright:Паралелізація безкоштовна і вбудована: воркери на одній машині (за замовчуванням половина ядер CPU) плюс --shard=1/4 між машинами і merge-reports для злиття звітів. Одиниця розподілу — тест, а не файл.
Які звіти, скріншоти й відео дає Cypress?
У cypress run скріншот при падінні робиться автоматично. Відео з Cypress 13 вимкнене за замовчуванням, вмикається через video: true.
Звіти: вбудований spec-репортер у консолі, mochawesome для HTML (з окремим злиттям звітів після запуску), allure-cypress для Allure з історією та трендами, JUnit XML для CI.
// cypress.config.ts
export default defineConfig({
video: true,
screenshotOnRunFailure: true,
reporter: 'mochawesome',
reporterOptions: {
reportDir: 'cypress/reports',
overwrite: false,
html: false,
json: true,
},
});
На співбесіді: При падінні в режимі run скріншот робиться автоматично, а відео треба явно увімкнути, бо з тринадцятої версії воно вимкнене. Для HTML-звітів я використовую mochawesome, а якщо потрібна історія і тренди — Allure через allure-cypress. Для CI-систем є JUnit XML.
А в Playwright:HTML-звіт із вбудованим Trace Viewer є з коробки. Скріншоти, відео й трейси налаштовуються в use: screenshot, video, trace. Allure — через allure-playwright, JUnit — вбудованим репортером.
Flaky-тести в Cypress і retries
Найчастіші причини: фіксовані cy.wait замість очікування умов, гонки з мережевими запитами, анімації, залежність тестів один від одного й від спільних даних. Також — нестабільні селектори, перерендер елемента після того, як його знайшли, та повільне CI-середовище.
Лікування: чекати на запити через cy.intercept і аліаси, будувати ланцюжки з асершенами, які ретраяться, ізолювати тести й створювати дані через API. Кожен тест має починатися з відомого стану. Для діагностики — відео, скріншоти і Test Replay в Cypress Cloud.
Retries налаштовуються в конфізі: retries: { runMode: 2, openMode: 0 }, де runMode — для cypress run у CI, openMode — для інтерактивного режиму. Можна задати retries і для окремого тесту чи блоку describe. Але ретраї лише маскують проблему, тому flaky-тести треба відстежувати й виправляти першопричину.