Что не так с Stubs для модульного тестирования?

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

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

Я нахожусь в мире, когда-то ранен, выбрал рукописные заглушки и подделки вместо издевок (например, Rhinomock и т.д.)? (с использованием таксономии Фаулера)

Каковы соображения для выбора между макетным и рукописным заглушками?

Ответы

Ответ 1

В пеньках нет ничего плохого, есть место для пней, насмешек... и шпионов. Все они - "двойники теста", но с разными целями, как объяснено в Мотах, и Заглушки не шпионы:

[...] Прежде чем двигаться дальше, я хотел бы уточнить и определить некоторые используемые здесь термины, которые я впервые обнаружил в книге Джерарда Месароса " Шаблоны xUnit".

  • Пустой объект - это объект-заполнитель, который передается в тестируемую систему, но никогда не используется.
  • Test Stub предоставляет тестируемой системе косвенный ввод
  • Тестовый шпион предоставляет способ проверить, что тестируемая система выполнила правильный косвенный вывод
  • Mock Object предоставляет тестируемой системе как косвенный ввод, так и способ проверки косвенного вывода

[...] И вы можете позволить этой удобной диаграмме направлять ваши решения:

alt text

PS: Mockito - Новая Mock Framework на Блоке тоже стоит того, чтобы ее прочитать.

Ответ 2

Я использую следующую терминологию (введенный Роем Ошеровым, автором Искусства Unit-Testing):

Подделка называется заглушкой, если вы скажете ей подделать что-то в случае вызова метода с такими и такими параметрами. Но если вы также убедитесь, что такой звонок действительно имел место или имел место ровно N раз, то такая подделка называется макетом. Вкратце. подделка является заглушкой, если вы не вызываете Verify() на ней, а затем это макет.

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

Если вы еще не начали использовать насмешливую структуру (альтернативный термин: структура изоляции), вы должны следить за ними и часто пересматривать свои варианты. Я очень быстро перешел от ручных макетов к NMock2 в Moq. Здесь интересный poll программистов, который показывает, что они используют. Ручные макеты/заглушки находятся в меньшинстве, но это не так уж редко.

Ответ 3

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

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

Сколько шаблонов вы получите, когда закончите класс? Как вы справляетесь с этим, если ваш класс является окончательным? Вы играете в трюки, чтобы сначала получить свой заглушку на пути к классу или использовать другой источник?

Я рекомендую только начинать с макетов - все проще вокруг.

Ответ 4

Нет ничего плохого в использовании заглушек вместо mocks.

Если вы хотите получить техническую информацию, mocks - это "умные" объекты с ожиданиями, которые можно проверить. Stub - это фиктивные объекты, которые возвращают заданные значения. См. Mocks не являются заглушками.

Но многие люди (включая меня) предпочитают проводить тестирование состояния с помощью заглушек, а не тестирование поведения с помощью mocks. Вы вводите заглушку в тестируемый класс, вы вызываете метод, затем проверяете состояние тестируемого класса. Он имеет тенденцию делать менее хрупкие тесты, чем утверждать, что внутренние элементы класса называются методом X макетного объекта с аргументом Y.

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

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

Мне нравится Moq; Мне легче использовать, чем Rhino Mocks для создания заглушек.

Ответ 5

Моски и заглушки используются для достижения реального unit test. Вы просто издеваетесь над всеми зависимостями и unit test своим классом изолированно.

В настоящее время я использую MOQ для насмешек и stubbing.