Чрезвычайно короткая версия: меньшие тесты, потому что они запускают меньшие части системы, естественно ограничивают то, что могут написать программисты, и поэтому это создает возможность для более четкой (легче заметить / труднее игнорировать) обратной связи. Позвольте мне добавить, что это не обязательно приведет к лучшему дизайну, но скорее создаст возможность быстрее заметить риски проектирования.
Во-первых, чтобы уточнить, когда я говорю «микротест», я имею в виду «маленький тест» и ничего более. Я использую этот термин, потому что я не имею в виду «модульный тест»: я не хочу втягиваться в дебаты о том, что составляет «юнит». Мне все равно (по крайней мере, не здесь / сейчас). Два человека, вероятно, с большей легкостью согласятся на «маленький», чем на «единицу», поэтому я постепенно решил принять «микротест» в качестве нового стандартного термина для этой идеи.
Большие тесты, то есть тесты, которые запускают большие части системы в своей «активной» части, не склонны критиковать дизайн так же ясно, как и более мелкие тесты. Представьте себе набор всех баз кода, которые могут пройти данную группу тестов, а это означает, что я мог бы реорганизовать код, и он все равно прошел бы эти тесты. Для больших тестов этот набор больше; для небольших тестов этот набор меньше. Иными словами, меньшие тесты больше ограничивают дизайн, поэтому меньшее количество проектов может их пройти. Таким образом, микротесты могут больше критиковать дизайн.
Я говорю «более резко», чтобы вызвать в воображении образ друга, который говорит вам прямо то, что вы не хотите слышать, но должны слышать, и кто кричит на вас, чтобы передать срочность таким образом, чтобы другие люди не чувствовали себя комфортно делает. Интегрированные тесты, с другой стороны, хранят молчание и намекают на проблемы, в основном, когда у вас больше нет ни времени, ни сил для их решения. Интегрированные тесты позволяют слишком легко скрывать проблемы дизайна под ковром.
С более крупными тестами (такими как интегрированные тесты) программисты, как правило, попадают в неприятности из-за небрежности: у них достаточно свободы для написания запутанного кода, который каким-то образом проходит тесты, но их понимание этого кода быстро исчезает, как только они переходят к следующей задаче. и другие испытывают чрезмерные трудности с чтением запутанного дизайна. В этом и заключается риск полагаться на интегрированные тесты. С небольшими тестами (такими как микротесты) программисты, как правило, сталкиваются с проблемами из-за чрезмерной спецификации: они чрезмерно ограничивают тесты, добавляя нерелевантные детали, обычно путем копирования / вставки из предыдущего теста, и при этом они относительно быстро рисуют себя в угол. Хорошие новости: Я считаю, что гораздо проще и безопаснее удалить посторонние детали из тестов через несколько часов или дней после их написания, чем найти их, чтобы разделить запутанный производственный код от месяцев до лет после его написания. По мере появления ошибок чрезмерное указание наносит все более очевидный ущерб быстрее, и программист оповещения раньше видит, что им нужно что-то исправить. Я считаю это преимуществом: раньше я замечал проблемы и исправлял их до того, как эти проблемы лишают нас возможности добавлять новые функции.