Комплексное руководство по имитации встроенных функций и пользовательскому вводу в Python pytest

Мокинг – это мощный метод тестирования программного обеспечения, который позволяет нам заменять определенные функции или моделировать определенное поведение в целях контролируемого тестирования. В этой статье мы рассмотрим различные методы имитации встроенных функций и имитации пользовательского ввода во время модульного тестирования с использованием платформы Python pytest. Мы предоставим примеры кода для каждого метода, чтобы помочь вам понять и реализовать их в своих проектах.

  1. Monkeypatching:
    Monkeypatching — это метод, используемый для изменения или замены существующих атрибутов или функций во время выполнения. В pytest приспособление monkeypatchпредоставляет удобный способ имитировать встроенные функции. Вот пример издевательства над функцией input():
def test_mock_input(monkeypatch):
    monkeypatch.setattr('builtins.input', lambda _: 'mocked input')
    # Test code that uses input()
    ...
  1. Издевательство с помощью 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()
        ...
  1. Исправление с помощью 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()
        ...
  1. Создание пользовательского макета.
    Если ни один из вышеперечисленных методов не соответствует вашим потребностям, вы можете создать собственный макетный класс, создав подкласс 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.