«Если рабочий хочет хорошо выполнять свою работу, он должен сначала заточить свои инструменты» — Конфуций, «Аналитики Конфуция. Лу Лингун»
титульная страница > программирование > Mock vs Stub: понимание ключевых различий

Mock vs Stub: понимание ключевых различий

Опубликовано 7 ноября 2024 г.
Просматривать:680

Mock vs Stub: Understanding the Key Differences
В тестировании программного обеспечения макет и заглушка — это два популярных типа тестовых двойников, используемых для моделирования зависимостей. Они помогают изолировать поведение компонента, заменяя реальные зависимости контролируемыми заменителями во время тестирования. Хотя и макеты, и заглушки служат одинаковым целям, они используются по-разному в зависимости от типа сценария тестирования.
В этой статье подробно рассматриваются ключевые различия между макетами и заглушками, варианты их использования и случаи использования каждого из них в вашей стратегии тестирования.

Что такое тестовый дубль?
Тестовый двойник — это общий термин для любого объекта или компонента, который используется для замены реальной зависимости во время тестирования. Цель состоит в том, чтобы изолировать тестируемый компонент и устранить внешние факторы, которые могут повлиять на результат теста. Моки и заглушки — это два типа тестовых двойников, часто используемые при модульном и интеграционном тестировании.

Что такое заглушка?
Заглушка — это тестовый дубль, который возвращает предопределенные данные при вызове тестируемого компонента. Обычно он используется, когда тестируемый компонент требует ввода от зависимости, но фактическое поведение зависимости не имеет отношения к результату теста. Заглушки обеспечивают контролируемые ответы, позволяя вам сосредоточиться только на логике внутри компонента.

Пример заглушки:
Допустим, вы тестируете функцию обработки платежей. Вместо вызова реального платежного шлюза вы используете заглушку, которая всегда возвращает ответ «платеж успешен», гарантируя, что логику функции можно протестировать независимо.

const paymentGatewayStub = {
  processPayment: () => "payment successful"
};

function processOrder(paymentService) {
  const result = paymentService.processPayment();
  return result === "payment successful" ? "Order Complete" : "Order Failed";
}

// Test
console.log(processOrder(paymentGatewayStub));  // Output: "Order Complete"

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

Что такое макет?
Макет — это тестовый дубль, который не только предоставляет поддельные данные, но и проверяет взаимодействие между компонентами. Моки помогают гарантировать, что правильные методы вызываются с правильными параметрами и что желаемая последовательность событий происходит во время выполнения. Обычно они используются, когда поведение или взаимодействие компонента имеет значение для теста.
Пример макета:
Используя тот же пример оплаты, предположим, вы хотите убедиться, что методprocessPayment() вызывается ровно один раз во время обработки заказа.

const paymentGatewayMock = {
  processPayment: jest.fn().mockReturnValue("payment successful")
};

function processOrder(paymentService) {
  paymentService.processPayment();  
}

// Test
processOrder(paymentGatewayMock);
expect(paymentGatewayMock.processPayment).toHaveBeenCalledTimes(1);

В этом случае макет проверяет взаимодействие, проверяя, был ли вызван метод, гарантируя, что компонент ведет себя правильно во время выполнения.
Ключевые различия между макетом и заглушкой
Заготовка макета аспекта
Цель Проверяет взаимодействие между компонентами Предоставляет заранее определенные ответы
Поведение Проверяет вызовы методов и параметры. Возвращает только статические данные
Сценарий использования Используется, когда взаимодействие имеет значение. Используется, когда вывода данных достаточно.
Сложность Сложнее реализовать Проще создать
Пример метода Test Verifying вызывает логику тестирования с фиксированными ответами

Когда использовать заглушку
• Тестирование простой логики: используйте заглушку, когда вам нужно только контролировать вывод зависимости.
• Тесты, управляемые данными. Если основное внимание уделяется тестированию того, как ваш компонент ведет себя с конкретными данными, лучше подходят заглушки.
• Пример варианта использования: если вы тестируете функцию входа в систему, для которой требуются пользовательские данные из базы данных, используйте заглушку, чтобы вернуть фиктивного пользователя без вызова реальной базы данных.
Когда использовать макет
• Тестирование на основе взаимодействия. Если основное внимание уделяется обеспечению вызова правильных методов с правильными параметрами, используйте макет.
• Тестирование сложных взаимодействий: макеты идеально подходят для компонентов, которые взаимодействуют с несколькими службами или API.
• Пример варианта использования: если вы тестируете службу отправки электронной почты, используйте макет, чтобы убедиться, что функция sendEmail() была вызвана с ожидаемым получателем и сообщением.
Можно ли использовать макеты и заглушки вместе?
Да, в некоторых случаях макеты и заглушки используются вместе в рамках одного теста для достижения как проверки взаимодействия, так и контролируемых ответов. Например, вы можете использовать заглушку для возврата определенных данных и макет для проверки того, что была вызвана определенная служба.
Плюсы и минусы моков и заглушек
Плюсы заглушек:
• Просто и легко реализовать
• Полезно для изолированного тестирования логики компонентов
Минусы заглушек:
• Невозможно проверить вызовы методов или параметры
• Ограничено статическими ответами
Плюсы моков:
• Проверяет поведение, взаимодействия и последовательности
• Полезно для сложных сценариев с множеством зависимостей
Минусы моков:
• Требует дополнительных настроек и может затруднить чтение тестов
• При неосторожном использовании тесты могут оказаться ненадежными
Mock против Stub: какой из них использовать?
• Если ваш тест зависит от выходных данных зависимости и вы хотите контролировать эти выходные данные, используйте заглушку.
• Если вам нужно убедиться, что метод был вызван, или проверить взаимодействие между компонентами, используйте макет.
• Для модульного тестирования чаще используются заглушки, поскольку основное внимание уделяется тестированию внутренней логики.
• При интеграционном тестировании макеты более полезны при проверке взаимодействия различных частей системы.

Заключение
И макеты, и заглушки играют важную роль в стратегиях тестирования, но каждый из них служит разным целям. В то время как заглушки контролируют данные, возвращаемые зависимостью, макеты гарантируют правильное взаимодействие между компонентами. Понимание того, когда и как использовать каждый из них, может улучшить качество ваших тестов, что приведет к созданию более надежного программного обеспечения. Правильно применяя макеты и заглушки, команды могут уменьшить количество ошибок, ускорить разработку и создать более эффективные стратегии тестирования как для модульных, так и для интеграционных тестов.

Заявление о выпуске Эта статья воспроизведена по адресу: https://dev.to/keploy/mock-vs-stub-understanding-the-key-differences-1e36?1. Если есть какие-либо нарушения, свяжитесь с [email protected], чтобы удалить их.
Последний учебник Более>

Изучайте китайский

Отказ от ответственности: Все предоставленные ресурсы частично взяты из Интернета. В случае нарушения ваших авторских прав или других прав и интересов, пожалуйста, объясните подробные причины и предоставьте доказательства авторских прав или прав и интересов, а затем отправьте их по электронной почте: [email protected]. Мы сделаем это за вас как можно скорее.

Copyright© 2022 湘ICP备2022001581号-3