Попытка завоевать доверие в преимуществах TDD

Я просто купил Искусство Поблочного тестирования из Amazon. Я довольно серьезно отношусь к пониманию TDD, поэтому пребывайте в уверенности, что это - подлинный вопрос.

Но я чувствую, что постоянно нахожусь на грани нахождения, что выравнивание разочаровывается в нем.

Я собираюсь играть защитника дьявола здесь и попытаться подстрелить подразумеваемые преимущества TDD в надеждах, что кто-то может доказать меня неправильно и помочь мне быть более уверенным в его достоинствах. Я думаю, что пропускаю что-то, но я не могу выяснить что.

1. TDD для сокращения ошибок

Это часто процитированное сообщение в блоге говорит, что модульные тесты являются средствами проектирования а не для ловли ошибок:

По моему опыту, модульные тесты не являются эффективным способом найти ошибки или обнаружить регрессии.

...

TDD является устойчивым способом разработать компоненты программного обеспечения (“единицы”) в интерактивном режиме так, чтобы их поведение было указано через модульные тесты. Это - все!

Имеет смысл. Пограничные случаи все еще всегда будут там, и Вы только собираетесь найти поверхностные ошибки - которые являются теми, что Вы найдете, как только Вы запускаете свое приложение так или иначе. Все еще необходимо сделать надлежащее интеграционное тестирование после того, как Вы будете сделаны, создавая хороший блок Вашего программного обеспечения.

Достаточно ярмарка, сокращение ошибок не является единственной вещью, с которой TDD, как предполагается, помогает.

2. TDD как парадигма дизайна

Это - вероятно, большое. TDD является парадигмой дизайна, которая помогает Вам (или вынуждает Вас) сделать Ваш код более компонуемым.

Но composability является умножением осуществимого качества; стиль функционального программирования, например, делает код довольно компонуемым также. Конечно, трудно записать крупномасштабное приложение полностью в функциональном стиле, но существуют определенные шаблоны компромисса, за которыми можно следовать для поддержания composability.

Если Вы запустите с очень модульного функционального проекта и затем тщательно добавите состояние и IO к Вашему коду по мере необходимости, то Вы закончите с теми же шаблонами, которые поощряет TDD.

Например, для выполнения бизнес-логики на базе данных, код IO мог быть изолирован в функции, которая делает "одноместные" задачи доступа к базе данных и передачи его в как аргумент функции, ответственной за бизнес-логику. Это было бы функциональным способом сделать это.

Конечно, это немного неуклюже, таким образом, вместо этого, мы могли бросить подмножество кода базы данных IO в класс и дать это объекту, содержащему соответствующую бизнес-логику. Это - та же самая вещь, адаптация функционального способа сделать вещи, и это упоминается как шаблон репозитория.

Я знаю, что это, вероятно, собирается заработать для меня довольно плохое телесное наказание, но часто времена, я не могу не чувствовать, что TDD просто восполняет некоторые дурные привычки, которые ООП может поощрить - которых можно избежать с определенным вдохновением от функционального стиля.

3. TDD как документация

TDD, как говорят, служит документацией, но это только служит документацией для коллег; потребитель все еще требует текстовой документации.

Конечно, метод TDD мог служить основанием для примера кода, но тесты обычно содержат определенную степень насмешек, которые не должны быть в примере кода и обычно довольно изобретаются так, чтобы они могли быть оценены для равенства против ожидаемого результата.

Хороший модульный тест опишет в его сигнатуре метода точное поведение, это проверяется, и тест проверит не больше и не меньше, чем то поведение.

Так, я сказал бы, Ваше время могло бы быть лучше проведено, полируя Вашу документацию. Heck, почему бы не просто документация сначала полностью и вызов Управляемый Документацией Дизайн?

4. TDD для регрессионного тестирования

Это упоминается в том сообщении выше, что TDD не слишком полезен для обнаружения регрессий. Это, конечно, потому что неочевидные пограничные случаи - те, которые всегда портят, когда Вы изменяете некоторый код.

То, что могло бы также быть должно отметить по той теме, - то, что возможности хороши, что большая часть Вашего кода собирается остаться тем же в течение довольно долгого времени. Так, разве не имело бы большего смысла писать модульные тесты по мере необходимости, каждый раз, когда код изменяется, сохраняя старый код и сравнивая его результаты с новой функцией?

