1373 Stimmen

Was ist der Unterschied zwischen einer Attrappe und einem Stummel?

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.

1168voto

Ryszard Dżegan Punkte 22810

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:

  1. Setup - Bereiten Sie das zu testende Objekt und seine Stubs-Kollaborateure vor.
  2. Übung - Testen Sie die Funktionalität.
  3. Zustand überprüfen - Verwenden Sie Asserts, um den Zustand des Objekts zu überprüfen.
  4. Teardown - Aufräumen von Ressourcen.

Testlebenszyklus mit Mocks:

  1. Setup-Daten - Bereiten Sie das zu prüfende Objekt vor.
  2. Erwartungen einrichten - Bereiten Sie Erwartungen in Mocks vor, die vom primären Objekt verwendet werden.
  3. Übung - Testen Sie die Funktionalität.
  4. Überprüfung der Erwartungen - Überprüfen Sie, ob die richtigen Methoden in Mock aufgerufen wurden.
  5. Zustand überprüfen - Verwenden Sie Asserts, um den Zustand des Objekts zu überprüfen.
  6. 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?

933voto

Sean Copenhaver Punkte 9915

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.

549voto

Arnis Lapsa Punkte 42566

Ein Stub ist ein einfaches Fake-Objekt. Er sorgt lediglich dafür, dass der Test reibungslos abläuft.
Eine Attrappe ist ein klügerer Stummel. Sie verifizieren, dass Ihr Test ihn durchläuft.

327voto

Lev Punkte 3253

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 sondern interaction-based und nicht auf staatlicher Ebene. Das bedeutet, dass Sie nicht erwarten können, dass Mock 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 aufrufen SendConfirmationEmail .

Stubs y Mocks sind eigentlich Untertypen von Mock tauschen beide die reale Implementierung mit der Testimplementierung aus, jedoch aus unterschiedlichen, spezifischen Gründen.

205voto

Dillon Kearns Punkte 3595

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).

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X