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