1013 Stimmen

Was ist der Unterschied zwischen Vortäuschen, Verspotten und Stümpern?

Ich weiß, wie ich diese Begriffe verwende, aber ich frage mich, ob es akzeptierte Definitionen gibt für Fälschung , verhöhnend und . für Einheitstests? Wie definieren Sie diese für Ihre Tests? Beschreiben Sie die Situationen, in denen Sie sie verwenden könnten.

Ich verwende sie folgendermaßen:

Gefälschte Eine Klasse, die eine Schnittstelle implementiert, aber feste Daten und keine Logik enthält. Gibt je nach Implementierung einfach "gute" oder "schlechte" Daten zurück.

Mock Klasse, die eine Schnittstelle implementiert und die Möglichkeit bietet, dynamisch die Werte festzulegen, die von bestimmten Methoden zurückgegeben bzw. Ausnahmen ausgelöst werden sollen, und die Möglichkeit bietet, zu überprüfen, ob bestimmte Methoden aufgerufen bzw. nicht aufgerufen wurden.

Stummel : Wie eine Mock-Klasse, mit dem Unterschied, dass sie nicht die Möglichkeit bietet, zu überprüfen, ob Methoden aufgerufen oder nicht aufgerufen wurden.

Mocks und Stubs können von Hand oder durch ein Mocking-Framework generiert werden. Fake-Klassen werden von Hand generiert. Ich verwende Mocks in erster Linie, um die Interaktionen zwischen meiner Klasse und abhängigen Klassen zu überprüfen. Stubs verwende ich, sobald ich die Interaktionen überprüft habe und alternative Pfade durch meinen Code teste. Ich verwende Fake-Klassen in erster Linie zur Abstraktion von Datenabhängigkeiten oder wenn Mocks/Stubs zu mühsam sind, um sie jedes Mal neu einzurichten.

311voto

Mike Punkte 4102

Stummel - ein Objekt, das vordefinierte Antworten auf Methodenaufrufe liefert.

Mock - ein Objekt, an das Sie Erwartungen knüpfen.

Gefälschte - ein Objekt mit begrenzten Fähigkeiten (zu Testzwecken), z. B. ein gefälschter Webdienst.

Test Double ist der allgemeine Begriff für Stubs, Mocks und Fakes. Inoffiziell werden sie aber oft auch einfach als Mocks bezeichnet.

134voto

Marjan Venema Punkte 18796

Ich bin erstaunt, dass diese Frage schon so lange gestellt wird und noch niemand eine Antwort auf der Grundlage folgender Kriterien gegeben hat Roy Osheroves "Die Kunst des Unit-Testens" .

In "3.1 Einführung von Stubs" wird ein Stub definiert als:

Ein Stub ist ein kontrollierbarer Ersatz für eine bestehende Abhängigkeit (oder Kollaborateur) im System. Durch die Verwendung eines Stubs können Sie Ihren Code testen, ohne ohne sich direkt mit der Abhängigkeit zu befassen.

Und definiert den Unterschied zwischen Stubs und Mocks wie folgt:

Das Wichtigste, was man sich über Mocks im Vergleich zu Stubs merken sollte, ist, dass Mocks genau wie Stubs sind, man aber gegen das Mock-Objekt assertiert, während man gegen einen Stub nicht assertiert.

Fake ist nur der Name, der sowohl für Stubs als auch für Mocks verwendet wird. Zum Beispiel, wenn Sie sich nicht um die Unterscheidung zwischen Stubs und Mocks kümmern.

Die Art und Weise, wie Osherove's zwischen Stubs und Mocks unterscheidet, bedeutet, dass jede Klasse, die als Fake für einen Test verwendet wird, sowohl ein Stub als auch ein Mock sein kann. Welche Klasse es für einen bestimmten Test ist, hängt ganz davon ab, wie Sie die Prüfungen in Ihrem Test schreiben.

  • Wenn Ihr Test Werte in der zu testenden Klasse oder irgendwo anders als in der Fälschung überprüft, wurde die Fälschung als Stub verwendet. Er hat der zu testenden Klasse lediglich Werte zur Verfügung gestellt, entweder direkt durch Werte, die von Aufrufen zurückgegeben werden, oder indirekt durch das Auslösen von Seiteneffekten (in einem bestimmten Zustand) als Ergebnis von Aufrufen.
  • Wenn Ihr Test die Werte der Fälschung überprüft, wurde sie als Attrappe verwendet.

Beispiel für einen Test, bei dem die Klasse FakeX als Stub verwendet wird:

const pleaseReturn5 = 5;
var fake = new FakeX(pleaseReturn5);
var cut = new ClassUnderTest(fake);

cut.SquareIt;

Assert.AreEqual(25, cut.SomeProperty);

Die fake Instanz wird als Stub verwendet, weil die Assert verwendet nicht fake überhaupt nicht.

Beispiel für einen Test, bei dem die Testklasse X als Mock verwendet wird:

const pleaseReturn5 = 5;
var fake = new FakeX(pleaseReturn5);
var cut = new ClassUnderTest(fake);

