У меня был тот же вопрос, и, прочитав комментарии, я теперь думаю (с должным уважением к предыдущим ответам):
Я думаю, что проблема может заключаться в том, что мы оба взяли на себя якобы цель юнит-тестов - чтобы доказать правильность кода - и применили эту цель к самим тестам. Это нормально, за исключением того, что цель модульных тестов не состоит в том, чтобы доказать, что код правильный .
Как и во всех нетривиальных начинаниях, вы никогда не можете быть на 100% уверены. Правильная цель модульных тестов - уменьшить количество ошибок , а не устранить их. В частности, как уже отмечали другие, когда вы вносите изменения позже, это может случайно что-то сломать. Модульные тесты - это всего лишь один инструмент для уменьшения ошибок, и, конечно, не должен быть единственным. В идеале вы должны сочетать модульное тестирование с проверкой кода и надежным контролем качества, чтобы снизить количество ошибок до допустимого уровня.
Модульные тесты намного проще, чем ваш код; невозможно сделать ваш код таким же простым, как модульный тест, если ваш код делает что-то значимое. Если вы пишете «маленький, детализированный» код, который легко доказать, что он правильный, то ваш код будет состоять из огромного количества маленьких функций, и вам все равно придется определить, все ли они работают корректно в совокупности.
Поскольку модульные тесты неизбежно проще, чем код, который они тестируют, они с меньшей вероятностью будут иметь ошибки. Даже если некоторые из ваших модульных тестов содержат ошибки, в целом они все же улучшат качество вашей основной кодовой базы. (Если ваши юнит-тесты настолько глючные, что это не так, то, скорее всего, ваша основная кодовая база - это также куча паров, и вы полностью испорчены. Я думаю, что мы все предполагаем базовый уровень компетенции.)
Если вы ДЕЙСТВИТЕЛЬНО хотели применить второй уровень модульного тестирования, чтобы доказать правильность своих модульных тестов, вы можете сделать это, но это может привести к уменьшению отдачи. Чтобы посмотреть на это искусственно:
Предположим, что модульное тестирование уменьшает количество производственных ошибок на 50%. Затем вы пишете мета-модульные тесты (модульные тесты для поиска ошибок в модульных тестах). Скажите, что это находит проблемы с вашими юнит-тестами, снижая уровень ошибок в производстве до 40%. Но для написания мета-модульных тестов потребовалось 80% времени, как и для написания юнит-тестов. За 80% усилий вы получили только еще 20% прироста. Может быть, написание мета-мета-модульных тестов дает вам еще 5 процентных пунктов, но теперь опять же, что заняло 80% времени, которое потребовалось для написания мета-юнит-тестов, так что за 64% усилий написания юнит-тестов вы 50%) вы получили еще 5%. Даже при значительно более либеральных цифрах это не эффективный способ тратить ваше время.
В этом сценарии ясно, что проходить точку написания модульных тестов не стоит усилий.