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