Признаки хороших тестов
Урок собирает свойства, которые отличают надёжный тест от ненадёжного.
Хороший тест быстрый, изолированный, детерминированный и читаемый — ему можно доверять и его не страшно запускать часто.
Принципы FIRST
Удобная мнемоника качеств теста:
| Буква | Свойство |
| F — Fast | быстрый: тысячи тестов за секунды |
| I — Isolated | изолированный: не зависит от других |
| R — Repeatable | повторяемый: тот же результат при каждом прогоне |
| S — Self-validating | сам решает pass/fail без ручной проверки |
| T — Timely | пишется вовремя, рядом с кодом |
Быстрый
Медленные тесты не запускают часто, а значит они бесполезны как ранняя обратная связь. Скорость даёт изоляция: без реальной сети, диска и setTimeout (используют моки и фейковые таймеры).
Детерминированный
Тест обязан давать один и тот же результат всегда. Враги детерминизма — текущее время, случайные числа, порядок выполнения, реальная сеть. Покажем проблему случайности живьём:
function makeId() {
return Math.floor(Math.random() * 1000);
}
// недетерминированная "проверка": результат разный каждый раз
const id = makeId();
console.log('сгенерирован id:', id);
console.log('Можно ли утверждать id === 42?', id === 42);
// детерминированный подход: проверяем СВОЙСТВО, а не точное значение
console.log('id в диапазоне [0, 999]:', id >= 0 && id < 1000);Вывод:
сгенерирован id: 731 Можно ли утверждать id === 42? false id в диапазоне [0, 999]: true
Точное значение случайно (у вас число будет другим), но свойство «в диапазоне [0, 999]» — детерминированно и всегда истинно. Вместо привязки к конкретному случайному числу либо мокают источник случайности, либо проверяют инвариант.
Читаемый
Тест читают чаще, чем пишут. Понятное имя (что проверяем), структура AAA, минимум лишнего — всё это делает тест документацией. Если по упавшему тесту нельзя понять, что сломалось, тест плохой.
Самопроверяемый
Тест должен сам однозначно сказать pass/fail. Никаких «посмотрите в консоль глазами» — для этого есть expect.
Итог
- FIRST: Fast, Isolated, Repeatable, Self-validating, Timely.
- Скорость и изоляцию дают моки и фейковые таймеры.
- Детерминизм: убирайте время, случайность и порядок; проверяйте инварианты.
- Читаемый самопроверяемый тест — это живая документация.