Мокинг – это мощный метод тестирования программного обеспечения, который позволяет нам заменять определенные функции или моделировать определенное поведение в целях контролируемого тестирования. В этой статье мы рассмотрим различные методы имитации встроенных функций и имитации пользовательского ввода во время модульного тестирования с использованием платформы Python pytest. Мы предоставим примеры кода для каждого метода, чтобы помочь вам понять и реализовать их в своих проектах.
- Monkeypatching:
Monkeypatching — это метод, используемый для изменения или замены существующих атрибутов или функций во время выполнения. В pytest приспособлениеmonkeypatch
предоставляет удобный способ имитировать встроенные функции. Вот пример издевательства над функциейinput()
:
def test_mock_input(monkeypatch):
monkeypatch.setattr('builtins.input', lambda _: 'mocked input')
# Test code that uses input()
...
- Издевательство с помощью MagicMock:
КлассMagicMock
из модуляunittest.mock
можно использовать для создания макетов объектов с настраиваемым поведением. Вот пример издевательства над функциейopen()
:
from unittest.mock import MagicMock
def test_mock_open():
mock_open = MagicMock()
mock_open.return_value.read.return_value = 'mocked file content'
with monkeypatch.context() as m:
m.setattr('builtins.open', mock_open)
# Test code that uses open()
...
- Исправление с помощью patch():
Декораторpatch()
из модуляunittest.mock
позволяет нам временно заменить функцию или атрибут во время выполнения теста. Вот пример издевательства над функциейtime.sleep()
:
from unittest.mock import patch
def test_mock_sleep():
with patch('time.sleep') as mock_sleep:
# Configure the behavior of mock_sleep
mock_sleep.side_effect = None # No sleep delay
# Test code that uses time.sleep()
...
- Создание пользовательского макета.
Если ни один из вышеперечисленных методов не соответствует вашим потребностям, вы можете создать собственный макетный класс, создав подклассMagicMock
и определив желаемое поведение. Вот пример пользовательского макета, который всегда возвращает определенное значение при вызове:
from unittest.mock import MagicMock
class CustomMock(MagicMock):
def __call__(self, *args, kwargs):
return 'mocked value'
def test_custom_mock():
custom_mock = CustomMock()
with monkeypatch.context() as m:
m.setattr('module_to_mock.function_to_mock', custom_mock)
# Test code that uses the mocked function
...
В этой статье мы рассмотрели несколько методов имитации встроенных функций и имитации пользовательского ввода во время модульного тестирования с использованием Python pytest. Эти методы обеспечивают гибкость и контроль над сценариями тестирования, позволяя вам тщательно тестировать поведение вашего кода. Эффективно имитируя эти функции, вы можете изолировать определенные компоненты и гарантировать их корректность. Включение этих методов в рабочий процесс тестирования повысит надежность и удобство сопровождения ваших приложений Python.