1. Проверять руками — тупик
— Слушай, — пишет Тёма, — а как я вообще докажу что-то? Ну починю. Открою игру, соберу три в ряд, посмотрю на табло. Три показало — значит норм.
— А если багов будет пять? — спрашивает Лёха. — А зон в игре десять? Ты каждую будешь руками щёлкать после каждой правки? Ты вот с этим одним багом сколько раз партию перезапускал, пока поймал?
Тёма прикидывает. Раз пять точно. Собери, глянь, не поверил, ещё раз, ещё.
— Ну штук пять.
— Вот. Пять раз на один баг. А правок за день — десятки. Руками проверять всё после каждой — свихнёшься и всё равно что-нибудь прозеваешь. Устанешь, забудешь, пропустишь. Люди на этом обжигались, пока не придумали простую вещь: пусть машина проверяет за тебя.
2. Тест — это маленький проверяльщик
— Называется это тест, — продолжает Лёха. — Не пугайся слова. Тест — это маленькая программа, у которой одна работа: взять твой код, дать ему известный пример и проверить, правильный ли ответ вышел. Ты один раз описал, что считается правильным, — и дальше машина сама это гоняет, хоть сто раз в секунду, и не устаёт, и не забывает.
— В смысле — программа проверяет программу?
— Именно. Смотри, я тебе покажу тест на твой баг со счётом. Не пугайся, что это код, — читается по-человечески:
test("три в ряд даёт 3 очка", () => {
if (getScore(3) !== 3) {
return "ОШИБКА: очки посчитаны неверно";
}
return "всё хорошо";
});
— Читай прямо словами, — Лёха ведёт по строчкам. — «Проверка под названием „три в ряд даёт 3 очка". Посчитать очки за три в ряд — это вот getScore(3). Если насчитанное не равно трём — закричать „ОШИБКА". Иначе — сказать „всё хорошо".» Всё. Вот и весь тест.
Тёма читает ещё раз, шевеля губами. getScore(3) — посчитать очки за тройку. !== 3 — «не равно трём». Если не три — ошибка.
— Так это ж… просто, — говорит он. — Тут и программистом быть не надо. «Посчитай. Если не три — ори Ошибкааа!»
— А в этом и есть весь смысл, — кивает Лёха. — Тест — это записанное правило «как должно быть» плюс крик, если стало не так. У тебя сейчас баг: три даёт тридцать. Значит getScore(3) вернёт тридцать. Тридцать не равно трём — тест закричит «ОШИБКА». Вот так он ловит твой баг, не открывая игру и не щёлкая руками.
3. Как тест запускают
— А как я его… запущу? — Тёма ищет кнопку.
— Одной командой. В проекте это обычно команда npm test — «прогони все тесты». Ты её пишешь, а дальше машина сама берёт каждый тест, гоняет и докладывает. Смотри, как выглядит доклад, когда тест нашёл твой баг:
FAIL score.test.js
● три в ряд даёт 3 очка
ждали: 3
получили: 30
— FAIL — значит «провалено», красным. — Лёха тычет в строчки. — Тест честно докладывает: ждал три, получил тридцать. Не сошлось — закричал. А вот как он выглядит, когда баг починен и счёт верный:
PASS score.test.js
✓ три в ряд даёт 3 очка
— PASS — «пройдено», зелёным. Посчитал, сошлось с тройкой, промолчал-порадовался. Вот и вся азбука: красный FAIL — проверка что-то поймала, зелёный PASS — всё сошлось.
Тёма кивает — эту пару, красное-зелёное, он уже мельком видел, но теперь понял, откуда она берётся.
4. Что вообще проверяют тестами
— И последнее, — говорит Лёха. — Тестами покрывают не всё подряд, а то, где важен точный результат и где легко ошибиться незаметно. Считалка очков, начисление награды, правила игры — вот это. Дал вход, знаешь верный ответ — проверяй тестом.
— А что не покрывают?
— То, что легче проверяется глазами, а не числом. Красиво ли легли кнопки, приятный ли цвет, ровно ли анимация — это тесту не поручишь, тут человек смотрит. Тест силён там, где есть правильный ответ, с которым можно сверить. Твой счёт — ровно такой случай: три в ряд ОБЯЗАНЫ дать три. Есть с чем сверять — есть что тестировать.
Тёма закрывает пример, и в голове укладывается простая картина: тест — это машина-проверяльщик, которой ты один раз сказал «правильно вот так», а она следит за этим вместо тебя. Не магия. Записанное правило и крик, если правило нарушили.
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