Подтвердить что ты не робот

Должен ли я практиковать "макеты" или "классическую" TDD?

Я прочитал (и перечитал) Мартин Фаулер Mocks не являются заглушками. В нем он определяет два разных подхода к TDD: "Классический" и "Мокинг" . Он пытается ответить на вопрос " Так должен ли я быть классиком или макером?, но он признает, что он никогда не пробовал макетировать TDD на" ничего больше, чем игрушки ". Поэтому я подумал, что задаю здесь вопрос. Хорошие ответы могут повторять аргументы Фаулера (но, надеюсь, более четко) или добавить аргументы, о которых он не думал, или о том, что другие придумали, поскольку Фаулер в последний раз обновлял эссе еще в январе 2007 года.

4b9b3361

Ответ 1

Я не думаю, что вам нужно выбирать один за другим. Оба имеют свои преимущества и недостатки, и оба являются инструментами для вашего инструментария. "Mockist" tdd делает вас немного более гибким в том, что вы можете проверить, в то время как классический TDD делает ваши тесты немного менее хрупкими, потому что они склонны больше смотреть на вывод ввода/вывода вместо того, чтобы смотреть на фактическую реализацию. Когда я тестирую макеты, я, кажется, испытываю больше тестов при изменении реализации.

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

Все это довольно абстрактно, поэтому я надеюсь, что имею смысл

Ответ 2

Вопрос о mockist или классическом tdd очень касается того, какую часть вашего приложения вы тестируете. Если у вас есть "стандартная" многоуровневая архитектура (например, DDD), то уровень домена обычно подходит для классического tdd, где вы unit test, настроив тестируемый объект, вызовите несколько методов и проверьте результат и/или состояние.

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

Мой совет - идти классически, когда можете и макет, когда вам нужно.

Ответ 3

Вы можете рассмотреть нашу книгу, http://www.growing-object-oriented-software.com/. Он включает расширенный обработанный пример. Как мы написали, мы обнаружили, что различие между государством и взаимодействием в значительной степени вводит в заблуждение, и это больше касается одного подхода к дизайну ОО.

Ответ 4

Сэнди Мец показал очень прагматичный подход:

Объект может общаться с другим объектом посредством исходящих или входящих сообщений. Сообщения могут быть запросами (что-то возвращает) или командами (что-то выполняет).

Есть четыре комбинации. Исходящие сообщения запроса не должны быть проверены (уже проверены как входящий запрос внешнего класса). Вы можете использовать метод проверки mockist для исходящих командных сообщений и классический тест для остальных.

enter image description here

Проверьте ссылки

http://jnoconor.github.io/blog/2013/10/07/the-magic-tricks-of-testing-by-sandi-metz/

https://speakerdeck.com/skmetz/magic-tricks-of-testing-ancientcityruby

YouTube

Ответ 5

Я все еще относительно новичок в TDD, но способ, которым меня учили/вносили различия, состоял в том, чтобы думать об этом с точки зрения тестирования интеграции между классами и чтобы вы не зависели от живых данных. Например, если у меня есть класс, который в значительной степени автономный - не зависит от других классов, которые я создал для проекта, и он не выходит в среду живых данных /dev для ввода (например, DB или API для система), тогда я бы использовал только классические модульные тесты в чем-то вроде NUnit или JUnit, но когда я начинаю тестировать взаимодействие между встроенными классами - это когда он может стать действительно удобным для подделки других пользовательских классов и/или внешнего взаимодействия, может выделять и тестировать код текущего класса, не пытаясь преследовать потенциальную ошибку в других классах, которые вы вызываете.