Unterschied zwischen Mock und Patch in Python
Die Codeentwicklung steht bei Test Parallel Development (TPD) an erster Stelle. Dennoch schreiben wir entwickelte Tests und führen sie aus, um die Genauigkeit des Codes zu überprüfen (anstatt den Code direkt auszuführen oder die Konsole zu verwenden).
In Python haben wir einen Prozess namens Unit Testing, in dem sich die Funktionen mock
und patch
befinden. In diesem Artikel werden die Verwendungsmöglichkeiten und die Unterschiede zwischen den beiden Rollen erläutert.
Verwendung und Unterschiede zwischen den Objektbibliotheken Mock
und Patch
in Python
In diesem Artikel gehen wir nicht auf Unit-Tests als Ganzes ein, sondern konzentrieren uns mehr auf mock
- und patch
-Funktionen.
Wir verwenden das mock
-Python-Paket, um bestimmte Komponenten Ihres zu testenden Systems durch mock
-Objekte zu ersetzen und Aussagen über deren Verwendung zu treffen. Es ist Bestandteil der Python-Standardbibliothek und ab Python 3.3 als unittest.mock
zugänglich.
Die Klasse unittest.mock
eliminiert die Notwendigkeit mehrerer Stubs in Ihrer gesamten Testsuite. Nachdem wir eine bestimmte Aktion ausgeführt haben, können wir Behauptungen aufstellen, über die wir Methoden/Attribute und Argumente verwendet haben, die wir sie genannt haben.
Damit können wir Rückgabewerte angeben und benötigte Funktionen auswählen.
MagicDock kann mit den Magic
-Objekten umgehen, einer Unterklasse von Mock
. Die Objekte Mock
und MagicMock
generieren spontan Eigenschaften und Methoden, wenn wir sie verwenden, und protokollieren Nutzungsinformationen.
Mocks basieren auf dem Muster Aktion -> Assertion
(d. h. zuerst das mock
verwenden lassen und dann Aussagen über die empfangenen Anrufe machen) anstelle des Musters record -> replay
, das von vielen Mockern verwendet wird Rahmen. Zusätzlich bietet das Modul mock
einen Decorator namens patch()
, der sich um das Patchen von Eigenschaften auf Klassen- und Modulebene im Kontext eines Tests kümmert, und einen Sentinel zum Erzeugen eindeutiger Instanzen.
Beispielcode:
from unittest.mock import patch
@patch("sample_module.sample_object")
def test_function(mock_object):
print(mock_object)
Ausgang:
<MagicMock name='sample_object' id='1870192341512'>
Das obige Code-Snippet entspricht dem folgenden Snippet:
def test_function():
with patch("sample_module.sample_module") as mock_object:
print(mock_object)
Die Funktion ermöglicht es uns, jedes Objekt durch ein mock
-Objekt zu ersetzen, um den Aufruf des Produktionscodes zu vermeiden und zu überprüfen, wie das ursprüngliche Objekt aufgerufen wird (wenn das Objekt eine Funktion ist). Die Verwendung von patch
(oder ähnlichen Methoden) wird bevorzugt, da dadurch sichergestellt wird, dass der Patch nach dem Test (oder im zweiten Fall nach dem Geltungsbereich des Kontextmanagers) zurückgesetzt wird, sodass andere Tests oder Programme nicht beeinträchtigt werden.
Abschluss
Als Entscheidungshilfe können wir folgendes beachten:
- Um Objekte bequem durch
mock
-Objekte (oder andere Objekte) zu ersetzen und den vorherigen Zustand nach Fertigstellung wiederherzustellen oder im Ausnahmefall die Decorator-/Kontextmanager-Funktionpatch
zu verwenden. - Der
mock.patch
erstelltmock
oder abgeleitete Objekte, die wir manuell herstellen können. Manuell erstellte werden nur verwendet, um lokale Funktionen oder andere Mocks zu reparieren, die kein Zurücksetzen erfordern.
Marion specializes in anything Microsoft-related and always tries to work and apply code in an IT infrastructure.
LinkedIn