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.

22voto

Joe Yang Punkte 1477

Ich denke, der wichtigste Unterschied zwischen ihnen ist ihre Absicht.

Lassen Sie mich versuchen, es zu erklären WARUM Stummel vs. WARUM spottet man

Angenommen, ich schreibe Testcode für die öffentliche Timeline-Controller meines Mac-Twitter-Clients

Hier ein Beispielcode zum Testen

twitter_api.stub(:public_timeline).and_return(public_timeline_array)
client_ui.should_receive(:insert_timeline_above).with(public_timeline_array)
controller.refresh_public_timeline
  • STUB: Die Netzwerkverbindung zur Twitter-API ist sehr langsam, was meinen Test langsam macht. Ich weiß, dass es Zeitleisten zurückgeben wird, also habe ich einen Stub gemacht, der die HTTP-Twitter-API simuliert, so dass mein Test sehr schnell ausgeführt wird und ich den Test sogar offline ausführen kann.
  • MOCK: Ich habe noch keine meiner UI-Methoden geschrieben, und ich bin nicht sicher, welche Methoden ich für mein UI-Objekt schreiben muss. Ich hoffe zu wissen, wie mein Controller mit meinem UI-Objekt zusammenarbeiten wird, indem ich den Testcode schreibe.

Indem Sie Mocks schreiben, entdecken Sie die Beziehung zwischen den Objekten und der Zusammenarbeit, indem Sie überprüfen, ob die Erwartungen erfüllt werden, während Stubs nur das Verhalten des Objekts simulieren.

Ich schlage vor, diesen Artikel zu lesen, wenn Sie mehr über Mocks wissen wollen: http://jmock.org/oopsla2004.pdf

20voto

DeeFisher Punkte 228

Stummel

A Stummel ist ein Objekt, das dazu dient, eine Methode vorzutäuschen, die vorprogrammiertes Verhalten . Möglicherweise möchten Sie diese anstelle einer bestehenden Methode verwenden, um unerwünschte Nebeneffekte zu vermeiden (z. B. könnte ein Stub einen Fetch-Aufruf vortäuschen, der eine vorprogrammierte Antwort zurückgibt, ohne tatsächlich eine Anfrage an einen Server zu stellen).

Mock

A Nachahmung ist ein Objekt, das dazu dient, eine Methode vorzutäuschen, die vorprogrammiertes Verhalten wie auch vorprogrammierte Erwartungen . Wenn diese Erwartungen nicht erfüllt werden, schlägt der Test fehl (z. B. könnte ein Mock einen Fetch-Aufruf vortäuschen, der eine vorprogrammierte Antwort zurückgibt, ohne tatsächlich eine Anfrage an einen Server zu stellen, was erwarten z.B. das erste Argument muss sein "http://localhost:3008/" sonst würde der Test fehlschlagen.)

Unterschied

Im Gegensatz zu Mocks haben Stubs keine vorprogrammierten Erwartungen, die Ihren Test zum Scheitern bringen könnten.

16voto

Afonso Matos Punkte 2247

Ich habe gelesen Die Kunst des Unit-Tests und stieß dabei auf die folgende Definition:

A gefälscht ist ein allgemeiner Begriff, der sowohl für einen Stub als auch für ein (handgeschriebenes oder anderes) Scheinobjekt verwendet werden kann, da beide wie das echte Objekt aussehen. Ob ein Fake ein Stub oder ein Mock ist, hängt davon ab, wie es im aktuellen Test verwendet wird. Wenn es verwendet wird, um eine Interaktion zu prüfen (gegen die behauptet wird), ist es ein Scheinobjekt . Ansonsten ist es ein Stummel .

15voto

Relu Mesaros Punkte 4666
  • Stubs vs. Mocks
    • Kippen
      1. spezifische Antworten auf Methodenaufrufe geben
        • z.B.: myStubbedService.getValues() gibt nur eine Zeichenkette zurück, die für den zu testenden Code benötigt wird
      2. vom zu testenden Code verwendet, um ihn zu isolieren
      3. kann den Test nicht ablehnen
        • Beispiel: myStubbedService.getValues() gibt nur den Stubbed-Wert zurück
      4. implementieren oft abstrakte Methoden
    • Verspottet
      1. "Obermenge" von Stubs; kann behaupten, dass bestimmte Methoden aufgerufen werden
        • z.B.: Überprüfen, dass myMockedService.getValues() nur einmal aufgerufen wird
      2. zum Testen des Verhaltens des zu testenden Codes
      3. kann den Test nicht bestehen
        • Beispiel: Überprüfung, ob myMockedService.getValues() einmal aufgerufen wurde; Überprüfung schlägt fehl, weil myMockedService.getValues() nicht von meinem getesteten Code aufgerufen wurde
      4. spottet oft über Schnittstellen

15voto

mostafa kazemi Punkte 228

Mocks: helfen bei der Nachahmung und Untersuchung der auftretenden Interaktionen. Diese Interaktionen sind Aufrufe, die das SUT an seine Abhängigkeiten macht, um deren Zustand zu ändern.

Stubs: helfen dabei, eingehende Interaktionen zu emulieren. Diese Interaktionen sind Aufrufe, die das SUT an seine Abhängigkeiten richtet, um Eingabedaten zu erhalten.

enter image description here

Quelle: Unit Testing Prinzipien, Praktiken und Muster - Manning

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