Ich habe verschiedene Artikel über Mocking vs Stubbing in Tests gelesen, einschließlich Martin Fowlers Spötteleien sind keine Spötteleien aber ich verstehe den Unterschied immer noch nicht.
Antworten
Zu viele Anzeigen?Vorwort
Es gibt verschiedene Definitionen von Objekten, die nicht real sind. Der allgemeine Begriff ist Prüfdoppel . Dieser Begriff umfasst Folgendes: Schnuller , gefälscht , Stummel , Nachahmung .
Referenz
Nach Angaben von Der Artikel von Martin Fowler :
- Schnuller Objekte werden herumgereicht, aber nie wirklich benutzt. Normalerweise werden sie nur zum Füllen von Parameterlisten verwendet.
- Gefälschte Objekte haben tatsächlich funktionierende Implementierungen, nehmen aber in der Regel eine Abkürzung, die sie für die Produktion ungeeignet macht (eine speicherinterne Datenbank ist ein gutes Beispiel).
- Kippen geben vorgefertigte Antworten auf Anrufe, die während des Tests getätigt werden, und reagieren in der Regel überhaupt nicht auf etwas, das nicht für den Test programmiert wurde. Stubs können auch Informationen über Anrufe aufzeichnen, wie z. B. ein E-Mail-Gateway-Stub, der sich die Nachrichten merkt, die er "gesendet" hat, oder vielleicht nur, wie viele Nachrichten er "gesendet" hat.
- Verspottet sind das, worüber wir hier sprechen: Objekte, die mit Erwartungen vorprogrammiert sind, die eine Spezifikation der Anrufe bilden, die sie erhalten sollen.
Stil
Mocks vs. Stubs = Verhaltenstests vs. Zustandstests
Grundsatz
Nach dem Prinzip der Testen Sie nur eine Sache pro Test In einem Test kann es mehrere Stubs geben, aber im Allgemeinen gibt es nur einen Mock.
Lebenszyklus
Testlebenszyklus mit Stubs:
- Setup - Bereiten Sie das zu testende Objekt und seine Stubs-Kollaborateure vor.
- Übung - Testen Sie die Funktionalität.
- Zustand überprüfen - Verwenden Sie Asserts, um den Zustand des Objekts zu überprüfen.
- Teardown - Aufräumen von Ressourcen.
Testlebenszyklus mit Mocks:
- Setup-Daten - Bereiten Sie das zu prüfende Objekt vor.
- Erwartungen einrichten - Bereiten Sie Erwartungen in Mocks vor, die vom primären Objekt verwendet werden.
- Übung - Testen Sie die Funktionalität.
- Überprüfung der Erwartungen - Überprüfen Sie, ob die richtigen Methoden in Mock aufgerufen wurden.
- Zustand überprüfen - Verwenden Sie Asserts, um den Zustand des Objekts zu überprüfen.
- Teardown - Aufräumen von Ressourcen.
Zusammenfassung
Sowohl Mocks als auch Stubs geben eine Antwort auf die Frage: Was ist das Ergebnis?
Testen mit Mocks sind auch interessiert an: Wie wurde das Ergebnis erzielt?
Stummel
Ich glaube, der größte Unterschied besteht darin, dass man einen Stub bereits mit einem vorgegebenen Verhalten geschrieben hat. Sie hätten also eine Klasse, die die Abhängigkeit implementiert (höchstwahrscheinlich eine abstrakte Klasse oder Schnittstelle), die Sie zu Testzwecken vortäuschen, und die Methoden wären einfach nur Stubs mit festgelegten Antworten. Sie würden nichts Ausgefallenes tun und Sie hätten den Stubbed-Code dafür bereits außerhalb Ihres Tests geschrieben.
Mock
Ein Mock ist etwas, das Sie als Teil Ihres Tests mit Ihren Erwartungen einrichten müssen. Ein Mock wird nicht auf eine vorbestimmte Weise eingerichtet, so dass Sie Code haben, der dies in Ihrem Test tut. Mocks werden in gewisser Weise zur Laufzeit bestimmt, da der Code, der die Erwartungen festlegt, ausgeführt werden muss, bevor er etwas tut.
Unterschied zwischen Mocks und Stubs
Mit Mocks geschriebene Tests folgen normalerweise einem initialize -> set expectations -> exercise -> verify
Muster zu testen. Während der vorformulierte Stub nach einem initialize -> exercise -> verify
.
Ähnlichkeit zwischen Mocks und Stubs
Der Zweck von beidem ist es, das Testen aller Abhängigkeiten einer Klasse oder Funktion zu eliminieren, so dass Ihre Tests konzentrierter und einfacher sind in dem, was sie zu beweisen versuchen.
Im Folgenden finden Sie eine Beschreibung der einzelnen Produkte, gefolgt von einem Beispiel aus der Praxis.
-
Schnuller - nur gefälschte Werte, um die
API
.Beispiel : Wenn Sie eine Methode einer Klasse testen, die viele obligatorische Parameter in einem Konstruktor benötigt, der keine Wirkung haben auf Ihrem Test, dann können Sie Dummy-Objekte zum Zweck der Erstellung neuer Instanzen einer Klasse erstellen.
-
Gefälschte - eine Testimplementierung einer Klasse erstellen, die möglicherweise von einer externen Infrastruktur abhängig ist. (Es ist gute Praxis, dass Ihr Unit-Test die NICHT tatsächlich mit der externen Infrastruktur interagieren).
Beispiel : Erstellen Sie eine Fake-Implementierung für den Zugriff auf eine Datenbank, ersetzen Sie sie durch
in-memory
Sammlung. -
Stummel - Methoden überschreiben, um fest kodierte Werte zurückzugeben, auch bezeichnet als
state-based
.Beispiel : Ihre Testklasse hängt von einer Methode ab
Calculate()
Die Bearbeitung dauert 5 Minuten. Anstatt 5 Minuten zu warten, können Sie die eigentliche Implementierung durch einen Stub ersetzen, der fest kodierte Werte zurückgibt und nur einen kleinen Bruchteil der Zeit benötigt. -
Mock - sehr ähnlich zu
Stub
sonderninteraction-based
und nicht auf staatlicher Ebene. Das bedeutet, dass Sie nicht erwarten können, dassMock
um einen Wert zurückzugeben, sondern um anzunehmen, dass eine bestimmte Reihenfolge der Methodenaufrufe eingehalten wird.Beispiel: Sie testen eine Klasse zur Benutzerregistrierung. Nach dem Aufruf von
Save
sollte es aufrufenSendConfirmationEmail
.
Stubs
y Mocks
sind eigentlich Untertypen von Mock
tauschen beide die reale Implementierung mit der Testimplementierung aus, jedoch aus unterschiedlichen, spezifischen Gründen.
In der codeschule.de Kurs, Rails-Tests für Zombies geben sie diese Definition der Begriffe:
Stummel
Zum Ersetzen einer Methode durch Code, der ein bestimmtes Ergebnis liefert.
Mock
Ein Stub mit einer Behauptung, dass die Methode aufgerufen wird.
Wie Sean Copenhaver in seiner Antwort beschrieben hat, besteht der Unterschied darin, dass Mocks Erwartungen setzen (d. h. Behauptungen darüber aufstellen, ob oder wie sie aufgerufen werden).
- See previous answers
- Weitere Antworten anzeigen