Подход "написать тест + рефакторинг до прохождения" выглядит невероятно антиинженерным.
Похоже, у вас неправильное представление о рефакторинге и TDD.
Рефакторинг кода - это процесс изменения исходного кода компьютерной программы без изменения ее внешнего функционального поведения с целью улучшения некоторых нефункциональных атрибутов программного обеспечения.
Таким образом, вы не можете рефакторинг кода, пока он не пройдет.
И TDD, в частности модульное тестирование (которое я считаю улучшением ядра, так как другие тесты кажутся мне вполне правдоподобными), не сводится к перестройке компонента до его работы. Речь идет о разработке компонента и работе над реализацией до тех пор, пока компонент не будет работать как задумано.
Также важно понимать, что модульное тестирование - это тестирование модулей . Из-за тенденции всегда писать много вещей с нуля, важно протестировать такие модули. Инженер-строитель уже знает спецификации единиц, которые он использует (различные материалы), и может ожидать, что они будут работать. Это две вещи, которые часто не применимы к разработчикам программного обеспечения, и это очень проработано, чтобы протестировать устройства перед их использованием, потому что это означает использование проверенных, высококачественных компонентов.
Если у инженера-строителя возникла идея использовать новую волокнистую ткань для создания крыши для покрытия стадиона, можно ожидать, что он протестирует ее как единое целое, то есть определит необходимые характеристики (например, вес, проницаемость, устойчивость и т. Д.) И после этого проверьте и доработайте его, пока он не встретит их.
Вот почему TDD работает. Потому что, если вы создаете программное обеспечение из тестируемых модулей, скорее всего, оно работает лучше, когда вы соединяете их вместе, а если нет, вы можете ожидать, что проблема будет в вашем связующем коде, предполагая, что ваши тесты имеют хорошее покрытие.
редактировать:
рефакторинг означает: без изменений в функциональности. Один из пунктов написания модульного теста - убедиться, что рефакторинг не нарушает код. Таким образом, TDD должен гарантировать, что рефакторинг не имеет побочных эффектов.
Детализация не является предметом перспективы, потому что, как я уже сказал, модульные тесты тестируют блоки, а не системы, в результате чего гранулярность точно определяется.
TDD поощряет хорошую архитектуру. Это требует от вас определения и реализации спецификаций для всех ваших устройств, вынуждая их разрабатывать их до начала реализации, что совершенно противоречит тому, что вы думаете. TDD диктует создание блоков, которые могут быть проверены индивидуально и, таким образом, полностью отделены.
TDD не означает, что я провожу программный тест со спагетти-кодом и размешиваю пасту, пока она не пройдет.
В отличие от гражданского строительства, в разработке программного обеспечения проект обычно постоянно развивается. В гражданском строительстве у вас есть требование построить мост в положении A, который может перевозить х тонн и достаточно широкий для n транспортных средств в час.
В области разработки программного обеспечения заказчик может в любой момент решить (возможно, после завершения), что ему нужен двухэтажный мост и что он хочет, чтобы он был соединен с ближайшей автомагистралью, и что он хотел бы, чтобы он был подъемным мостом, потому что его компания Недавно начал использовать парусные корабли.
Разработчики программного обеспечения будут поставлены задача изменить дизайн. Не потому, что их конструкции несовершенны, а потому, что это образ действий. Если программное обеспечение хорошо спроектировано, оно может быть перепроектировано на высоком уровне, без необходимости переписывать все компоненты низкого уровня.
TDD - это создание программного обеспечения с индивидуально протестированными компонентами с высокой степенью разделения. Хорошо выполненный, он поможет вам реагировать на изменения требований значительно быстрее и безопаснее, чем без них.
TDD добавляет требования к процессу разработки, но не запрещает другие методы обеспечения качества. Конечно, TDD не обеспечивает такую же безопасность, как формальная проверка, но опять же, формальная проверка является чрезвычайно дорогой и невозможной для использования на системном уровне. И все же, если вы хотите, вы можете объединить оба.
TDD также включает в себя тесты, отличные от модульных тестов, которые выполняются на системном уровне. Я нахожу это легко объяснить, но трудно выполнить и трудно измерить. Кроме того, они вполне правдоподобны. Хотя я абсолютно вижу их необходимость, я не очень ценю их как идеи.
В конце концов, ни один инструмент на самом деле не решает проблему. Инструменты только облегчают решение проблемы. Вы можете спросить: как долото поможет мне с великолепной архитектурой? Хорошо, если вы планируете делать прямые стены, вам пригодятся прямые кирпичи. И да, конечно, если вы дадите этот инструмент идиоту, он, вероятно, в конце концов ударит его по ноге, но это не ошибка долота, поскольку это не недостаток TDD, который дает ложную защиту новичкам, кто не пишет хорошие тесты.
Таким образом, можно сказать, что TDD работает намного лучше, чем отсутствие TDD.