Использование unittest.mock для мониторинга вызовов функций
На этом этапе мы рассмотрим, как использовать модуль unittest.mock
для мониторинга вызовов функций. Модуль unittest.mock
представляет собой мощный инструмент для тестирования и отладки, который предоставляет удобный способ отслеживать вызовы функций, аргументы и возвращаемые значения.
Продолжим работу с функцией greet
из предыдущих этапов. Мы будем использовать unittest.mock
для мониторинга вызовов функции greet
.
Измените файл my_function.py
в директории ~/project
, добавив следующий код:
## ~/project/my_function.py
from unittest import mock
def greet(name):
"""This function greets the person passed in as a parameter."""
print(f"Hello, {name}!")
## Create a mock object for the greet function
mock_greet = mock.Mock(wraps=greet)
## Example usage
mock_greet("Alice")
mock_greet("Bob")
## Print the number of times the function was called
print(f"The greet function was called {mock_greet.call_count} times.")
## Print the arguments the function was called with
print(f"The calls were: {mock_greet.call_args_list}")
В этом коде:
- Мы импортируем модуль
mock
из unittest
.
- Создаем объект
mock.Mock
, который оборачивает функцию greet
. Аргумент wraps
сообщает объекту-заглушке (mock object), что при вызове он должен вызывать исходную функцию greet
.
- Затем мы вызываем объект
mock_greet
вместо исходной функции greet
.
- В конце мы используем атрибуты
call_count
и call_args_list
объекта-заглушки для получения информации о вызовах функции.
Запустите скрипт еще раз, используя ту же команду:
python ~/project/my_function.py
Вы должны увидеть вывод, похожий на следующий:
Hello, Alice!
Hello, Bob!
The greet function was called 2 times.
The calls were: [call('Alice'), call('Bob')]
Этот вывод показывает, что функция greet
была вызвана дважды, и также отображает аргументы, переданные в функцию при каждом вызове.
Теперь рассмотрим call_args_list
более подробно. Это список объектов call
, каждый из которых представляет отдельный вызов заглушки (mocked function). Вы можете получить доступ к аргументам каждого вызова, используя атрибуты args
и kwargs
объекта call
.
Например, изменим код, чтобы вывести аргументы первого вызова:
## ~/project/my_function.py
from unittest import mock
def greet(name):
"""This function greets the person passed in as a parameter."""
print(f"Hello, {name}!")
## Create a mock object for the greet function
mock_greet = mock.Mock(wraps=greet)
## Example usage
mock_greet("Alice")
mock_greet("Bob")
## Print the number of times the function was called
print(f"The greet function was called {mock_greet.call_count} times.")
## Print the arguments the function was called with
print(f"The calls were: {mock_greet.call_args_list}")
## Print the arguments of the first call
if mock_greet.call_args_list:
print(f"The arguments of the first call were: {mock_greet.call_args_list[0].args}")
Запустите скрипт еще раз:
python ~/project/my_function.py
Вы должны увидеть вывод, похожий на следующий:
Hello, Alice!
Hello, Bob!
The greet function was called 2 times.
The calls were: [call('Alice'), call('Bob')]
The arguments of the first call were: ('Alice',)
Этот вывод показывает, что первый вызов функции greet
был выполнен с аргументом "Alice"
.
Модуль unittest.mock
предоставляет мощный и гибкий способ мониторинга вызовов функций в Python. Это ценный инструмент для тестирования, отладки и анализа производительности.