Frage

Als ich ursprünglich Mocks eingeführt wurde fühlte ich der primäre Zweck Objekte zu verspotten war bis, die von externen Datenquellen stammen. So kann ich musste nicht eine automatisierte Unit-Tests Testdatenbank zu halten, konnte ich nur vortäuschen.

Aber jetzt beginne ich anders, daran zu denken. Ich frage mich, ob Mocks effektiver verwendet werden, sind völlig außer sich die bewährte Methode von irgendetwas zu isolieren. Das Bild, das in dem Sinne kommt immer ist die Kulisse Sie beim Malen. Sie möchten die Farbe halten aus der ganzen alles zu bekommen. Ich bin nur diese Methode zu testen, und ich möchte nur wissen, wie es reagiert auf diese externe Faktoren gefälscht bis?

Es scheint unglaublich langweilig es auf diese Art und Weise zu tun, aber der Vorteil, den ich gesehen habe ist, wenn der Test nicht erfolgreich ist, weil es auf und nicht mehr als 16 Schichten nach unten geschraubt wird. Aber jetzt habe ich 16 Tests haben die gleiche Testabdeckung zu erhalten, weil jedes Stück einzeln geprüft werden würde. Plus jeder Test wird komplizierter und tiefer gebunden an die Methode es Tests ist.

Es fühlt sich für mich richtig, aber es scheint auch brutal, so möchte ich wissen, Art, was andere denken.

War es hilfreich?

Lösung

Ich empfehle Ihnen, einen Blick auf Martin Fowler Artikel Mocks sind nicht Stubs für eine maßgebliche Behandlung von Mocks, als ich Ihnen geben kann.

Der Zweck des Mocks ist zu Einheit testen Sie den Code in Isolation von Abhängigkeiten, so dass Sie wirklich ein Stück Code in dem „Einheit“ Niveau testen. Der Code im Test ist die eigentliche Behandlung, und jedes andere Stück Code stützt sie sich auf (über Parameter oder Dependency Injection, etc.) ist ein „Mock“ (eine leere Implementierung, die immer erwarteten Werte zurückgibt, wenn eine seiner Methoden aufgerufen wird.)

Mocks mag auf den ersten langweilig erscheinen, aber sie machen Unit Testing viel einfacher und robuster, sobald Sie den Dreh raus mit ihnen. Die meisten Sprachen haben Mock-Bibliotheken, die relativ trivial machen spöttisch. Wenn Sie Java verwenden, werde ich meinen persönlichen Favoriten empfehlen. EasyMock

Lassen Sie mich mit diesem Gedanken Ende. Sie zu Integrationstests benötigen, aber ein gutes Volumen von Unit-Tests, die helfen Sie, herauszufinden, welche Komponente einen Fehler enthält, wenn ein solches vorhanden ist

Andere Tipps

Gehen Sie nicht den dunklen Weg Master Luke nach unten. :) Sie alles nicht verspotten. Sie könnten aber man sollte nicht ... hier ist der Grund.

  • Wenn Sie jede Methode isoliert testen weiterhin, Sie haben Überraschungen und Arbeit für Sie ausschneiden, wenn man sie alle zusammen ala BIG BANG bringen. Wir bauen Objekte, so dass sie zusammenarbeiten können, ein größeres Problem zu lösen .. Indem sie sich sie unbedeutend sind. Sie müssen wissen, ob alle Mitarbeiter wie erwartet arbeiten .
  • Mocks machen Tests spröde durch Vervielfältigung Einführung - Ja, ich weiß, das klingt alarmierend. Für jeden mock Sie Setup erwarten, gibt es Orte, n, wo Ihre Methodensignatur existiert. Der eigentliche Code und Ihre Mock Erwartungen (in mehreren Tests). eigentlichen Code zu ändern ist einfacher ... alle Mock Erwartungen Aktualisierung langweilig ist.
  • Test ist jetzt eingeweiht Insider Umsetzung Informationen . Also Ihr Test hängt davon ab, wie Sie entschied sich für die Lösung zu implementieren ... schlecht. Die Tests sollten eine unabhängige Spezifikation sein, die von mehreren Lösungen erfüllt werden können. Ich soll die Freiheit hat, sich nur auf einem Codeblock drücken löschen und neu implementieren ohne mit der Test-Suite neu zu schreiben .. Coz die Anforderungen immer noch das gleiche bleiben.

