Что это блок испытания, на самом деле? И действительно ли здесь такая большая дихотомия?
Мы работаем в области, где чтение буквально через один бит после конца буфера может привести к полному сбою программы или вызвать ее совершенно неточный результат, или, как свидетельствует недавняя ошибка TLS «HeartBleed», создать предположительно безопасную систему в целом. открыть без предоставления каких-либо прямых доказательств недостатка.
Невозможно устранить всю сложность этих систем. Но наша работа, насколько это возможно, сводить к минимуму и управлять этой сложностью.
Является ли модульный тест тестом, который подтверждает, например, что резервирование успешно проведено в трех разных системах, создается запись в журнале и отправляется подтверждение по электронной почте?
Я собираюсь сказать нет . Это интеграция тест. И те, кто определенно имеют свое место, но это также другая тема.
Интеграционный тест работает для подтверждения общей функции всей «функции». Но код этой функции должен быть разбит на простые тестируемые строительные блоки, называемые «блоками».
Поэтому юнит-тест должен иметь очень ограниченную область применения.
Что означает , что код протестирован с помощью модульного тестирования должен иметь очень ограниченную сферу применения.
Что также подразумевает, что одним из столпов хорошего дизайна является разбиение вашей сложной задачи на более мелкие одноцелевые куски (насколько это возможно), которые можно тестировать в относительной изоляции друг от друга.
В итоге получается система, созданная из надежных базовых компонентов, и вы знаете, что какой-либо из этих основополагающих блоков кода ломается, потому что вы написали простые, небольшие тесты с ограниченным объемом, чтобы точно сказать вам это.
Во многих случаях вы также должны иметь несколько тестов на единицу. Сами тесты должны быть простыми, тестировать одно и только одно поведение в максимально возможной степени.
Я думаю, что понятие «модульного теста», тестирующего нетривиальную, сложную и сложную логику, немного оксюморон.
Таким образом, если произошел такой умышленный отказ от проектирования, то как в мире может модульный тест внезапно начать выдавать ложные срабатывания, если основная функция тестируемого кода не изменилась? И если это произошло, то вам лучше поверить, что в игре есть неочевидные волновые эффекты. Ваш неработающий тест, который, похоже, дает ложное срабатывание, фактически предупреждает вас о том, что какое-то изменение нарушило более широкий круг зависимостей в базе кода, и его необходимо изучить и исправить.
Некоторые из этих модулей (многие из них) могут нуждаться в тестировании с использованием фиктивных объектов, но это не означает, что вам нужно писать более сложные или сложные тесты.
Возвращаясь к моему надуманному примеру системы бронирования, вы действительно не можете посылать запросы от к живой базе данных резервирования или третьей стороны обслуживанию (или даже «Dev» экземпляру этого) каждый раз , когда вы блок тестового кода.
Таким образом, вы используете макеты, которые представляют один и тот же интерфейсный контракт. Затем тесты могут проверить поведение относительно небольшого детерминированного фрагмента кода. Зеленый все вниз по доске затем говорит вам, что блоки , составляющие ваш фундамент , не сломаны.
Но сама логика отдельных юнит-тестов остается максимально простой.