Що означає "заглушити" в програмуванні?


117

Наприклад, що це означає в цій цитаті?

Інтеграція із зовнішнім 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

61

Умови Леймана - це фіктивні дані (або підроблені дані, дані тестів ... тощо), які ви можете використовувати для тестування або розробки свого коду до тих пір, поки ви (або інша сторона) не будете готові представити / отримати реальні дані. Це програміст "Lorem Ipsum".

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


1
Дякую за приклад :)
CapturedTree

8

У цьому контексті слово "заглушка" вживається замість "глузування", але задля ясності та точності автор мав би вживати "глузування", бо "макет" є свого роду заглушкою, але для тестування. Щоб уникнути подальшої плутанини, нам потрібно визначити, що таке заглушка.

У загальному контексті заглушка - це частина програми (як правило, це функція або об'єкт), яка інкапсулює складність виклику іншої програми (як правило, розміщеної на іншій машині, VM чи процесі), але не завжди це також може бути локальною об’єкт). Оскільки фактична програма для виклику зазвичай не розташована в одному просторі пам’яті, для виклику її потрібно багато операцій, таких як адресація, виконання фактичного віддаленого виклику, маршанг / серіалізація даних / аргументів, що передаються (і те саме з потенційним результатом), можливо навіть мати справу з автентифікацією / безпекою тощо. Зауважте, що в деяких контекстах заглушки також називають проксі-серверами (наприклад, динамічними проксі-серверами на Java).

Макет - це дуже специфічний і обмежувальний вид заглушки, тому що макет є заміною іншої функції або об’єкта для тестування. На практиці ми часто використовуємо макети як локальні програми (функції або об'єкти) для заміни віддаленої програми в тестовому середовищі. У будь-якому випадку макет може імітувати фактичну поведінку заміненої програми в обмеженому контексті.

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

Як правило, в RPC, RMI, CORBA і так далі виокремлюють заглушки на стороні клієнта , які в основному піклуються про маршалінг / серіалізацію аргументів та виконання віддаленого виклику, і заглушки на стороні сервера , які в основному дбають про зняття / десериалізацію аргументи і фактично виконують віддалену функцію / метод. Очевидно, клієнтські заглушки розташовані на стороні клієнта, тоді як штрихові клітинки (часто їх називають скелетами) розташовані на стороні сервера.

Написання хороших ефективних та загальних заглушок стає досить складною справою з посиланнями на об'єкти. Більшість розподілених об'єктних каркасів, таких як RMI та CORBA, мають справу з розподіленими посиланнями на об'єкти, але саме цього більшість програмістів уникає, наприклад, у середовищах REST. Як правило, в середовищах REST програмісти JavaScript виконують прості функції заглушки, щоб інкапсулювати виклики AJAX (серіалізація об'єктів підтримується JSON.parseі JSON.stringify). Проект Swagger Codegen надає широку підтримку автоматичного генерування заглушок REST на різних мовах.


4

Stub - це визначення функції, яке має правильну назву функції, правильну кількість параметрів і створює фіктивний результат правильного типу.

Це допомагає написати тест і служить своєрідним риштуванням, щоб можна було запускати приклади ще до того, як буде завершено дизайн функції


3

У вас також є дуже хороші рамки тестування, щоб створити таку заглушку. Один з моїх переваг - Mockito. Є також EasyMock та інші ... Але Mockito чудово, що ви повинні його прочитати - дуже елегантний і потужний пакет


3

Ця фраза майже напевно є аналогією з фазою будівництва будинку - «заглушкою» сантехніки. Під час будівництва, поки стіни ще відкриті, прокладається груба сантехніка. Це необхідно для продовження будівництва. Потім, коли все навколо буде достатньо готове, повертається і додає змішувачі та туалети та фактичні речі з кінцевим продуктом. (Див. Наприклад, Як встановити заглушку сантехніки .)

Коли ви «заглушуєте» функцію в програмуванні, ви збираєте її достатньо, щоб обійтися (для тестування або для написання іншого коду). Потім ви повернетесь пізніше і заміните його на повну реалізацію.


0

RPC Stubs

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

Джерело


0

"Заглушення функції означає, що ви будете писати достатньо лише, щоб показати, що функція викликалася, залишаючи деталі для подальшого, коли у вас буде більше часу."

Від: SAMS Навчіть себе C ++, Джессі Ліберті та Бредлі Джонс

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.