Обнаружение других объектов при выполнении TDD - PullRequest
10 голосов
/ 19 июня 2009

Я пытаюсь практиковать TDD.

Мое понимание таково, что TDD должен идти вот так

  1. Напишите список тестов для интерфейса / класса, который я собираюсь разработать.
  2. Начните с самого простого не реализованного теста из моего списка тестов.
  3. Написать тест, кода реализации пока нет.
  4. Напишите интерфейс класса для компиляции кода.
  5. Запустите тестирование, результатом которого станет один провальный тест.
  6. Напишите реализацию, делающую тестовый проход.
  7. Исправьте беспорядок, который я сделал.
  8. Перейти к 2.

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

Что должен делать настоящий TDD'r на этом этапе?

  1. Оставьте на некоторое время существующий список тестов в одиночку и создайте новый для недавно обнаруженного класса (та же проблема может проявиться при реализации нового класса)
  2. Пройдите тестирование, основанное на взаимодействии, и смоделируйте новый класс, продолжите тестовые случаи класса, над которым вы работаете, и вернитесь позже, чтобы создать правильную реализацию проверенного класса.
  3. Эта ситуация не должна представляться. Я, наверное, недостаточно хорошо продумал свой первоначальный дизайн. (но разве это не победит одну из целей TDD?!) .

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

Ответы [ 4 ]

9 голосов
/ 19 июня 2009

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

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

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

РЕДАКТИРОВАТЬ: (в ответ на комментарий). Должен ли новый класс пройти тестирование самостоятельно? Не обязательно. Это зависит от того, развивает ли класс свою значимость. Когда вы проводите модульное тестирование, вы тестируете функциональность. Это не интеграционный тест только потому, что в нем участвуют два класса. Это становится интеграционным тестом, когда два блока начинают взаимодействовать. Граница, о которой я обычно думаю, состоит в том, нужно ли мне устанавливать значимое состояние в группе классов A для взаимодействия с группой классов B, и особенно если группа классов A вызывает группу классов B и что Меня интересует, как B реагирует на A, затем я смотрю на интеграционный тест.

6 голосов
/ 19 июня 2009

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

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

Но это беспокоит тебя. Так что делать? Признайте, что делегирование другому классу является рефакторингом; это то, что нужно сделать после шага 6, во время шага 7. Как только вы добьетесь успеха, рефакторинг к лучшему дизайну. Вы уже получили тесты для нового класса; они просто звонят в оригинальный класс. Это прекрасно. После извлечения класса и делегирования, если вам удобнее, тесты вызывают напрямую извлеченный класс: сделайте это. Никакого вреда. Если извлеченный класс начинает использоваться другими вызывающими программами, я бы порекомендовал его, и, возможно, когда вы начнете вызывать его из других классов, самое время это сделать (но если он вас сейчас не устраивает, сделайте это сейчас). *

2 голосов
/ 19 июня 2009

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

1 голос
/ 19 июня 2009

Вы должны создать фиктивный класс. Единый интерфейс с предсказуемыми результатами. Таким образом, вы можете проверить оригинал.

Позже вы можете повторить процедуру с новым классом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...