Что такое идеальный unit тест
Что проверяют
Отличаете ли вы тест, который ловит регрессии, от теста, который повторяет реализацию и краснеет на каждом переименовании метода. Список «быстрый, независимый, читаемый» знают все, ценится понимание конфликтов между этими свойствами.
Как отвечать
Полезнее назвать четыре свойства и признать, что они спорят между собой: защита от регрессий, устойчивость к рефакторингу, скорость обратной связи, стоимость поддержки. Идеального теста нет, есть баланс, и самое недооценённое свойство это устойчивость к рефакторингу: тест проверяет наблюдаемое поведение через публичный контракт, а не последовательность внутренних вызовов.
Дальше конкретика. Детерминированность: ни текущего времени, ни случайности, ни сети, ни базы, ни файлов, ни сна потока, часы и генератор подставляются снаружи. Независимость от других тестов и от порядка запуска. Структура из трёх частей: подготовка, действие, проверка. Одна проверяемая мысль на тест. Имя, в котором видно ожидаемое поведение и условие. Сообщение о падении, по которому причина понятна без отладчика.
@Test
void shouldApplyDiscountWhenTotalAboveThreshold() {
var cart = new Cart(List.of(item(1000), item(500)));
assertThat(cart.total()).isEqualTo(1350);
}Заглушки ставят на границы, которые вы не контролируете: внешний сервис, брокер, платёжный шлюз. Соседние классы и доменные объекты берут настоящими. Тест на реальной базе полезен, но это уже интеграционный уровень с другим бюджетом времени.
Где спотыкаются
Изолируют каждый класс от всех соседей заглушками и получают тест, который проверяет, что код вызвал ровно то, что вызвал. Такой набор краснеет при любом рефакторинге и пропускает настоящие дефекты на стыке классов.
Пишут тавтологию: повторяют в проверке ту же формулу, что и в рабочем коде. Ошибка в формуле честно воспроизводится в ожидании, и тест вечно зелёный. Ожидаемое значение задают константой, посчитанной вручную.
Гонятся за покрытием и тестируют геттеры, оставляя без внимания границы, исключения и пустые значения. Рядом живёт общее изменяемое состояние в статике или в подготовке на весь класс, из-за которого тесты проходят поодиночке и падают всей пачкой.