zu schließen, werde ich sagen: „Wenn es wie eine Ente quakt, läuft wie eine Ente, dann ist es wahrscheinlich eine Ente“ - Wenn es falsch anfühlt .. ist es wahrscheinlich. * Verwenden Sie verspottet zu abstrahieren Problemkinder wie IO-Operationen, Datenbanken, Komponenten von Drittanbietern und dergleichen .. Wie das Salz, ein Teil davon ist notwendig .. zu viel und: x *
Dies ist der Heilige Krieg Staats basiert vs Iteraction Basiertes Testen .. googeln werden Sie einen tieferen Einblick geben.

Klarstellung: Ich bin etwas Widerstand trifft w.r.t. Integrationstests hier :) So meinen Stand zu klären ..

  • Mocks kommt nicht in den 'Abnahmetests' / Integration Reich. Sie werden sie nur in der Unit Testing Welt .. und das ist mein Fokus hier.
  • Abnahmetests verschieden sind und sehr erforderlich - sie nicht schmälern. Aber Unit-Tests und Abnahmen sind unterschiedlich und sollten unterschiedliche gehalten werden.
  • Alle Mitarbeiter innerhalb einer Komponente oder Paket brauchen nicht voneinander .. Wie Mikro-Optimierung isoliert werden, die übertrieben. Es gibt sie ein Problem zusammen .. Zusammenhalt zu lösen.

Ja, ich bin einverstanden. Ich sehe spöttisch wie es manchmal schmerzhaft, aber oft notwendig, für die Tests wirklich werden zu Einheit Tests, das heißt nur die kleinste Einheit, die Sie Ihren Test mit unter Test betroffen machen. Auf diese Weise können Sie weitere Faktoren beseitigen, die das Ergebnis des Tests beeinflussen könnten. Sie tun mit viel mehr kleinen Tests am Ende, aber es wird so viel einfacher, um herauszufinden, wo ein Problem mit Ihrem Code ist.

Meine Philosophie ist, dass Sie überprüfbaren Code schreiben sollten die Tests passen,
keine Tests schreiben den Code passen.

Wie für Komplexität, meiner Meinung nach, dass die Tests sollte einfach zu schreiben, nur weil Sie mehr Tests schreiben, wenn sie sind.

Ich könnte darüber einig, dass eine gute Idee sein könnte, wenn die Klassen Sie verspotten, keine Testsuite haben, denn wenn sie eine richtige Testsuite haben, würden Sie wissen, wo das Problem ohne Isolierung ist.

Die meisten von ihnen, wenn ich Verwendung für Mock-Objekte gehabt haben, wenn der Code, den ich Tests für melde mich so eng gekoppelt (sprich: schlechtes Design), dass ich Mock-Objekte zu schreiben, wenn Klassen von denen sie abhängig ist nicht verfügbar. Sicher gibt es gültige Verwendungen für Mock-Objekte, aber wenn Ihr Code erfordert ihre Verwendung, würde ich noch einen Blick auf die Gestaltung nehmen.

Ja, das ist die Kehrseite der Prüfung mit Mocks. Es gibt eine Menge Arbeit, die Sie einfügen müssen, dass es brutal anfühlt. Aber das ist das Wesen der Unit-Tests. Wie kann man etwas für sich testen, wenn Sie keine externen Ressourcen verspotten?

Auf der anderen Seite, Sie verspotten weg langsam Funktionalität (wie Datenbanken und E / A-Operationen). Wenn die Tests laufen schneller als das wird Programmierer glücklich. Es gibt nichts, viel schmerzhafter als für wirklich langsam Tests warten, die mehr als 10 Sekunden dauern, bis zum Ende ausgeführt wird, während Sie versuchen, eine Funktion zu implementieren.

Wenn jeder Entwickler in Ihrem Projekt Zeit mit dem Schreiben von Unit-Tests ausgegeben, dann wird diese 16 Schichten (Indirektionsebene) wären nicht so viel von einem Problem. Hoffentlich sollten Sie diese Testabdeckung von Anfang an, nicht wahr? :)

Auch vergessen Sie nicht, eine Funktion / Integrationstest zwischen Objekten in Zusammenarbeit zu schreiben. Sonst könnte verpassen Sie etwas aus. Diese Tests werden nicht müssen oft ausgeführt werden, sind aber nach wie vor wichtig.

Auf einer Skala, ja, sind Mocks gemeint verwendet werden, um externe Datenquellen zu simulieren, wie eine Datenbank oder einen Webdienst. Auf einer feinkörnige Skala jedoch, wenn Sie lose gekoppelten Code sind entwerfen, dann können Sie Linien im gesamten Code ziehen fast willkürlich, was an jedem Punkt könnte ein ‚außerhalb System‘ sein. Nehmen Sie ein Projekt arbeite ich auf aktuell:

