Frage

Ich habe gerade gelesen, den Wikipedia-Artikel über Mock-Objekte , aber ich bin immer noch nicht ganz klar, auf ihren Zweck. Es scheint, sie sind Objekte, die von einer Test-Framework erstellt werden, wenn das eigentliche Objekt wäre zu komplex oder unvorhersehbar (Sie 100% sicher wissen, was die Werte des Mock-Objekts sind, weil Sie sie vollständig kontrollieren).

Aber ich hatte den Eindruck, dass alle Tests mit Objekten von bekannten Werten erfolgt, also muss ich etwas fehlen. Zum Beispiel in einem Kurs-Projekt, wurden wir mit einer Kalenderanwendung beauftragt. Unsere Testreihe bestand aus Ereignisobjekten, die wir wussten genau, was sie waren und so konnten wir die Wechselwirkungen zwischen mehreren Ereignisobjekten verschiedenen Subsysteme testen, und der Benutzeroberfläche. Ich vermute, diese Mock-Objekte sind, aber ich weiß nicht, warum Sie dies, weil ohne die Objekte der bekannten Werte nicht tun würde, können Sie nicht ein System testen.

War es hilfreich?

Lösung

Ein Mock-Objekt ist nicht nur ein Objekt mit bekannten Werten. Es ist eine Aufgabe, die die gleiche Schnittstelle wie ein komplexes Objekt, das Sie nicht in Test (wie eine Datenbankverbindung und Ergebnismengen), aber mit einer Implementierung verwenden können, die Sie in Ihrem Test steuern können.

Es gibt spöttischen Frameworks, mit denen Sie diese Objekte on the fly erstellen und im Wesentlichen können Sie so etwas wie sagen: Machen Sie mir ein Objekt mit einer Methode foo, die einen int nimmt und gibt einen bool. Wenn ich 0 passieren, sollte es wahr zurück. Dann können Sie den Code testen, die foo () verwendet, um sicherzustellen, dass es entsprechend reagiert.

Martin Fowler hat einen großen Artikel über spöttisch:

Andere Tipps

Denken Sie an den klassischen Fall von Client- und Server-Software mit. Um den Client zu testen, müssen Sie den Server; den Server zu testen, müssen Sie den Client. Dies macht Unit-Tests ziemlich unmöglich - ohne Mocks zu verwenden. Wenn Sie den Server verspotten, können Sie den Client in Isolation und umgekehrt testen.

Der Punkt des Mock ist nicht auf das Verhalten der Dinge, seine spöttischen obwohl zu duplizieren. Es ist mehr als eine einfache Zustandsmaschine zu handeln Änderungen, deren Zustand durch den Test-Framework analysiert werden. So ein Client mock könnte Testdaten generieren, ist es an den Server senden und dann die Antwort analysieren. Sie erwarten, dass eine bestimmte Antwort auf eine spezifische Anfrage, und so können Sie testen, ob Sie es.

Ich stimme mit allem, was @Lou Franco sagt, und Sie sollten auf jeden Fall die ausgezeichnete Martin Fowler Artikel auf Test lesen verdoppelt dass @Lou Franco verweist Sie auf.

Der Hauptzweck eines Test double (fälschen, Stummel oder mock) ist, das Objekt unter Test zu isolieren, so dass das Gerät Test nur wird dieses Objekt Testen (nicht ihre Abhängigkeiten und die anderen Typen es arbeitet oder wirkt mit).

Ein Objekt, das die Schnittstelle bereitstellt, die das Objekt auf, kann anstelle der tatsächlichen Abhängigkeit verwendet werden, abhängig ist, so dass die Erwartungen platziert werden können, dass bestimmte Interaktionen auftreten. Dies kann nützlich sein, aber es gibt einige Kontroversen um zustandsbasierte vs. interaktionsbasierte Tests. Übermäßiger Einsatz von Mock Erwartung wird zu spröde Tests führen.

Ein weiterer Grund für den Test verdoppelt ist Abhängigkeiten von Datenbanken oder Dateisystemen oder anderen Arten zu entfernen, die zur Einrichtung teuer oder zeitaufwendig Operationen durchführen. Dies bedeutet, dass Sie die Zeit, um Einheit erforderlich halten können testen Sie das Objekt in auf ein Minimum interessiert sind.

Hier ist ein Beispiel: Wenn Sie Code schreiben, die eine Datenbank auffüllt mögen Sie vielleicht, wenn eine bestimmte Methode, um Daten hinzugefügt, um die Datenbank überprüfen

.

Einrichten einer Kopie der Datenbank für das Testen auf das Problem, dass, wenn Sie es annehmen, sind keine Aufzeichnungen vor dem Aufruf der getesteten Verfahren und einen Rekord nach, dann müssen Sie die Datenbank in einen früheren Zustand zurückrollen, damit das Hinzufügen zu dem Aufwand für die Durchführung des Tests.

Wenn Sie davon ausgehen, es ist nur noch eine Aufzeichnung als vorher, kann es mit einem zweiten Tester kollidieren (oder sogar ein zweiter Test im gleichen Code) auf die gleiche Datenbank verbinden, wodurch Abhängigkeiten und macht die Tests instabil.

Die mock können Sie die Tests unabhängig voneinander zu halten und einfach einzurichten.

Dies ist nur ein Beispiel - ich bin sicher, dass andere können mehr liefern

.

Ich bin damit einverstanden zu 100% mit den anderen Mitwirkenden zu diesem Thema, vor allem mit der Empfehlung für den Martin Fowler Artikel.

Sie können in unserem Buch interessieren, finden Sie unter http: //www.growing-object -oriented-software.com/ . Es ist in Java, aber die Ideen noch gelten.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top