jsdom - імітація DOM у Node.js. Він швидкий і достатній для більшості тестів логіки й розмітки, але це не браузер:
- немає розкладки: розміри, позиції, прокрутка - нулі;
- немає реального CSS:
display: noneз класу, медіазапити,:hoverне працюють; - відсутні чи спрощені
IntersectionObserver,ResizeObserver, Canvas, Web Animations,matchMedia, буфер обміну, справжні фокус і клавіатурна навігація; - події генеруються JavaScript-ом, а не браузером.
Тести компонентів, що залежать від цього (віртуалізований список, перетягування, модальне вікно з фокусом, адаптивна верстка, анімації), або потребують купи моків, або перевіряють не те.
Vitest Browser Mode запускає ті самі тести в справжньому браузері (Chromium, Firefox, WebKit через Playwright):
// vitest.config.ts
import { playwright } from '@vitest/browser-playwright';
export default defineConfig({
test: {
browser: {
enabled: true,
provider: playwright(),
instances: [{ browser: 'chromium' }],
},
},
});
import { render } from 'vitest-browser-react';
import { page } from 'vitest/browser';
test('меню відкривається з клавіатури', async () => {
render(<Menu />);
await page.getByRole('button', { name: 'Меню' }).click();
await expect.element(page.getByRole('menu')).toBeVisible();
});
Події йдуть через протокол браузера (як від реального користувача), toBeVisible враховує справжній CSS, а expect.element автоматично чекає на виконання умови.
E2E-тести (Playwright) - окремий рівень: справжній застосунок з бекендом, перехід між сторінками, автентифікація, повний сценарій «знайти вакансію - відгукнутися». Повільніші й дорожчі в підтримці, але єдині перевіряють інтеграцію фронтенду, API й бази.
Як розподіляти:
- jsdom (Testing Library) - більшість тестів компонентів: логіка, умовний рендер, форми, обробка відповідей API. Швидко;
- Browser Mode - компоненти, що залежать від розкладки, CSS, фокусу, браузерних API;
- E2E - кілька критичних сценаріїв: вхід, оплата, основний шлях користувача.
Ціна браузерних тестів: запуск браузера, повільніше виконання, потреба в браузерах на CI (npx playwright install). Тому їх не варто робити режимом за замовчуванням для всього.
У Laravel-проєктах для e2e є ще Pest з браузерними тестами (на Playwright) - сценарії пишуться на PHP і мають доступ до фабрик і бази.