Utiliser unittest.mock pour surveiller les appels
Dans cette étape, nous allons explorer comment utiliser le module unittest.mock
pour surveiller les appels de fonction. Le module unittest.mock
est un outil puissant pour les tests et le débogage, et il offre un moyen pratique de suivre les appels de fonction, les arguments et les valeurs de retour.
Continuons avec la fonction greet
des étapes précédentes. Nous allons utiliser unittest.mock
pour surveiller les appels à greet
.
Modifiez le fichier my_function.py
dans le répertoire ~/project
pour inclure le code suivant :
## ~/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}")
Dans ce code :
- Nous importons le module
mock
de unittest
.
- Nous créons un objet
mock.Mock
qui enveloppe la fonction greet
. L'argument wraps
indique à l'objet mock d'appeler la fonction greet
originale lorsqu'il est appelé.
- Nous appelons ensuite l'objet
mock_greet
au lieu de la fonction greet
originale.
- Enfin, nous utilisons les attributs
call_count
et call_args_list
de l'objet mock pour obtenir des informations sur les appels de fonction.
Exécutez le script à nouveau en utilisant la même commande :
python ~/project/my_function.py
Vous devriez voir une sortie similaire à celle-ci :
Hello, Alice!
Hello, Bob!
The greet function was called 2 times.
The calls were: [call('Alice'), call('Bob')]
Cette sortie montre que la fonction greet
a été appelée deux fois, et elle montre également les arguments qui ont été passés à la fonction à chaque appel.
Maintenant, examinons plus attentivement la call_args_list
. C'est une liste d'objets call
, chacun représentant un appel unique à la fonction mockée. Vous pouvez accéder aux arguments de chaque appel en utilisant les attributs args
et kwargs
de l'objet call
.
Par exemple, modifions le code pour afficher les arguments du premier appel :
## ~/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}")
Exécutez le script à nouveau :
python ~/project/my_function.py
Vous devriez voir une sortie similaire à celle-ci :
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',)
Cette sortie montre que le premier appel à greet
a été effectué avec l'argument "Alice"
.
Le module unittest.mock
offre un moyen puissant et flexible de surveiller les appels de fonction en Python. C'est un outil précieux pour les tests, le débogage et l'analyse des performances.