Что такое заглушка (stub) в тестировании и приведи пример

«Что такое заглушка (stub) в тестировании и приведи пример» — вопрос из категории API тестирование, который задают на 10% собеседований QA Тестировщик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Заглушка (Stub) — это тестовый двойник (test double), который заменяет реальный зависимый компонент, предоставляя заранее заданные, жестко запрограммированные ответы на вызовы во время теста.

Цель: Изолировать тестируемый модуль от его зависимостей, чтобы тестировать его логику в контролируемом окружении.

Пример: Тестирование сервиса погоды, зависящего от внешнего API

Реальный код сервиса:

import requests

class WeatherService:
    def __init__(self, api_client):
        self.api_client = api_client  # Зависимость для HTTP-запросов

    def get_temperature(self, city: str) -> float:
        """Возвращает температуру для заданного города."""
        # Реальный вызов внешнего API
        response = self.api_client.get(f"https://api.weather.example.com/data/{city}")
        data = response.json()
        return data['current']['temp_c']

Тест с использованием заглушки:

import unittest

# Заглушка для HTTP-клиента
class StubApiClient:
    """Stub имитирует поведение реального API-клиента, всегда возвращая фиктивные данные."""
    def get(self, url: str):
        # Игнорируем URL и всегда возвращаем один и тот же фиктивный ответ
        class MockResponse:
            @staticmethod
            def json():
                return {
                    'current': {
                        'temp_c': 25.5,
                        'condition': {'text': 'Sunny'}
                    }
                }
        return MockResponse()

class TestWeatherService(unittest.TestCase):
    def test_get_temperature_returns_correct_value(self):
        # 1. ARRANGE: Создаем экземпляр сервиса, передавая ему заглушку
        stub_client = StubApiClient()
        service = WeatherService(stub_client)

        # 2. ACT: Вызываем тестируемый метод
        result = service.get_temperature("Moscow")

        # 3. ASSERT: Проверяем, что метод корректно обработал данные от заглушки
        self.assertEqual(result, 25.5)

# Тест будет проходить всегда, независимо от доступности реального API weather.example.com

Ключевые преимущества использования заглушек:

  • Изоляция: Тест падает только если есть ошибка в логике WeatherService, а не в сетевом соединении или внешнем API.
  • Скорость: Отсутствие сетевых запросов делает тесты мгновенными.
  • Стабильность: Результаты теста предсказуемы и не зависят от изменений во внешней системе.
  • Тестирование edge-кейсов: Легко смоделировать любые ответы от зависимости (ошибки, пустые данные, пограничные значения).