Давным-давно, когда я учился в аспирантуре физтеха по специальности "Моделирование, численные методы и комплексы программ", одним из предметов которые нужно было изучать была философия. Лично для меня предмет не самый интересный, но благодаря  нашему преподавателю философии после пары лекций  учение Сэра Карла Раймунда Поппера вызвало  парадигм_шифт в сознании...

Краеугольным камнем этого сдвига является критерий Поппера или фальсифицируемость (принципиальная опровержимость утверждения, опровергаемость).  Цитируя википедию, привожу следующее определение: "Критерий фальсифицируемости требует, чтобы теория или гипотеза не была принципиально неопровержимой."

Проецируя этот критерий в область разработки программного обеспечения, мы получаем требование опровергаемости наших разработок.  Ведь одно из основных правил разработки-через-тестирование (TDD) -- создание теста, перед началом добавление нового функционала.

Следуя правилам TDD мы с помощью набора тестов создаем условия, при которых наша программа ( "гипотеза") может быть опровергнута! Далее,  в процессе разработки ПО мы добиваемся состояния, когда все тесты выполняются успешно  и "загорается зеленый свет"!

А дальше у многих в голове происходит страшное...

Люди начинают путать фальсифицируемость и верифицируемость(то есть доказуемость). Если все тесты прошли успешно, это не доказывает, что наша программа работает корректно. Соблюдение критерия Поппера -- есть необходимое условие, но не достаточное.  Другими словами, если все тесты прошли успешно, этого недостаточно! Нельзя   утверждать, что программа работает корректно.

Зачем же тогда писать юнит-тесты? Затем, чтобы в тех случаях когда тест не срабатывает мы точно знали -- у нас есть ошибки. Это важно знать, иначе в программировании будет торжествовать мистика и мракобесие.