Что значит «заглушить» в программировании?


118

Например, что это значит в этой цитате?

Интеграция с внешним API - это почти гарантия любого современного веб-приложения. Чтобы эффективно протестировать такую ​​интеграцию, вам нужно заглушить ее. Хорошую заглушку должно быть легко создать, и она должна постоянно обновляться с учетом актуальных ответов API. В этом посте мы опишем стратегию тестирования с использованием заглушек для внешнего API.


9
Вы ознакомились с принятым ответом в разделе Что такое «заглушка»? ?
Ник

Ответы:


104

Заглушка - это управляемая замена существующей зависимости (или сотрудника) в системе. Используя заглушку, вы можете протестировать свой код, не обращаясь напрямую к зависимости.

Внешняя зависимость - существующая зависимость:
это объект в вашей системе, с которым ваш тестируемый код взаимодействует и над которым вы не можете контролировать. (Общие примеры - файловые системы, потоки, память, время и т. Д.)

Например, в коде ниже:

public void Analyze(string filename)
    {
        if(filename.Length<8)
        {
            try
            {
                errorService.LogError("long file entered named:" + filename);
            }
            catch (Exception e)
            {
                mailService.SendEMail("admin@hotmail.com", "ErrorOnWebService", "someerror");
            }
        }
    }

Вы хотите протестировать метод mailService.SendEMail () , но для этого вам нужно смоделировать исключение в вашем тестовом методе, поэтому вам просто нужно создать объект Fake Stub errorService для имитации желаемого результата, тогда ваш тестовый код будет возможность протестировать метод mailService.SendEMail () . Как видите, вам нужно смоделировать результат, полученный от другой зависимости, которая является объектом класса ErrorService (существующий объект зависимости).


9
Английский? Что такое существующая зависимость?
Jwan622

17
@ Jwan622 Проще говоря: все, что используется в коде. Это может помочь понять, если вы перечитаете и замените «зависимость» на «класс» или «функцию» или что-то еще (в зависимости от вашего опыта). Иногда использование существующего класса / функции не является жизнеспособным вариантом, и вам нужна заглушка (например, при автоматическом модульном тестировании для функций, которые зависят от среды, такой как текущая дата и время системы).
MasterMastic

101

Окурка , в этом контексте означает макет реализации.

То есть простая поддельная реализация, соответствующая интерфейсу и предназначенная для тестирования.


3
Более подробная информация представлена ​​в известной статье Мартина Фаулера « Mocks Aren't Stubs» : «Но очень часто я вижу, что макетные объекты описываются плохо. В частности, я вижу, что их часто путают с заглушками - обычным помощником для сред тестирования».
pba 01

61

По словам непрофессионала, это фиктивные данные (или поддельные данные, тестовые данные и т. Д.), Которые вы можете использовать для тестирования или разработки своего кода, пока вы (или другая сторона) не будете готовы представить / получить реальные данные. Это программистский "Lorem Ipsum".

База данных сотрудников не готова? Придумайте простой вариант с Джейн Доу, Джоном Доу ... и т. Д. API не готов? Создайте поддельный, создав статический файл .json, содержащий поддельные данные.


1
Спасибо за пример :)
CapturedTree

8

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

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

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

Наиболее известные виды заглушек, очевидно, предназначены для распределенного программирования, когда необходимо вызывать удаленные процедуры ( RPC ) или удаленные объекты ( RMI , CORBA ). Большинство фреймворков / библиотек распределенного программирования автоматизируют создание заглушек, поэтому вам не нужно писать их вручную. Заглушки можно сгенерировать из определения интерфейса, написанного, например, с помощью IDL (но вы также можете использовать любой язык для определения интерфейсов).

Обычно в RPC, RMI, CORBA и т. Д. Различают заглушки на стороне клиента , которые в основном заботятся о маршалинге / сериализации аргументов и выполнении удаленного вызова, и заглушки на стороне сервера , которые в основном заботятся о демаршалинге / десериализации. аргументы и фактически выполнить удаленную функцию / метод. Очевидно, что клиентские заглушки расположены на стороне клиента, а заглушки серверов (часто называемые скелетами) расположены на стороне сервера.

Написание хороших эффективных и универсальных заглушек становится довольно сложной задачей при работе со ссылками на объекты. Большинство сред распределенных объектов, таких как RMI и CORBA, имеют дело со ссылками на распределенные объекты, но большинство программистов этого избегают, например, в средах REST. Обычно в средах REST программисты JavaScript создают простые функции-заглушки для инкапсуляции вызовов AJAX (сериализация объектов поддерживается с помощью JSON.parseи JSON.stringify). Проект Swagger Codegen предоставляет обширную поддержку для автоматического создания заглушек REST на различных языках.


4

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

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


3

У вас также есть очень хорошая среда тестирования для создания такой заглушки. Один из моих предпочтительных - Mockito. Также есть EasyMock и другие ... Но Mockito великолепен, вы должны его прочитать - очень элегантный и мощный пакет.


3

Эта фраза почти наверняка является аналогией с этапом строительства дома - «зачисткой» водопровода. Во время строительства, пока стены еще открыты, кладут черновую сантехнику. Это необходимо для продолжения строительства. Затем, когда все вокруг готово, каждый возвращается и добавляет смесители, туалеты и сам конечный продукт. (См., Например, Как установить заглушку для водопровода .)

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


0

Заглушки RPC

  • По сути, заглушка на стороне клиента - это процедура, которая выглядит для клиента так, как если бы это была вызываемая серверная процедура.
  • Заглушка на стороне сервера смотрит на сервер как на вызывающего клиента.
  • Клиентская программа думает, что она вызывает сервер; фактически, он вызывает заглушку клиента.
  • Серверная программа думает, что вызывается клиентом; фактически, он вызывается заглушкой сервера.
  • Заглушки отправляют друг другу сообщения, чтобы выполнить RPC.

Источник


0

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

От: SAMS Научитесь C ++, Джесси Либерти и Брэдли Джонс

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.