Unterschied zwischen Mock und Patch in Python

  1. Verwendung und Unterschiede zwischen den Objektbibliotheken Mock und Patch in Python
  2. Abschluss
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:

  1. Um Objekte bequem durch mock-Objekte (oder andere Objekte) zu ersetzen und den vorherigen Zustand nach Fertigstellung wiederherzustellen oder im Ausnahmefall die Decorator-/Kontextmanager-Funktion patch zu verwenden.
  2. Der mock.patch erstellt mock 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 Paul Kenneth Mendoza avatar Marion Paul Kenneth Mendoza avatar

Marion specializes in anything Microsoft-related and always tries to work and apply code in an IT infrastructure.

LinkedIn

Verwandter Artikel - Python Unittest