С помощью Moq и TDD, с чего начать?

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

Какие хорошие книги я мог бы прочитать по этому вопросу, которые не слишком "ориентированы на веб-сайты"?

У меня есть вопросы по этому вопросу, например:

Должен ли я высмеивать каждый объект, который я хочу протестировать, или только те, которые я не могу реализовать, например текстовые сценарии?

Мой сервер нуждается в большой настройке, прежде чем он сможет на самом деле сделать все, что я хочу проверить, должен ли я просто вставить это в функцию [TestInitialize]?

Как мне настроить мои тесты, если я хочу проверить более глубокие функциональные возможности?

Ответ 1

Я рекомендую две книги: Test Driven Development by Example, Кент Бек. Это отличная книга о TDD, которую мне особенно нравится, потому что он просматривает пример, который очень полезен для восприятия ритма и мыслительного процесса. С другой стороны, это немного озадачивает насмешливость. Для этого я прочитал Искусство тестирования единиц Роя Ошерове. Как следует из названия, он не фокусировался конкретно на TDD, а скорее на том, как писать хорошие модульные тесты; он хорошо справляется с макетами и заглушками.

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

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

Относительно инициализации сервера: unit test обычно находится в памяти, без зависимости от среды, поэтому, если вы делаете TDD, вам, вероятно, не нужно этого делать. В общем, слишком много (любой?) Код инициализации в unit test является плохим знаком.

Это говорит о том, что вы ищете больше для приемочных тестов/тестов стиля BDD. Я излагаю эту недавнюю статью в журнале MSDN по поведенческому развитию с помощью SpecFlow и WatiN; он объясняет, как вы можете разработать в первую очередь тест, разработав вместе тесты высокого уровня, которые подтверждают, что приложение делает то, что хочет пользователь (приемочные тесты, где вы будете запускать свой фактический сервер и приложение), и что он это делает имея небольшие кусочки кода, которые выполняют то, что намеревается разработчик (модульные тесты).

Надеюсь, что это поможет, и счастливое тестирование!

Ответ 2

Вы не издеваетесь над объектами, которые хотите проверить. Если вы это сделаете, вы тестируете макет, а не ваш объект! Вы должны издеваться над зависимостями объектов, которые вы тестируете.

Ответ 3

Одна из моих любимых книг по TDD - Test Driven Development By Example (Kent Beck). Мне также очень понравился четырехчастный экран, который он сделал.

Эпизод 1: Тест на стартер (28 минут)

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

Эпизод 2: Изолированные тесты (23 минуты)

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

Эпизод 3: Большая функция (25 минут)

В этом эпизоде ​​мы берем большую функцию и нарезаем ее, чтобы обеспечить более частую обратную связь. В конце мы очищаем код, чтобы удалить дублирование и сделать код более удобным для чтения.

Эпизод 4: Отделка (20 минут)

В этом эпизоде ​​мы завершаем функциональность образца приложения и готовим его для использования другими. Дизайнерские решения, отложенные ранее в разработке, теперь более ясны. Серия закрывается с резюме уроков из всех эпизодов.

Ответ 4

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

Это краткое введение: http://www.agiledata.org/essays/tdd.html К сожалению, у меня нет никаких конкретных книг, которые я могу порекомендовать из личного опыта.

Чтение этого также может быть полезно для начала: http://stephenwalther.com/blog/archive/2008/06/12/tdd-introduction-to-moq.aspx