Практичний гайд з Jest, Vitest, TDD та Code Coverage
📅 Оновлено: 7 лютого 2026⏱️ Час читання: 40 хв🎯 Рівень: Початківець — Середній
📘 Що таке Unit Testing?
Unit tests — автоматизоване тестування окремих "юнітів" коду (функцій, класів, модулів) у ізоляції від решти системи:
✅ Швидкі (виконуються за мілісекунди)
✅ Ізольовані (не залежать від БД, API, файлової системи)
✅ Повторювані (завжди один результат для одних параметрів)
✅ Автоматизовані (запускаються CI/CD при кожному commit)
Частина 1: Порівняння Test Frameworks
Характеристика
Jest
Vitest
Mocha + Chai
Швидкість
⭐⭐⭐ Помірно
⭐⭐⭐⭐⭐ Дуже швидко (Vite)
⭐⭐⭐⭐ Швидко
Налаштування
⭐⭐⭐⭐⭐ Zero-config
⭐⭐⭐⭐⭐ Zero-config (якщо Vite)
⭐⭐ Потребує конфігурації
Assertions
✅ Вбудовані
✅ Вбудовані (сумісні з Jest)
❌ Потрібен Chai
Mocking
✅ Вбудоване
✅ Вбудоване
❌ Потрібен Sinon
Code Coverage
✅ Вбудоване (Istanbul)
✅ Вбудоване (c8)
❌ Потрібен NYC
Паралельність
✅ Так (workers)
✅ Так (threads)
❌ Ні (або з Mocha-parallel)
Snapshot Testing
✅ Вбудоване
✅ Вбудоване
❌ Потрібен окремий пакет
TypeScript
✅ (з ts-jest)
✅ Native підтримка
✅ (з ts-node)
Частина 2: Jest — швидкий старт
1Встановлення та налаштування
# Встановлення
npm install --save-dev jest
# Ініціалізація конфігурації
npx jest --init
# Запуск тестів
npm test
# Запуск з coverage
npm test -- --coverage
# Watch mode (автоматичний перезапуск)
npm test -- --watch
🔴 Red: Напишіть тест (він падає, бо функції ще немає)
🟢 Green: Напишіть мінімальний код, щоб тест пройшов
🔵 Refactor: Покращте код, не ламаючи тести
1TDD Приклад: Функція isPrime()
Крок 1 (🔴 Red): Пишемо тест спочатку:
// isPrime.test.js
import { isPrime } from './isPrime';
describe('isPrime', () => {
test('2 is prime', () => {
expect(isPrime(2)).toBe(true);
});
test('1 is not prime', () => {
expect(isPrime(1)).toBe(false);
});
test('15 is not prime', () => {
expect(isPrime(15)).toBe(false);
});
test('17 is prime', () => {
expect(isPrime(17)).toBe(true);
});
});
Крок 2 (🟢 Green): Пишемо код, щоб тести пройшли:
// isPrime.js
export function isPrime(n) {
if (n <= 1) return false;
if (n === 2) return true;
if (n % 2 === 0) return false;
for (let i = 3; i <= Math.sqrt(n); i += 2) {
if (n % i === 0) return false;
}
return true;
}
Крок 3 (🔵 Refactor): Оптимізуємо без зламування тестів.
# Запуск з coverage
npm test -- --coverage
# Тільки змінені файли
npm test -- --coverage --onlyChanged
# З threshold
npm test -- --coverage --coverageThreshold='{"global":{"branches":80,"functions":80,"lines":80,"statements":80}}'
Coverage звіт показує:
Statements — відсоток покритих інструкцій
Branches — відсоток покритих гілок (if/else)
Functions — відсоток покритих функцій
Lines — відсоток покритих рядків
💡 Рекомендований Coverage:
🎯 80%+ — для критичної бізнес-логіки
🎯 60-80% — для звичайних проектів
❌ 100% — not realistic, не варто прагнути
Частина 7: CI Integration
GitHub Actions
name: Tests
on: [push, pull_request]
jobs:
test:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Setup Node.js
uses: actions/setup-node@v4
with:
node-version: '20'
- name: Install dependencies
run: npm ci
- name: Run tests
run: npm test -- --coverage
- name: Upload coverage to Codecov
uses: codecov/codecov-action@v4
with:
token: ${{ secrets.CODECOV_TOKEN }}
files: ./coverage/coverage-final.json
- name: Fail if coverage < 80%
run: |
COVERAGE=$(jq '.total.lines.pct' coverage/coverage-summary.json)
if (( $(echo "$COVERAGE < 80" | bc -l) )); then
echo "Coverage $COVERAGE% is below 80%"
exit 1
fi
Частина 8: Best Practices
✅ Рекомендації:
AAA Pattern: Arrange → Act → Assert
test('adds numbers', () => {
// Arrange
const a = 2, b = 3;
// Act
const result = add(a, b);
// Assert
expect(result).toBe(5);
});
Один assert на тест (коли можливо)
Описові назви тестів:test('should throw error when dividing by zero')
Тестуйте поведінку, а не реалізацію
Ізолюйте тести — не залежати один від одного
Mock зовнішні залежності (API, БД)
Швидкі тести — unit tests мають виконуватись за секунди
⚠️ Чого уникати:
❌ Не тестуйте приватні методи безпосередньо
❌ Не тестуйте третійсторонні бібліотеки
❌ Не ігноруйте failed tests
❌ Не робіть тести залежними від порядку виконання
Частина 9: Advanced Mocking Strategies
Mocking Modules
// src/api.js
export async function fetchCalculations() {
const response = await fetch('/api/calculations');
return response.json();
}
// src/calculator.js
import { fetchCalculations } from './api';
export async function loadPreviousResults() {
const data = await fetchCalculations();
return data.results;
}
// tests/calculator.test.js
import { loadPreviousResults } from '../src/calculator';
import * as api from '../src/api';
// Mock весь модуль
jest.mock('../src/api');
test('loads previous results', async () => {
// Arrange
const mockData = { results: [1, 2, 3] };
api.fetchCalculations.mockResolvedValue(mockData);
// Act
const results = await loadPreviousResults();
// Assert
expect(results).toEqual([1, 2, 3]);
expect(api.fetchCalculations).toHaveBeenCalledTimes(1);
});
Mocking Timers
// src/debounce.js
export function debounce(fn, delay) {
let timeoutId;
return (...args) => {
clearTimeout(timeoutId);
timeoutId = setTimeout(() => fn(...args), delay);
};
}
// tests/debounce.test.js
import { debounce } from '../src/debounce';
test('debounce calls function after delay', () => {
jest.useFakeTimers(); // ✨ Mock timers
const callback = jest.fn();
const debouncedFn = debounce(callback, 1000);
debouncedFn('test1');
debouncedFn('test2');
debouncedFn('test3');
// Після 500ms ще не викликано
jest.advanceTimersByTime(500);
expect(callback).not.toHaveBeenCalled();
// Після 1000ms викликано один раз з останнім аргументом
jest.advanceTimersByTime(500);
expect(callback).toHaveBeenCalledTimes(1);
expect(callback).toHaveBeenCalledWith('test3');
jest.useRealTimers(); // ✨ Restore timers
});
Поставте breakpoint у тесті (клік на номері рядка)
Відкрийте потрібний test file
F5 → запустити debugger
Використовуйте Step Over (F10), Step Into (F11)
Переглядайте змінні у Debug panel
Debug Failing Tests
// Використовуйте .only для запуску одного тесту
test.only('debug this test', () => {
const result = complexFunction();
console.log('Result:', result); // Логування
expect(result).toBe(42);
});
// Пропустити тест
test.skip('skip this test', () => {
// Не буде виконано
});
Watch Mode у Jest
# Watch mode — автоматично перезапускає тести при змінах
npm test -- --watch
# Опції в watch mode:
# › Press a to run all tests.
# › Press f to run only failed tests.
# › Press p to filter by a filename regex pattern.
# › Press t to filter by a test name regex pattern.
# › Press q to quit watch mode.
Частина 14: Integration Tests vs Unit Tests
Різниця між Unit і Integration тестами
Характеристика
Unit тести
Integration тести
Що тестують
Окрема функція/клас
Взаємодію між модулями
Залежності
Моки/стаби
Реальні (або частково)
Швидкість
⚡ Дуже швидко (ms)
⚠️ Повільніше (секунди)
Складність
Проста
Складніша
Кількість
Багато (70%)
Менше (20%)
Приклад
add(2, 3) === 5
API → DB → Response
Test Pyramid
/\
/ \ E2E Tests (10%)
/ \ Slower, expensive
/------\
/ \ Integration Tests (20%)
/ \ Medium speed
/------------\
/ \ Unit Tests (70%)
/________________\ Fast, many tests
Integration Test приклад
// src/calculatorService.js
import { Database } from './Database';
import { calculate } from './calculator';
export class CalculatorService {
constructor() {
this.db = new Database('sqlite://test.db');
}
async saveCalculation(operation, a, b) {
const result = calculate(operation, a, b);
await this.db.query(
'INSERT INTO calculations (operation, a, b, result) VALUES (?, ?, ?, ?)',
[operation, a, b, result]
);
return result;
}
}
// tests/calculatorService.integration.test.js
import { CalculatorService } from '../src/calculatorService';
import { Database } from '../src/Database';
describe('CalculatorService Integration', () => {
let service;
let db;
beforeEach(async () => {
// Справжня БД (або test database)
db = new Database('sqlite://test.db');
await db.query('CREATE TABLE IF NOT EXISTS calculations (...)');
service = new CalculatorService();
});
afterEach(async () => {
await db.query('DROP TABLE calculations');
});
test('saves calculation to database', async () => {
const result = await service.saveCalculation('add', 5, 3);
expect(result).toBe(8);
// Перевірити що дані в БД
const rows = await db.query('SELECT * FROM calculations');
expect(rows).toHaveLength(1);
expect(rows[0].result).toBe(8);
});
});
Висновок
Автоматичне unit тестування — фундамент якісного коду:
✅ Jest — найпопулярніший, zero-config
✅ Vitest — найшвидший, ідеально для Vite проектів
✅ TDD — покращує дизайн коду
✅ Coverage 80%+ — гарантує надійність
🚀 Рекомендований workflow:
Встановіть Jest або Vitest
Налаштуйте coverage threshold (80%)
Додайте pre-commit hook для запуску тестів
Інтегруйте у CI/CD
Моніторьте coverage через Codecov
Як користуватися шпаргалкою
Ця шпаргалка зосереджує найважливіші формули, правила та визначення теми в компактному форматі для швидкого пошуку та підготовки до іспитів. Матеріал систематизований від базових понять до просунутих результатів.
Ефективне використання
Використовуйте шпаргалку поряд з розв'язуванням задач — не для списування, а як довідник формул. Спершу спробуйте пригадати формулу самостійно, потім звіртеся з довідником. Регулярне повторення формує стійку пам'ять.
Часті запитання (FAQ)
Які ключові формули та правила містить шпаргалка з автоматичне unit testing?
Ця шпаргалка з 'Автоматичне Unit Testing' включає: основні означення, головні формули у компактному вигляді, правила обчислень, типові підстановки та приклади застосування. Все систематизовано для швидкого пошуку.
Для кого призначена ця шпаргалка з автоматичне unit testing?
Шпаргалка з 'Автоматичне Unit Testing' орієнтована на студентів університетів та учнів старшої школи, а також на всіх, хто хоче швидко освіжити знання перед іспитом або при вирішенні практичних задач.
Як використовувати шпаргалку з автоматичне unit testing при підготовці до іспиту?
Оптимальна стратегія: спершу вивчіть теорію, потім використовуйте шпаргалку як довідник при розв'язанні задач. За 1–2 дні до іспиту перегляньте шпаргалку цілком, звертаючи увагу на формули, які ви плутаєте.
Чи охоплює ця шпаргалка всю програму курсу з автоматичне unit testing?
Шпаргалка з 'Автоматичне Unit Testing' охоплює стандартну університетську програму: всі ключові теореми, формули та методи. Матеріал структурований від базових понять до просунутих результатів.
Де ще можна попрактикуватися з автоматичне unit testing після вивчення шпаргалки?
Після роботи зі шпаргалкою рекомендуємо: тренажери вправ на calculator.party (миттєвий зворотний зв'язок), розв'язані задачі (показують метод покроково) та онлайн-калькулятори для перевірки власних результатів.