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. Що взагалі перевіряють тестами
— І останнє, — каже Льоха. — Тестами покривають не все підряд, а те, де важливий точний результат і де легко непомітно помилитися. Лічильник очок, нарахування нагороди, правила гри — ось це. Дали вхідні дані, знаєте правильну відповідь — перевіряйте тестом.
— А що не покривають?
— Те, що легше перевіряється очима, а не числом. Чи красиво розташувалися кнопки, чи приємний колір, чи плавна анімація — це тесту не доручиш, тут дивиться людина. Тест сильний там, де є правильна відповідь, з якою можна звірити результат. Твій рахунок — саме такий випадок: три в ряд мають дати три. Є з чим звіряти — є що тестувати.
Тьома закриває приклад, і в голові складається проста картина: тест — це машина-перевіряльник, якій ви один раз кажете «ось так правильно», а вона стежить за цим замість вас. Не магія. Просто записане правило і крик, якщо його порушили.
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