Как вы поддерживаете дисциплину при выполнении TDD?

Когда я волнуюсь о новой функции, которую я собираюсь внедрить или о ошибке, которую я просто "понял", есть желание просто перейти в код и получить хакерство. Требуется некоторое усилие, чтобы остановить себя от этого и сначала написать соответствующий тест. Позже тест часто оказывается тривиальным 4-лайнером, но перед тем, как писать его еще там, мысль в голове: "Может быть, я могу пропустить этот, этот раз?" В идеале я хотел бы получить желание написать тест, и только тогда, возможно, код:)

Какой метод (или способ мышления или трюк ума или политика самообслуживания или что-то еще) вы используете для поддержания дисциплины? Или вы просто практикуете это, пока не почувствуете себя естественным?

Ответ 1

Мне нравится мгновенная обратная связь от теста, эта награда для меня достаточно. Если я могу воспроизвести ошибку в тесте, что хорошее чувство, я знаю, что я возглавляю в правильном направлении, а не угадывать и, возможно, тратить время.

Мне нравится работать с Test-First, потому что я чувствую, что он держит меня в большей степени, чем то, что на самом деле делает код, а не угадывание на основе, возможно, неточной модели ума. Возможность подтвердить мои предположения итеративно - большой выигрыш для меня.

Ответ 2

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

Ответ 3

Я сообщу вам, когда найду способ, который работает.: -)

Но серьезно, я думаю, что ваша "практика, пока она не станет естественной", комментарий почти не ударит ноготь по голове. Тест с четырьмя строками может показаться тривиальным, но пока тестируемое значение представляет собой реальную точку отказа, это стоит сделать.

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

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

Ответ 4

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

Кроме того, попробуйте сосредоточиться на взаимодействии или поведенческом тестировании, а не на государственном тестировании.

Ответ 6

1) Вы играете с кем-то еще в своей команде. Один человек пишет тест, а другой реализует.

Он называется спариванием пинг-понга.

Выполнение этого заставит вас обсудить дизайн и разработать, что делать.

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

2) Когда я работаю самостоятельно, мне нравится анализировать фрагменты кода в интерактивном режиме. Я просто набираю их в подсказке ruby. Когда я так экспериментирую, мне часто приходится настраивать некоторые данные для экспериментов, а также некоторые заявления распечатки, чтобы увидеть результат.

Эти небольшие, автономные эксперименты с выбросом обычно:

  • быстрый способ установить осуществимость реализации и
  • Хорошее место, чтобы начать оформление теста.

Ответ 7

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

Если вам нужно добавить тест, вам нужно сначала создать тестовый проект, а затем определить, как изолировать компоненты, когда имитировать вещи и т.д., и т.д. он попадает в слишком жесткую корзину.

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

Ответ 8

Когда я впервые начал делать TDD около 2000 года, это было очень неестественно. Затем появилась первая версия .net и порт JUnit NUnit, и я начал практиковать TDD на уровне Shu (Shu-Ha-Ri), что означало испытание (сначала) все, с теми же вопросами, что и ваши.

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

Теперь, на другом рабочем месте вместе с еще одним великим коллегой, я чувствую, что мы делаем первые шаги к уровню Ri. Для нас это в настоящее время означает большой акцент на BDD/исполняемые истории. Когда те, кто находится на месте, проверяют требования на более высоком уровне, я чувствую себя более продуктивным, так как мне не нужно (переписывать) кучу единичных тестов каждый раз, когда необходимо изменить общий интерфейс класса, заменить статический вызов на метод расширения и т.д.

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