На старті будь-які тести швидкі. Через рік набір з тисячі тестів може йти 15 хвилин, падати випадково й гальмувати кожен pull request. Структура з самого початку визначає, чи станеться це.
1. Правильний рівень для кожної перевірки:
- логіка (розрахунки, перетворення, валідація) - винесена в чисті функції й перевіряється unit-тестами в середовищі
node, без DOM; - поведінка компонентів - інтеграційні тести з Testing Library;
- критичні сценарії - кілька E2E.
Найпоширеніша причина повільного набору - перевірка логіки через E2E: кожен варіант знижки перевіряється відкриттям браузера.
2. Середовище за потребою: jsdom у всіх файлах сповільнює й ті тести, яким DOM не потрібен. Середовище задають для конкретних файлів чи проєктів:
// vitest.config.js
export default defineConfig({
test: {
projects: [
{ test: { name: 'unit', environment: 'node', include: ['**/*.unit.test.js'] } },
{ test: { name: 'dom', environment: 'happy-dom', include: ['**/*.dom.test.js'] } },
],
},
});
3. Ізоляція й детермінованість:
- кожен тест готує свої дані й не залежить від порядку запуску;
- моки й глобальні заглушки відновлюються після кожного тесту (
restoreMocks,unstubGlobalsу конфігурації); - час, випадкові значення й мережа - під контролем тесту (фейкові таймери,
vi.setSystemTime, MSW).
4. Швидкий зворотний зв'язок:
vitest --changed- лише тести, пов'язані зі зміненими файлами;- у CI - паралельний запуск і шардування:
vitest run --shard=1/4; - E2E - окремою задачею CI, що не блокує швидкі перевірки.
5. Боротьба з нестабільними тестами: тест, що падає випадково, швидко вчить команду ігнорувати червоний CI. Нестабільний тест або виправляють одразу, або тимчасово виключають (з задачею на виправлення), але не перезапускають мовчки.
6. Тести як код:
- спільні фабрики тестових даних замість копіювання об'єктів у кожному тесті;
- допоміжні функції для монтування з провайдерами;
- назви тестів описують поведінку: «показує помилку для порожньої пошти», а не «test 3».
7. Що прибирати: тести, що перевіряють реалізацію (внутрішні виклики, точну розмітку), знімки, які оновлюють не дивлячись, і дублікати тієї самої перевірки на різних рівнях.
Метрики здоров'я набору: час прогону в CI, частка нестабільних тестів, кількість тестів, змінених при рефакторингу без зміни поведінки. Остання - найкращий індикатор того, що тести перевіряють деталі реалізації.