lenec ru

← все посты

Playwright vs Cypress в 2026: E2E-тестирование фронтенда — что выбрать

16K

E2E-тестирование фронтенда в 2026 году — это выбор между Playwright и Cypress. Оба инструмента зрелые, оба активно развиваются, но архитектурно они принципиально разные. Разбираемся в отличиях, сравниваем API, скорость и определяем, когда какой инструмент лучше подходит.

Архитектура: два подхода к автоматизации

Playwright управляет браузерами извне через CDP (Chrome DevTools Protocol) и аналогичные протоколы для Firefox и WebKit. Тест и браузер — отдельные процессы. Это даёт:

  • Поддержку Chromium, Firefox, WebKit (Safari) из коробки.
  • Мульти-табы, мульти-контексты, мульти-origins в одном тесте.
  • Перехват сети, эмуляцию устройств, геолокацию.

Cypress работает внутри браузера — тестовый код в том же event loop, что и приложение. Даёт прямой доступ к DOM, time-travel debugging и автоматический retry. Но ограничивает: один таб, один origin, исторически только Chrome (Firefox/WebKit — экспериментально).

API: locators vs cy.get

Один и тот же тест на обоих фреймворках:

// Playwright
import { test, expect } from '@playwright/test';

test('добавление товара в корзину', async ({ page }) => {
  await page.goto('/products');

  // Locator — автоматический retry + strict mode
  await page.getByRole('button', { name: 'Добавить' }).first().click();

  // Web-first assertion — ждёт пока условие выполнится
  await expect(page.getByTestId('cart-count')).toHaveText('1');

  // Навигация
  await page.getByRole('link', { name: 'Корзина' }).click();
  await expect(page).toHaveURL('/cart');
  await expect(page.getByRole('heading')).toContainText('Корзина');
});
// Cypress
describe('Корзина', () => {
  it('добавление товара', () => {
    cy.visit('/products');

    // Цепочка команд — каждая ждёт предыдущую
    cy.contains('button', 'Добавить').first().click();

    cy.getByTestId('cart-count').should('have.text', '1');

    cy.contains('a', 'Корзина').click();
    cy.url().should('include', '/cart');
    cy.get('h1').should('contain', 'Корзина');
  });
});

Ключевые отличия API:

  • Playwright — async/await, стандартный TypeScript. Locators ленивые, разрешаются в момент действия.
  • Cypress — цепочки команд (chaining), свой event loop. Нельзя использовать async/await напрямую.
  • Fixtures (Playwright) — DI для тестов: page, context, browser, кастомные фикстуры. Изоляция из коробки.
  • Commands (Cypress) — кастомные команды через Cypress.Commands.add(). Глобальные, без типизации по умолчанию.

Параллелизация и скорость

Playwright:

  • Параллелизация из коробки — воркеры по количеству CPU.
  • Sharding для CI: npx playwright test --shard=1/4 — разбивает тесты между CI-джобами.
  • Каждый тест в изолированном browser context — нет утечек состояния.

Cypress:

  • Параллелизация — только через Cypress Cloud (платный) или сторонние решения (sorry-cypress).
  • Spec-level параллелизм: каждый файл — отдельный процесс.
  • Без Cloud нужно вручную разбивать тесты между CI-джобами.
// playwright.config.ts — параллелизация
import { defineConfig } from '@playwright/test';

export default defineConfig({
  workers: process.env.CI ? 4 : undefined,
  fullyParallel: true,
  retries: process.env.CI ? 2 : 0,
  reporter: [['html'], ['github']],
  use: {
    trace: 'on-first-retry', // трейс только при падении
  },
});

На практике Playwright быстрее в CI: 200 тестов за 2-3 минуты с 4 воркерами vs 8-12 минут в Cypress без параллелизации.

Component testing

Playwright CT — экспериментальный, монтирует компоненты в реальном браузере:

// Button.spec.tsx (Playwright CT)
import { test, expect } from '@playwright/experimental-ct-react';
import { Button } from './Button';

test('рендерит текст', async ({ mount }) => {
  const component = await mount(<Button label="Click me" />);
  await expect(component).toContainText('Click me');
});

test('вызывает onClick', async ({ mount }) => {
  let clicked = false;
  const component = await mount(
    <Button label="Click" onClick={() => clicked = true} />
  );
  await component.click();
  expect(clicked).toBe(true);
});

Cypress CT — более зрелый, поддерживает React, Vue, Angular, Svelte. Тот же API что и E2E — легко переключаться.

Для component testing многие предпочитают Vitest + Testing Library — быстрее для юнит-уровня.

Когда что выбрать

Playwright — если:

  • Нужна кросс-браузерность (Safari/Firefox критичны).
  • Большой тест-сьют — параллелизация из коробки.
  • Команда пишет на TypeScript и привыкла к async/await.
  • Нужны мульти-табы, iframes, cross-origin сценарии.

Cypress — если:

  • Маленькая команда, нужен быстрый старт и отличный DX.
  • Time-travel debugging критичен для отладки flaky-тестов.
  • Уже есть Cypress-инфраструктура и кастомные команды.
  • Тестируете преимущественно в Chrome.

Вывод

В 2026 году Playwright — выбор по умолчанию для новых проектов: бесплатная параллелизация, три браузера, мощный API. Cypress силён в DX и debugging, но платная параллелизация сужает нишу. Начинаете с нуля — берите Playwright. Есть работающий Cypress-сьют — мигрируйте только при реальных проблемах.

Комментарии 0

  • Будьте первым, кто оставит комментарий.

Войдите, чтобы оставить комментарий.