Как отмечается в ответе, получившем наибольшее количество голосов, Мартин Фаулер обсуждает эти различия в Насмешки не являются заглушками , и, в частности, подзаголовок Разница между заглушками и заглушками , поэтому сделайте Обязательно прочитайте эту статью.
Вместо того, чтобы фокусироваться на , как эти вещи отличаются, я думаю, что более поучительно сосредоточиться на , почему это разные понятия. Каждый существует для другой цели.
Подделки
A fake - это реализация, которая ведет себя "естественно", но не является "реальной". Это нечеткие понятия, и поэтому разные люди по-разному понимают, что делает вещи фальшивыми.
Одним из примеров подделки является база данных в памяти (например, использование sqlite с хранилищем :memory:
). Вы никогда не будете использовать это для производства (так как данные не сохраняются), но это совершенно адекватно в качестве базы данных для использования в среде тестирования. Это также намного легче, чем «настоящая» база данных.
В качестве другого примера, возможно, вы используете какое-то хранилище объектов (например, Amazon S3) в производстве, но в тесте вы можете просто сохранять объекты в файлы на диске; тогда ваша реализация "сохранить на диск" будет подделкой. (Или вы можете даже подделать операцию «сохранить на диск», используя вместо этого файловую систему в памяти.)
В качестве третьего примера представьте объект, который предоставляет API кеша; объект, который реализует правильный интерфейс, но который просто не выполняет никакого кэширования, но всегда возвращает ошибку кэша, был бы своего рода подделкой.
Цель подделки состоит в том, чтобы не влиять на поведение тестируемой системы , а, скорее, упростить реализацию теста (удалив ненужные или тяжелые зависимости).
Заглушки
A stub - это реализация, которая ведет себя "неестественно". Он предварительно сконфигурирован (обычно тестовой установкой) для ответа на конкретные входы с конкретными выходами.
Цель заглушки - привести тестируемую систему в определенное состояние. Например, если вы пишете тест для некоторого кода, взаимодействующего с REST API, вы можете заглушить API REST с API, который всегда возвращает постоянный ответ или отвечает на запрос API с определенной ошибкой. Таким образом, вы могли бы написать тесты, которые утверждают, как система реагирует на эти состояния; например, тестирование ответа, который получают ваши пользователи, если API возвращает ошибку 404.
Заглушка, как правило, реализуется, чтобы отвечать только на те взаимодействия, о которых вы сказали, что она отвечает. Но ключевой особенностью, которая делает заглушку, является ее цель : заглушка - это все, что нужно для настройки тестового примера.
* * Mocks тысячи сорок-девять
A макет аналогичен заглушке, но с добавленной проверкой . Цель макета - сделать утверждения о том, как тестируемая система взаимодействовала с зависимость .
Например, если вы пишете тест для системы, которая загружает файлы на веб-сайт, вы можете создать макет , который принимает файл и который можно использовать для подтверждения правильности загруженного файла. , Или, в меньшем масштабе, обычно используют макет объекта для проверки того, что тестируемая система вызывает определенные методы макетируемого объекта.
Моды привязаны к интерактивному тестированию , которое является специальной методологией тестирования. Люди, которые предпочитают проверять состояние системы , а не системные взаимодействия , будут редко использовать макеты, если вообще будут.
Тест удваивается
Подделки, заглушки и макеты все относятся к категории двойников теста . Двойной тест - это любой объект или система, которую вы используете в тесте вместо чего-то еще. В большинстве случаев автоматизированное тестирование программного обеспечения предполагает использование тестовых двойников того или иного типа. Некоторые другие виды двойных тестов включают фиктивные значения , шпионы и I / O черные дыры .