Ответ
Тестовая модель — это упрощенное представление системы или её части, используемое для проверки логики. Её создание включает:
-
Определение границ и ответственности
- Четко задайте, что модель проверяет (валидация входных данных, бизнес-правила, состояния).
-
Подготовка тестовых данных
- Используйте моки (fake objects) для замены внешних зависимостей.
- Используйте стабы (stubs) для предоставления заданных ответов.
- Генерируйте данные, покрывающие основные сценарии: валидные, граничные, невалидные.
-
Реализация и изоляция тестов
- Каждый тест должен быть независимым. Используйте методы
setUp/tearDownдля подготовки и очистки окружения. - Пример на Python с
pytestи моком:import pytest from unittest.mock import Mock
Тестируемый сервис, зависящий от внешнего API
class PaymentService: def init(self, gateway): self.gateway = gateway def process(self, amount): if amount <= 0: raise ValueError("Amount must be positive") return self.gateway.charge(amount)
def test_payment_service_success():
1. Создаем мок-объект для шлюза
mock_gateway = Mock() mock_gateway.charge.return_value = {"status": "success", "id": "tx_123"} # 2. Инжектируем мок в тестируемый сервис service = PaymentService(mock_gateway) # 3. Выполняем действие и проверяем результат result = service.process(100) assert result["status"] == "success" # 4. Проверяем, что мок был вызван с правильными аргументами mock_gateway.charge.assert_called_once_with(100)def test_payment_service_invalid_amount(): service = PaymentService(Mock()) with pytest.raises(ValueError, match="Amount must be positive"): service.process(0) # Проверка граничного/невалидного значения
**Ключевой принцип:** Модель должна быть простой, предсказуемой и полностью контролируемой в рамках теста. - Каждый тест должен быть независимым. Используйте методы