Чем раньше вы поймаете ошибки, тем дешевле их исправить. Ошибка, обнаруженная кодером во время модульного тестирования, довольно дешева (просто исправьте чертову вещь).
Ошибка, обнаруженная во время тестирования системы или интеграции, стоит дороже, поскольку ее необходимо исправить и перезапустить цикл тестирования.
Ошибка, найденная вашим клиентом, будет стоить дорого: перекодирование, повторное тестирование, переупаковка и так далее. Это может также привести к болезненной загрузочной печати на вашем derriere, когда вы сообщите руководству, что вы не уловили его во время модульного тестирования, потому что вы ничего не делали, думая, что системные тестеры найдут все проблемы: -)
Сколько денег будет стоить GM отозвать 10000 автомобилей, потому что каталитический нейтрализатор не работает должным образом?
Теперь подумайте, сколько им будет стоить, если они обнаружат, что сразу после того, как эти преобразователи были им доставлены, но за до их посадили в эти 10 000 автомобилей.
Я думаю, вы найдете последний вариант немного дешевле.
Это одна из причин того, почему разработка через тестирование и непрерывная интеграция (иногда) полезны - тестирование проводится постоянно.
Кроме того, модульные тесты не проверяют работу программы в целом, а только то, что каждый бит работает должным образом. Это часто на много больше, чем тесты более высокого уровня.