2008-10-17 16 views
28

Ich lese gerade den Wikipedia-Artikel auf mock objects, aber ich bin immer noch nicht ganz klar auf ihren Zweck. Es scheint, dass es sich um Objekte handelt, die von einem Testframework erstellt werden, wenn das tatsächliche Objekt zu komplex oder unvorhersehbar wäre (Sie wissen 100% sicher, was die Werte des Mockobjekts sind, weil Sie sie vollständig steuern).Was ist ein Mock und wann sollten Sie es verwenden?

Allerdings hatte ich den Eindruck, dass alle Tests mit Objekten mit bekannten Werten durchgeführt werden, daher muss ich etwas vermissen. Zum Beispiel wurden wir in einem Kursprojekt mit einer Kalenderanwendung beauftragt. Unsere Testsuite bestand aus Ereignisobjekten, von denen wir wussten, was genau sie waren, sodass wir die Interaktionen zwischen mehreren Ereignisobjekten, verschiedenen Subsystemen und der Benutzeroberfläche testen konnten. Ich vermute, das sind Mock-Objekte, aber ich weiß nicht, warum Sie das nicht tun würden, denn ohne die Objekte mit bekannten Werten können Sie kein System testen.

Antwort

26

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

Es gibt mockende Frameworks, die Ihnen erlauben, diese Objekte im laufenden Betrieb zu erstellen und im Wesentlichen können Sie etwas sagen: Machen Sie mich zu einem Objekt mit einer Methode foo, die einen int und einen bool zurücknimmt. Wenn ich 0 überlasse, sollte es wahr zurückgeben. Dann können Sie den Code testen, der foo() verwendet, um sicherzustellen, dass er entsprechend reagiert.

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

+0

Super Artikel Link. Danke –

9

Denken Sie an den klassischen Fall von Client- und Server-Software. Um den Client zu testen, benötigen Sie den Server. Um den Server zu testen, benötigen Sie den Client. Dies macht Unit-Tests ziemlich unmöglich - ohne Mocks zu verwenden. Wenn Sie sich über den Server lustig machen, können Sie den Client isoliert testen und umgekehrt.

Der Sinn des Mocks ist nicht, das Verhalten der Dinge nachzuahmen, sondern es zu verspotten. Es handelt sich eher um eine einfache Zustandsmaschine, deren Zustandsänderungen durch das Testframework analysiert werden können. Ein Client-Mock könnte also Testdaten generieren, diese an den Server senden und dann die Antwort analysieren. Sie erwarten eine bestimmte Antwort auf eine bestimmte Anfrage, und Sie können testen, ob Sie es erhalten.

6

ich mit allem einverstanden @Lou Franco sagt, und Sie sollten auf jeden Fall den ausgezeichneten Martin Fowler Artikel auf Test lesen verdoppelt dass @Lou Franco Punkte Du auch. Der Hauptzweck eines jeden Testdoppels (Fake, Stub oder Mock) besteht darin, das zu testende Objekt zu isolieren, so dass Ihr Komponententest nur dieses Objekt testet (nicht seine Abhängigkeiten und die anderen Typen, mit denen es zusammenarbeitet oder interagiert).

Ein Objekt, das die Schnittstelle zur Verfügung stellt, von der Ihr Objekt abhängig ist, kann anstelle der tatsächlichen Abhängigkeit verwendet werden, so dass bestimmte Interaktionen stattfinden können. Dies kann nützlich sein, aber es gibt einige Kontroversen um zustandsbasierte vs. interaktionsbasierte Tests. Übermäßiger Gebrauch von Scheinerwartungen führt zu brüchigen Tests.

Ein weiterer Grund für Testdoppelwerte besteht darin, Abhängigkeiten von Datenbanken oder Dateisystemen oder anderen Typen zu entfernen, deren Einrichtung oder zeitaufwendige Vorgänge teuer sind. Dies bedeutet, dass Sie die Zeit für das Testen des Objekts, an dem Sie interessiert sind, auf ein Minimum reduzieren können.

2

Hier ist ein Beispiel: Wenn Sie Code schreiben, der eine Datenbank auffüllt, möchten Sie möglicherweise überprüfen, ob eine bestimmte Methode Daten zur Datenbank hinzugefügt hat.

Das Einrichten einer Kopie der Datenbank zum Testen hat das Problem, dass wenn Sie annehmen, dass keine Datensätze vor dem Aufruf der getesteten Methode und ein Datensatz nach sind, müssen Sie die Datenbank in einen vorherigen Zustand zurücksetzen Hinzufügen zum Overhead zum Ausführen des Tests.

Wenn Sie annehmen, dass nur ein weiterer Datensatz vorhanden ist, könnte er mit einem zweiten Tester (oder sogar einem zweiten Test im selben Code) kollidieren, was zu Abhängigkeiten führt und die Tests fragil macht.

Mit dem Mock können Sie die Tests voneinander unabhängig halten und einfach einrichten.

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

Ich stimme zu 100% mit den anderen Mitwirkenden zu diesem Thema überein, insbesondere mit der Empfehlung für den Artikel von Martin Fowler.