Зачем нужны юнит-тесты в JavaScript

Урок объясняет, зачем разработчику автоматические тесты и что именно проверяет юнит-тест.

Юнит-тест — это код, который автоматически проверяет, что небольшой кусок программы (функция, модуль) работает так, как ожидается.

Проблема: код меняется, а проверять всё руками невозможно

Представьте функцию, которая считает скидку в корзине. Вы написали её, проверили в консоли, всё работает. Через месяц коллега добавляет купоны и случайно ломает расчёт для старых заказов. Никто не замечает, пока не приходит жалоба от клиента.

Ручная проверка не масштабируется: чем больше кода, тем больше сценариев нужно перепроверять после каждого изменения. Автоматические тесты запускают эти проверки за вас — за секунды и при каждом изменении.

Что даёт юнит-тестирование

  • Регрессии ловятся сразу. Сломали старое поведение — тест краснеет ещё до коммита.
  • Рефакторинг без страха. Можно смело переписывать код: если тесты зелёные, поведение не изменилось.
  • Тесты как документация. Хороший тест показывает, как функцию вызывать и что она возвращает.
  • Лучше дизайн. Трудно тестируемый код обычно плохо спроектирован — тесты подталкивают к чистым функциям.

Что такое «юнит»

Юнит (unit) — наименьшая осмысленная единица: чаще всего одна функция или один модуль. Юнит-тест проверяет её изолированно, без базы данных, сети и других модулей. Это делает тест быстрым и стабильным.

Идея теста на чистом JavaScript

Прежде чем подключать фреймворк, поймём суть. Тест — это просто проверка: «если вход такой, результат должен быть таким». Напишем крошечную проверку вручную.

function sum(a, b) {
  return a + b;
}

function assert(condition, message) {
  if (condition) {
    console.log("\u2713 passed: " + message);
  } else {
    console.log("\u2717 FAILED: " + message);
  }
}

assert(sum(2, 3) === 5, "2 + 3 равно 5");
assert(sum(-1, 1) === 0, "-1 + 1 равно 0");
assert(sum(0, 0) === 0, "0 + 0 равно 0");

Вывод:

✓ passed: 2 + 3 равно 5
✓ passed: -1 + 1 равно 0
✓ passed: 0 + 0 равно 0

По сути любой фреймворк, включая Jest, делает то же самое: вызывает вашу функцию, сравнивает результат с ожиданием и сообщает об успехе или провале. Jest добавляет удобный синтаксис, понятные сообщения об ошибках, изоляцию и инструменты — но базовая идея именно такая.

Какие бывают тесты

ТипЧто проверяетСкорость
Юнитотдельную функцию/модуль изолированноочень быстрый
Интеграционныйнесколько модулей вместесредний
E2E (end-to-end)всё приложение глазами пользователямедленный

Этот курс — про юнит-тесты (и немного интеграционные). Их пишут больше всего: они дешёвые, быстрые и дают самую быструю обратную связь.

Итог

  • Юнит-тест автоматически проверяет, что маленький кусок кода работает правильно.
  • Тесты ловят регрессии, упрощают рефакторинг и служат документацией.
  • Суть теста — сравнить фактический результат с ожидаемым; Jest лишь делает это удобным.
Проверьте себя
1. Что обычно понимают под «юнитом» в юнит-тестировании JavaScript?
AВесь сервер целиком
BНаименьшую осмысленную единицу — функцию или модуль
CБраузерную вкладку
DОдин коммит в git
2. Какое преимущество тестов проявляется при рефакторинге?
AКод начинает работать быстрее
BЗелёные тесты подтверждают, что поведение не изменилось
CТесты автоматически переписывают код
DИсчезает необходимость в code review
3. В чём суть любого теста, включая тесты Jest?
AЗапустить весь проект и подождать ошибок
BСравнить фактический результат с ожидаемым
CУдалить старый код
DЗамерить размер бандла
Поддержать проект