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.