Wenn jemand zu lesen versucht, die CheckInUi sendet ein CheckInInfo Objekt zu einem CheckInMediator Objekt, das sie validiert mit einem CheckInValidator , dann, wenn es in Ordnung ist, füllt es ein Domain-Objekt mit dem Namen Transaktion mit CheckInInfo mit CheckInInfoAdapter übergibt dann den Transaktions zu einer Instanz von ITransactionDao.SaveTransaction () für die Persistenz.

ich jetzt schreibe einige automatisierte Integrationstests und natürlich die CheckInUi und ITransactionDao sind Fenster zu externen Systemen und sie sind diejenigen, die verspottet werden sollte. das jedoch, dass irgendwann sagen CheckInValidator wird nicht einen Anruf an einen Web-Service wird zu machen? Deshalb, wenn Sie schreiben Unit-Tests Sie davon ausgehen, dass alles andere als die spezifische Funktionalität Ihrer Klasse ist ein externes System. Daher in meiner Unit-Test von CheckInMediator Ich verspotten alle Objekte, die es spricht.

EDIT: Gishu ist technisch korrekt, nicht alles muss verspottet werden, weiß ich nicht zum Beispiel Mock CheckInInfo , da es einfach ein Container für Daten. Doch alles, was Sie jemals als externer Dienstleister sehen konnte (und es ist fast alles, was Daten oder hat Nebenwirkungen verwandelt) sollte verspottet werden.

Eine Analogie, die Ich mag ist ein richtig loser gekoppelten Design als ein Feld zu denken, mit den Menschen um ihn herum stehen ein Fangspiel zu spielen. Wenn jemand den Ball übergeben wird er einen ganz anderen Ball an die nächsten Person werfen könnte, könnte er sogar ein mehr Bälle nacheinander an verschiedenen Personen werfen oder einen Ball werfen und warten, um es wieder zu empfangen, bevor es noch einen andere Person zu werfen. Es ist ein seltsames Spiel.

Jetzt als Trainer und Manager, möchten Sie natürlich überprüfen, wie Ihr Team als Ganzes funktioniert, so dass Sie Team Praxis (Integrationstests) haben, aber Sie haben auch jeden Spieler Praxis auf eigene Faust gegen Rücklaufsperren und Ball-Pitching-Maschinen ( Komponententests mit mocks). Das einzige Stück, das das Bild fehlt, ist Mock Erwartungen und so haben wir unsere Bälle mit schwarzem Teer verschmiert, so dass sie den Anschlag färben, wenn sie es getroffen. Jeder Anschlag hat ein ‚Zielgebiet‘, dass die Person, und wenn am Ende eines Trainingslaufes strebt gibt es keine schwarze Markierung innerhalb des Zielbereiches Sie wissen, dass etwas falsch ist und die Person braucht, um seine Technik abgestimmt.

Wirklich die Zeit nehmen, um es richtig zu lernen, ich den Tag verstand Mocks ein riesiger war a-ha Moment. Kombinieren Sie es mit einer Umkehrung des Steuerbehälters und ich werde nie wieder.

Auf einer Seite zur Kenntnis, einer unserer IT-Mitarbeiter kam gerade und gab mir einen kostenlosen Laptop!

Als jemand gesagt, wenn man alles verspotten detaillierteren zu isolieren, als die Klasse, die Sie testen sind, geben Sie den Zusammenhalt in Sie Code Durchsetzung up, die im Test ist.

Beachten Sie, dass spöttisch einen wesentlichen Vorteil hat, Verhalten Überprüfung. Das ist etwas, Stubs nicht bieten und ist der andere Grund, dass der Test brüchiger macht (aber kann Codeabdeckung verbessern).

Mocks wurde zum Teil erfunden, um : Wie würden Sie Unit-Test-Objekte, wenn sie hatten keine Getter oder Setter

In diesen Tagen Praxis empfohlen ist Mock Rollen keine Objekte. Verwenden Sie Mocks als Design-Tool über die Zusammenarbeit und die Trennung von Verantwortlichkeiten und nicht als „smart Stubs“ zu sprechen.

Mock-Objekte werden 1) oft als Mittel verwendet, um den im Test befindlichen Code zu isolieren, ABER 2) als keithb bereits erwähnt, sind wichtig, um " Fokus auf die Beziehungen zwischen den Prozessobjekten “. Dieser Artikel gibt einen Einblick und die Geschichte rund um das Thema: Verantwortung Driven Design mit Mock-Objekten .

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