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

Зачем мне нужна насмешливая основа для моих unittests?

В последнее время вокруг всех разных насмешливых фреймворков в мире .NET довольно много шумихи. Я до сих пор не совсем понял, что в них такого хорошего. Кажется, не трудно писать смешные предметы, в которых я нуждаюсь. Особенно с помощью Visual Studio я быстро могу написать класс, который реализует интерфейс, который я хочу высмеять (он автоматически генерирует почти все для меня), а затем написал реализацию для метода (ов), который мне нужен для моего теста. Готово! Зачем испытывать трудности в понимании насмешливой структуры с единственной целью сохранения нескольких строк кода. Или это насмешливая структура не только о сохранении строк кода?

4b9b3361

Ответ 1

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

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

Ответ 2

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

Что вы будете делать, если вы тестируете ICustomerDAO, например, и хотите протестировать один из методов по 14 раз с разными результатами? Внесите 14 различных классов вручную? Я сомневаюсь, что кто-то захочет это сделать.

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

Это отличный инструмент для тестирования единиц.

Ответ 3

Предыдущие вопросы, которые могут помочь:
Что такое макет и когда вы его используете?
Mockist против классического TDD

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

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

Ответ 4

Рой Ошероув провел опрос о Mock Frameworks и ниже в разделе комментариев, есть обсуждение (хотя и краткое) о том, нужно ли Рамочная структура или нет.

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

Ответ 5

Ну, я, конечно, не думаю, что вам НУЖНА насмешливая структура. Это структура, как и любая другая, и в конечном итоге она предназначена для экономии времени и усилий. Вы также можете делать такие вещи, как сворачивать свои общие структуры данных, такие как стеки и очереди, но не проще ли просто использовать те, которые встроены в библиотеки классов, которые поставляются с компилятором/средой выбора вашего языка?

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

Ответ 6

По этой же причине вы не будете пытаться писать модульные тесты без NUnit. Издевательская структура поможет вам в проверке состояния и поведения в течение сотен модульных тестов. Это стоит 2 недели или около того, чтобы получить максимальную скорость и действительно поможет вам сосредоточиться на том, что нужно протестировать.

Ответ 7

Одна вещь, которая беспокоит меня насчет насмешливой структуры, заключается в том, что "какая функция должна выполнять o/p при i/p" через

, когда (mock.someMethod( "some arg" )). thenReturn ( "something" );

Оператор

распространяется во многих классах unit test.

Позвольте мне подробно остановиться на примере. Допустим, что была функция DAO Interface getEmp (int EmpID), которая возвращала объект Employee при передаче идентификатора Employee в качестве параметра. Предположим, что эту функцию высмеивали 10 различных классов unit test. Теперь, если в будущем эта функция была изменена для возврата более новой версии объекта Employee, нужно было бы перейти к каждому из 10 разных классов, чтобы обновить это изменение.

Недостатки следующие:

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

b) Мои существующие тестовые примеры, которые потребляют макет DAO-объекта, продолжают блаженно не знать об изменениях, произошедших с интерфейсом DAO, поскольку макет не изменился и, следовательно, продолжает оставаться зеленым. В идеале, если бы я сам закодировал один макет-класс и использовал его везде, у меня было бы только одно место для обновления для новой версии объекта Employee. Кроме того, как только я обновляюсь на этом одном месте, все мои существующие тестовые примеры, которые потребляют макет, сломаются, и я тогда точно знаю, в каких местах мне нужно идти, и делать обновление для нового объекта Employee.

Любые мысли о моих взглядах.

Ответ 8

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

Ответ 9

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

Ответ 10

Я использую носороги для насмешек. Я и 5 других разработчиков использовали его на большом корпоративном приложении, которое было 8-месячным проектом. Мы использовали tdd для проекта. Стоило ли? Я полагаю. Была ли такая огромная огромная точка продажи для использования макетов, которые я должен использовать в каждом проекте? По-моему, нет. Это не то, что необходимо, это просто инструмент, который вы можете использовать, если хотите попробовать. В некоторых проектах вы можете развернуть свои собственные макеты, поскольку некоторые из них говорят, что они предпочитают - это проще. Другие проекты больше и могут потребовать насмешливую структуру. Ключевое слово (на мой взгляд) МОЖЕТ потребовать... сколько покрытия кода вам нужно? Для меня это еще одно соображение для использования макетов. Проект, который я сделал с tdd/rhino mocks, должен был иметь 80% -ный охват кода, поэтому макеты помогли нам достичь этого. Если бы требования к покрытию кода были меньше, например 40%, мы, вероятно, не использовали бы насмешливую структуру и просто писали наши собственные макеты, как говорят другие.