В чем разница между макетом и заглушкой? - PullRequest
817 голосов
/ 11 августа 2010

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

Ответы [ 35 ]

757 голосов
/ 23 июля 2013

Предисловие

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

Ссылка

Согласнона статья Мартина Фаулера :

  • Макетные объекты передаются, но фактически никогда не используются.Обычно они просто используются для заполнения списков параметров.
  • Поддельные объекты на самом деле имеют рабочие реализации, но обычно используют некоторые ярлыки, которые делают их непригодными для производства (хороший пример - база данных в памяти)).
  • Заглушки обеспечивают постоянные ответы на вызовы, сделанные во время теста, обычно вообще не реагируя ни на что, кроме того, что запрограммировано для теста.Заглушки могут также записывать информацию о вызовах, такую ​​как заглушка шлюза электронной почты, которая запоминает сообщения, которые она «отправила», или, возможно, только сколько сообщений она «отправила».
  • Насмешки - это то, что мыречь идет здесь: объекты, предварительно запрограммированные с ожиданиями, которые формируют спецификацию вызовов, которые они ожидают получить.

Стиль

Насмешки против заглушек = Поведенческое тестирование противГосударственное тестирование

Принцип

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

Жизненный цикл

Жизненный цикл теста с заглушками:

  1. Настройка - подготовка тестируемого объекта и его сотрудников-коллабораторов.
  2. Упражнение - Проверкафункциональность.
  3. Проверка состояния - используйте подтверждения для проверки состояния объекта.
  4. Разрушение - Очистка ресурсов.

Проверка жизненного цикла с помощью макетов:

  1. Данные настройки- Подготовьте объект, который тестируется.
  2. Ожидания установки - Подготовьте ожидания в макете, который используется основным объектом.
  3. Упражнение - Проверьте функциональность.
  4. Проверка ожиданий - Проверка того, что в макете были вызваны правильные методы.
  5. Проверка состояния - Использование утверждений для проверки состояния объекта.
  6. Разрыв - Очистка ресурсов.

Сводка

Как тесты, так и заглушки дают ответ на вопрос: Каков результат?

Тестирование с макетами также интересует: Как был достигнут результат?

643 голосов
/ 11 августа 2010

Заглушка

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

Макет

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

Разница между мобами и заглушками

Тесты, написанные с помощью мотовобычно следуйте шаблону initialize -> set expectations -> exercise -> verify для тестирования.В то время как предварительно написанная заглушка будет следовать за initialize -> exercise -> verify.

Сходство между Mocks и Stubs

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

291 голосов
/ 11 августа 2010

Заглушка - это простой поддельный объект. Это просто гарантирует, что тест проходит гладко.
Насмешка - умная заглушка. Вы подтверждаете, что ваш тест проходит через него.

212 голосов
/ 26 ноября 2014

Вот описание каждого из них, за которым следует пример из реального мира.

  • Dummy - просто фиктивные значения для удовлетворения API.

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

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

    Пример : Создать ложную реализацию для доступа к базе данных, заменить ее на in-memory collection.

  • Stub - переопределить методы для возврата жестко закодированных значений, также называемых state-based.

    Пример : Ваш тестовый класс зависит от метода Calculate(), который занимает 5 минут. Вместо того, чтобы ждать 5 минут, вы можете заменить его реальную реализацию заглушкой, которая возвращает жестко закодированные значения; занимая лишь небольшую долю времени.

  • Макет - очень похоже на Stub, но interaction-based, а не на основе состояния. Это означает, что вы не ожидаете от Mock возврата какого-либо значения, но предполагаете, что выполняется определенный порядок вызовов методов.

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

Stubs и Mocks на самом деле являются подтипами Mock, оба заменяют реальную реализацию на реализацию теста, но по разным, специфическим причинам.

162 голосов
/ 05 июля 2012

В курсе codeschool.com , Тестирование Rails для зомби они дают следующее определение терминов:

Сто

Для замены метода кодом, возвращающим указанный результат.

Ложная

Заглушка с утверждением, что метод вызывается.

Так, как Шон Копенхейвер описал в своем ответе, разница в том, что насмешки устанавливают ожидания (то есть делают утверждения, о том, как их вызывают или как)

124 голосов
/ 19 апреля 2012

Заглушки не проваливаются в ваших тестах, макет может.

30 голосов
/ 24 августа 2015

Я думаю, что самый простой и ясный ответ на этот вопрос дан от Роя Ошерова в его книге Искусство юнит-тестирования (стр. 85)

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

С другой стороны, тест будет использовать фиктивный объект, чтобы проверить, провалился ли тест или нет.[...]

Опять же, фиктивный объект - это объект, который мы используем, чтобы увидеть, провалился ли тест.

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

25 голосов
/ 25 ноября 2014

Читая все объяснения, приведенные выше, я попытаюсь сжать:

  • Stub : фиктивный кусок кода, который позволяет запустить тест, но вам все равно, что с ним происходит.
  • Макет : фиктивный фрагмент кода, который вы ПРОВЕРЯЕТЕ, правильно вызывается как часть теста.
  • Spy : фиктивный фрагмент кода, который перехватывает некоторые вызовы реального фрагмента кода, позволяя вам проверять вызовы без замены всего исходного объекта.
21 голосов
/ 11 августа 2010

Mock - это просто тестирование поведения, проверка того, что определенные методы вызваны. Stub - это тестируемая версия (как таковая) конкретного объекта.

Что ты имеешь в виду под Apple?

19 голосов
/ 08 ноября 2013

Если сравнить его с отладкой:

Заглушка - это все равно что убедиться, что метод возвращает правильное значение

Макет как на самом деле вход в метод и проверка правильности всего внутри, прежде чем возвращать правильное значение.

...