Назад к вопросам
Junior
140
questionbank
Что такое мокирование (mocking) в контексте тестирования?
Sobes Copilot
Получайте ответы в реальном времени
Ответ от нейросети
sobes.tech AI
Мокирование – это создание объектов-заглушек (mock objects), которые имитируют поведение реальных зависимостей тестируемого объекта. Это делается для изоляции тестируемого компонента и проверки его логики без взаимодействия с внешними подсистемами (базами данных, сетевыми сервисами и т.д.). Моки позволяют контролировать возвращаемые значения и исключения, а также проверять, как тестируемый объект взаимодействует со своими зависимостями (были ли вызваны определенные методы с определенными аргументами).
Зачем нужно мокирование:
- Изоляция: Тестируется только логика рассматриваемого компонента.
- Скорость: Мокирование зависимостей позволяет выполнять тесты быстро, без ожидания ответов от внешних сервисов.
- Надежность: Тесты не зависят от состояния внешних систем, что делает их более стабильными.
- Тестирование граничных случаев: Легко имитировать ошибки или неожидаемое поведение зависимостей.
Популярные библиотеки для мокирования в Python:
unittest.mock: Встроенный в стандартную библиотеку модуль.pytest-mock: Плагин для pytest, предоставляющий удобный фикстурmocker.
Пример использования unittest.mock:
# Исходный код
class Service:
def get_data(self):
# Запрос к внешнему сервису
pass
class Processor:
def __init__(self, service):
self._service = service
def process(self):
data = self._service.get_data()
return f"Обработано: {data}"
# Мокирование для тестирования Processor
import unittest
from unittest.mock import Mock
class TestProcessor(unittest.TestCase):
def test_process_calls_service(self):
# Создаем мок для Service
mock_service = Mock()
# Указываем, какое значение должен возвращать get_data
mock_service.get_data.return_value = "Тестовые данные"
# Создаем тестируемый объект с моком
processor = Processor(mock_service)
result = processor.process()
# Проверяем, что метод get_data был вызван
mock_service.get_data.assert_called_once()
# Проверяем результат
self.assertEqual(result, "Обработано: Тестовые данные")
if __name__ == '__main__':
unittest.main()