Verwenden von unittest.mock zur Überwachung von Aufrufen
In diesem Schritt werden wir untersuchen, wie man das unittest.mock
-Modul verwendet, um Funktionsaufrufe zu überwachen. Das unittest.mock
-Modul ist ein leistungsstarkes Werkzeug für das Testen und Debugging und bietet eine bequeme Möglichkeit, Funktionsaufrufe, Argumente und Rückgabewerte zu verfolgen.
Lasst uns mit der greet
-Funktion aus den vorherigen Schritten fortfahren. Wir werden unittest.mock
verwenden, um die Aufrufe von greet
zu überwachen.
Ändern Sie die Datei my_function.py
im Verzeichnis ~/project
, um den folgenden Code einzuschließen:
## ~/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}")
In diesem Code:
- Wir importieren das
mock
-Modul aus unittest
.
- Wir erstellen ein
mock.Mock
-Objekt, das die greet
-Funktion umhüllt. Das wraps
-Argument teilt dem Mock-Objekt mit, die ursprüngliche greet
-Funktion aufzurufen, wenn es aufgerufen wird.
- Wir rufen dann das
mock_greet
-Objekt anstelle der ursprünglichen greet
-Funktion auf.
- Schließlich verwenden wir die Attribute
call_count
und call_args_list
des Mock-Objekts, um Informationen über die Funktionsaufrufe zu erhalten.
Führen Sie das Skript erneut mit demselben Befehl aus:
python ~/project/my_function.py
Sie sollten eine Ausgabe ähnlich der folgenden sehen:
Hello, Alice!
Hello, Bob!
The greet function was called 2 times.
The calls were: [call('Alice'), call('Bob')]
Diese Ausgabe zeigt, dass die greet
-Funktion zweimal aufgerufen wurde, und es zeigt auch die Argumente, die bei jedem Aufruf an die Funktion übergeben wurden.
Jetzt betrachten wir die call_args_list
genauer. Es ist eine Liste von call
-Objekten, die jeweils einen einzelnen Aufruf der gemockten Funktion darstellen. Sie können die Argumente jedes Aufrufs über die Attribute args
und kwargs
des call
-Objekts zugreifen.
Beispielsweise ändern wir den Code, um die Argumente des ersten Aufrufs auszugeben:
## ~/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}")
Führen Sie das Skript erneut aus:
python ~/project/my_function.py
Sie sollten eine Ausgabe ähnlich der folgenden sehen:
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',)
Diese Ausgabe zeigt, dass der erste Aufruf von greet
mit dem Argument "Alice"
erfolgt ist.
Das unittest.mock
-Modul bietet eine leistungsstarke und flexible Möglichkeit, Funktionsaufrufe in Python zu überwachen. Es ist ein wertvolles Werkzeug für das Testen, Debugging und die Leistungsanalyse.