cut.SquareIt;

Assert.AreEqual(25, fake.SomeProperty);

In diesem Fall ist die Assert prüft einen Wert auf fake und macht diese Fälschung zu einer Attrappe.

Natürlich sind diese Beispiele sehr konstruiert, aber ich sehe in dieser Unterscheidung große Vorteile. Sie macht Ihnen bewusst, wie Sie Ihre Tests durchführen und wo die Abhängigkeiten Ihrer Tests liegen.

Ich stimme mit Osherove's zu, dass

aus einer reinen Wartbarkeit Perspektive, in meinen Tests mit Mocks schafft mehr Probleme als nicht mit ihnen. Das ist meine Erfahrung, aber ich lerne immer etwas Neues.

Asserting gegen die Fälschung ist etwas, das Sie wirklich vermeiden möchten, da es Ihre Tests in hohem Maße von der Implementierung einer Klasse abhängig macht, die gar nicht die zu testende Klasse ist. Das bedeutet, dass die Tests für die Klasse ActualClassUnderTest zu brechen beginnen kann, weil die Implementierung für ClassUsedAsMock verändert. Und das riecht für mich sehr unangenehm. Tests für ActualClassUnderTest sollte vorzugsweise nur dann unterbrochen werden, wenn ActualClassUnderTest geändert wird.

Ich weiß, dass das Schreiben von Asserts gegen die Fälschung eine gängige Praxis ist, vor allem, wenn Sie eine mockist Art von TDD Teilnehmer sind. Ich schätze, ich bin fest mit Martin Fowler im klassizistischen Lager (Siehe Martin Fowlers "Mocks aren't Stubs" ) und wie Osherove Interaktionstests (die nur durch Behauptungen gegen die Fälschung durchgeführt werden können) so weit wie möglich vermeiden.

Wenn Sie wissen möchten, warum Sie Spötteleien im Sinne der Definition hier vermeiden sollten, googeln Sie nach "fowler mockist classicist". Sie werden eine Fülle von Meinungen finden.

34voto

Arezoo Bagherzadi Punkte 257

Die Sache, die Sie darauf geltend machen, wird als Nachahmung Objekt und alles andere, was den Testablauf unterstützt hat, ist ein Stummel .

22voto

Abuzeid Punkte 719

Sie alle werden als Testdoubles bezeichnet und dienen dazu, die Abhängigkeiten zu injizieren, die Ihr Testfall benötigt.

Fake

Stummel: Er hat bereits ein vordefiniertes Verhalten, um Ihre Erwartungen zu erfüllen zum Beispiel gibt stub nur den Erfolgsfall Ihrer API-Antwort zurück Stub

Eine Attrappe ist ein intelligenter Stummel. Sie verifizieren, dass Ihr Test durch ihn läuft. Sie könnten also ein Mock erstellen, das entweder den Erfolg oder den Misserfolg zurückgibt, je nachdem, ob die Bedingung in Ihrem Testfall geändert werden kann. Mock

Dummy

Spy

17voto

yoAlex5 Punkte 20661

Unit testing - ist ein Testansatz, bei dem die Einheit (Klasse, Methode) unter Kontrolle ist.

Test double - ist kein primäres Objekt (aus der OOP-Welt). Es ist eine Realisation, die erstellt wird vorübergehend zum Testen, Prüfen oder während der Entwicklung. Und sie werden erstellt für Schließen von Abhängigkeiten der getesteten Einheit (Methode, Klasse...)

Testen Sie die Doppeltypen:

  • fake object ist eine echte Umsetzung der Schnittstelle (Protokoll) oder einer erweitern. die eine Vererbung oder andere Ansätze verwendet, die verwendet werden können, um - is Abhängigkeit. Normalerweise wird sie vom Entwickler als einfachste Lösung erstellt, um eine Abhängigkeit zu ersetzen

  • stub object ist ein bloßes Objekt (0, nil und Methoden ohne Logik) mit Extrazustand die vordefiniert ist (vom Entwickler), um zu definieren zurückgegebene Werte . In der Regel wird sie von Frameworks erstellt

    class StubA: A { override func foo() -> String { return "My Stub" } }

  • mock object ist sehr ähnlich zu stub object aber die Extrazustand wird während der Programmausführung geändert, um zu prüfen, ob Etwas ist passiert (Methode wurde aufgerufen, Argumente, wann, wie oft...).

    class MockA: A { var isFooCalled = false override func foo() -> String { isFooCalled = true return "My Mock" } }

  • spy object ist ein echtes Objekt mit einem "partiellen Mocking". Das heißt, Sie arbeiten mit einem nicht doppelt Objekt außer Mocked Behavior

  • dummy object ist ein Objekt, das zur Durchführung eines Tests benötigt wird, aber keine einzige Variable oder Methode dieses Objekts wird nicht aufgerufen.

stub vs mock

Martin Fowler sagte

Der Unterschied besteht darin, dass der Stub eine Zustandsüberprüfung verwendet, während der Mock eine Verhaltensüberprüfung verwendet.

[Mockito mock vs spy]

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