Skip to content

Мета

Ключові завдання unit-тестів:

  • Запобігати регресіям. Швидко виявляти помилки, які виникли після змін у коді.
  • Підвищувати довіру до рефакторингу. Дозволяти змінювати реалізацію без страху зламати поведінку.
  • Документувати поведінку системи. Тести виконують роль живої документації — вони показують очікувані сценарії використання модулів.
  • Сприяти модульності та чистоті архітектури. Неможливо написати якісний unit-тест, якщо код не розділено на незалежні одиниці.
  • Підвищувати ефективність розробки. Завдяки швидкому зворотному зв’язку, дефекти виявляються до інтеграційної стадії.

Unit-тести охоплюють окремі незалежні одиниці коду, які можна виконати без повного запуску системи.

У фронтенд-проєктах такими одиницями є:

ТипПрикладиОсобливості тестування
Функції / утилітиpure functions, форматери, калькулятори, фільтри, парсериБез побічних ефектів, перевіряється вхід → вихід.
Кастомні хуки (React)useFetchData, usePagination, useToggleТестуємо через поведінку стану та ефектів, за потреби з моками залежностей (API, таймерів).
Компоненти UIкнопки, поля вводу, модалки, дропдауниТестуємо публічну поведінку (інтерфейс користувача), а не внутрішній стан. Наприклад при перевірці модалки ми перевіряємо чи вона видима, а не його state isOpen = true.
Класи/сервісиSDK модулі, обгортки над API, адаптериТестуються через методи й контракти, без реальної мережі (через моки).
Бізнес-логікаобчислення, валідації, трансформації данихРозділяється на чисті функції й тестується незалежно від UI.

Unit-тести не замінюють інші види тестування.
Їхня мета — гарантувати, що в межах одного модуля все працює очікувано.

Не охоплюється unit-тестами:

  • Комунікація між модулями/сервісами;
  • Сумісність з реальними браузерами чи пристроями;
  • UX-поведінка (анімації, верстка, responsive layout);
  • Повна логіка користувацьких флоу (login, checkout, тощо).

Unit-тест — це тест ізоляції. Якщо тест вимагає реального бекенду, роутера або DOM — це вже інтеграційний рівень.

Детальніше про межі unit тестування в розділі:

У контексті нашої політики:

Unit — найменша функціональна одиниця коду, яку можна протестувати ізольовано, незалежно від інших частин системи.

Unit-тест — автоматизований тест, що перевіряє одну таку одиницю на основі:

  • передбачених вхідних даних,
  • очікуваних результатів або побічних ефектів,
  • контрольованого середовища.

Життєвий цикл unit-тестів у процесі розробки:

  1. Створення/оновлення коду → додаємо або змінюємо unit-тести.
  2. Локальний прогін → кожен розробник запускає тести перед комітом.
  3. CI-перевірка → тести запускаються автоматично при кожному merge request.
  4. Регулярна перевірка стабільності → у разі флейків* тест або переписується, або ізолюється.

Щоб оцінити ефективність unit-тестів, встановлюються такі метрики:

ПоказникМета
Coverage (покриття)≥ 80% для основних пакетів, ≥ 90% для критичної бізнес-логіки
Час виконання< 30 секунд локально; < 2 хвилин у CI
Flaky tests rate< 2% від загальної кількості
Час на написання тестівне перевищує 25% від часу на реалізацію фічі
  1. Один тест — одна поведінка.
  2. Тести мають бути стабільними (без флейків, залежності від часу, рандому, DOM).
  3. Тести мають бути швидкими — запускаються миттєво локально.
  4. Код має бути тестованим за своєю природою, а не через складні моки.
  5. Тести — це частина коду бази, вони проходять рев’ю так само як і основний код.

Більше інформації що до організації коду в розділі: