Ответ
Заглушка (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-кейсов: Легко смоделировать любые ответы от зависимости (ошибки, пустые данные, пограничные значения).