11
задан Rei Miyasaka 18 July 2010 в 06:00
поделиться

5 ответов

Я считаю, что преимущество TDD заключается в том, что вы на самом деле пишете тесты, поскольку они более интересны, когда представляют собой цель, которую вы должны достичь (создать код для прохождения тестов), а не рутинную работу, которую вам придется выполнять впоследствии.

Кроме того, это напоминает о вас как о пользователе. Вы должны думать «а для чего пользователю нужен мой метод» или что-то еще, а не «Я надеюсь, что мой метод достиг того, что должен был делать». Таким образом, это также может помочь уменьшить количество ошибок.

4
ответ дан 3 December 2019 в 08:53
поделиться

С точки зрения дизайна, одно из главных преимуществ TDD, которое вы не видите, заключается в том, что он обеспечивает достаточный дизайн. Знаете, как говорят, инженер видит стекло вдвое больше, чем должно быть. Излишний дизайн программного обеспечения может стать большой проблемой. Я обнаружил, что в 90 +% случаев TDD вытеснял правильный баланс абстракции для поддержки дальнейшего расширения кода. TDD - это не волшебство, для этого нужен и программист, но это важная часть инструментария.

Я думаю, что в вашем списке слишком много изолированного TDD. А как насчет рефакторинга? Я думаю, что одним из основных преимуществ теста является то, что он блокирует поведение, так что при рефакторинге вы можете быть уверены, что ничего не изменили, что, в свою очередь, может дать вам уверенность в проведении рефакторинга. И нет ничего лучше, чем дизайн, рожденный на основе опыта, а не доска (хотя дизайн доски высокого уровня по-прежнему очень важен).

Кроме того, вы пишете: «Итак, не имеет ли смысл писать модульные тесты по мере необходимости, всякий раз, когда код изменяется, сохраняя старый код и сравнивая его результаты с результатами новой функции?» Код, написанный без учета модульного тестирования, часто невозможно протестировать, особенно если он взаимодействует с внешними службами, такими как база данных, диспетчер транзакций, инструментарий GUI или веб-служба. Добавление их позже просто не произойдет.

Я думаю, что Боб Мартин сказал лучше всего, TDD для программирования то же самое, что Double Entry для бухгалтерского учета. Это предотвращает определенный класс ошибок.Это не предотвращает всех проблем, но гарантирует, что если ваша программа намеревалась сложить два плюс два, она не вычитала их вместо этого. Базовое поведение очень важно, и если что-то пойдет не так, вы можете потратить много времени на изучение своего отладчика.

5
ответ дан 3 December 2019 в 08:53
поделиться

TDD - это не методология, это образ мышления.

TDD для уменьшения количества ошибок : Когда ваша база кода начинает расти, очень важно выполнять все тесты при каждой проверке исходного кода. Польза от этого становится очевидной, когда в команде появляется новый член.

TDD как парадигма проектирования: Тесты - это первые пользователи кода. Поначалу очень трудно управлять своим дизайном с помощью тестов. Но когда вы освоитесь с этим, вы поймете, что тестовый код на самом деле помогает вам принимать решения по дизайну. Это приходит само собой с некоторым опытом TDD. Например, с помощью TDD вы хотите обернуть доступ к вашему сервису в интерфейс. Это позволит вам издеваться. Но самое важное здесь то, что это правильный способ проектирования.

TDD как документация Документация для кода - документация, предназначенная для использования разработчиками вашего кода. Разработчикам легче читать хорошо написанные юнит-тесты, чем страницы и страницы документации.

2
ответ дан 3 December 2019 в 08:53
поделиться

Я просто хотел выделить:
TDD-тесты не являются модульными

«Цель модульный тест предназначен для изолированного тестирования единицы кода "
«Тест TDD, в отличие от модульного теста, может тестировать более одной единицы кода за раз». Тесты TDD - это больше тесты взаимодействия ....

из очень хорошей записи в блоге Стивена Уолтера Тесты TDD не являются модульными тестами

1
ответ дан 3 December 2019 в 08:53
поделиться

TDD также дает вам код, который полностью покрывается автоматизированными модульными тестами. Это просто потому, что код не пишется до тех пор, пока не потребуется пройти неудачный модульный тест.

0
ответ дан 3 December 2019 в 08:53
поделиться
Другие вопросы по тегам:

Похожие вопросы: