← Назад к вопросам

Что такое заглушки?

2.0 Middle🔥 161 комментариев
#Автоматизация тестирования

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI26 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Что такое заглушки (Stubs)

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

Определение и назначение

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

Основные характеристики заглушек

1. Простота реализации

  • Содержит минимум кода
  • Просто возвращает заранее заготовленные данные
  • Нет реальной бизнес-логики

2. Предсказуемость

  • Всегда возвращает один и тот же результат
  • Поведение известно заранее
  • Нет побочных эффектов

3. Управление зависимостями

  • Позволяет тестировать код в изоляции
  • Заменяет внешние зависимости (БД, API, файлы)
  • Решает проблему недоступности реальных сервисов

Примеры использования заглушек

Пример 1: Заглушка для базы данных

# Реальный класс
class UserRepository:
    def get_user_by_id(self, user_id):
        # Реальный запрос в БД
        return database.query(f"SELECT * FROM users WHERE id={user_id}")

# Заглушка для тестирования
class UserRepositoryStub:
    def get_user_by_id(self, user_id):
        if user_id == 1:
            return {"id": 1, "name": "John", "email": "john@example.com"}
        else:
            return None

# Использование в тесте
def test_user_profile():
    repository = UserRepositoryStub()  # Используем заглушку вместо реальной БД
    user = repository.get_user_by_id(1)
    assert user["name"] == "John"

Пример 2: Заглушка для API

# Реальный класс
class PaymentService:
    def process_payment(self, amount, card):
        # Реальный запрос к платёжному API
        response = requests.post("https://api.payment.com/charge", ...)
        return response.json()

# Заглушка для тестирования
class PaymentServiceStub:
    def process_payment(self, amount, card):
        # Всегда возвращаем успех
        return {"status": "success", "transaction_id": "TXN123"}

# Использование в тесте
def test_checkout():
    payment_service = PaymentServiceStub()  # Не делаем реальный запрос
    result = payment_service.process_payment(100, card_data)
    assert result["status"] == "success"

Пример 3: Заглушка для отправки email

# Реальный класс
class EmailService:
    def send_email(self, to, subject, body):
        # Реальная отправка через SMTP
        smtp.send_message(...)
        return True

# Заглушка для тестирования
class EmailServiceStub:
    def send_email(self, to, subject, body):
        # Имитируем успешную отправку
        return True

# Использование
def test_registration_email():
    email_service = EmailServiceStub()
    result = email_service.send_email("user@example.com", "Welcome", "...")
    assert result is True

Заглушки vs Моки (Mocks)

Эти термины часто путают, но они не одно и то же:

ПараметрStubMock
НазначениеЗамена зависимости на фиксированные данныеПроверка взаимодействия между объектами
СложностьПростаяБолее сложная
ПроверкаРезультаты (State)Вызовы методов (Behavior)
ГибкостьЖёсткие ответыМожет менять поведение
ИнструментыРучная реализация или библиотекиunittest.mock, pytest-mock

Stub отвечает на вопрос: "Какой результат я получу?" Mock отвечает на вопрос: "Был ли вызван этот метод с этими параметрами?"

Когда использовать заглушки

1. Недоступные внешние сервисы

  • API сервис находится в разработке
  • Платёжная система недоступна в dev среде
  • Third-party сервис очень медленный

2. Сложные состояния

  • Нужно тестировать редкие ошибки
  • БД в специальном состоянии
  • Гео-локация определённой страны

3. Производительность

  • Реальный запрос в БД медленный
  • API вызов занимает 5 секунд
  • Файл очень большой

4. Изоляция теста

  • Хотим проверить только один компонент
  • Не хотим зависить от других систем
  • Хотим параллельно запускать тесты

Инструменты для создания заглушек

Python:

  • unittest.mock.MagicMock — встроенное решение
  • pytest-mock — удобный плагин для pytest
  • responses — для заглушек HTTP запросов

JavaScript:

  • jest.mock() — в Jest
  • sinon.stub() — SinonJS библиотека
  • nock — для HTTP заглушек

Java:

  • Mockito — популярная библиотека
  • PowerMock — для статических методов

Лучшие практики

1. Используй заглушки для реальных зависимостей

  • БД → использовать заглушку
  • Внешний API → использовать заглушку
  • Файловая система → использовать заглушку

2. Не переусложняй

  • Заглушка должна быть проще, чем реальный объект
  • Если заглушка становится сложной → используй реальный объект

3. Документируй поведение

  • Понятные имена методов
  • Комментарии о том, что возвращает заглушка

4. Поддерживай актуальность

  • Если интерфейс изменился → обнови заглушку

Заключение

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

Что такое заглушки? | PrepBro