Warum schreiben wir Scheinobjekte, wenn wir Unit-Testfälle schreiben?

10

Wir schreiben derzeit Unit-Testfälle in unserem Projekt. Die Implementierungen für Datenbankmethoden sind vorhanden und funktionieren einwandfrei. Warum müssen wir in diesem Fall Scheinobjekte schreiben? Gibt es einen bestimmten Grund? Warum kann ich die DAO-Implementierung nicht direkt testen?

Vinoth Kumar CM
quelle

Antworten:

5

Sie sollten keine Aufrufe der Datenbank verspotten, da dies den Zweck zunichte machen würde. Was Sie verspotten sollten, sind beispielsweise Anrufe an Ihr DAO, beispielsweise von einer Service-Schicht. Durch das Verspotten können Sie Methoden isoliert testen.

Angenommen, Sie haben eine Restaurantsimulation mit einer Architektur wie dieser:

Cook <=> Server <=> Customer

Sie möchten jede Ebene einzeln testen. Hier Serverist das Ihre Serviceschicht und Cookkann als DAO betrachtet werden. Das Serverist, was Sie verspotten möchten, während Sie testen Customer, und das Cookist, was Sie verspotten möchten, während Sie das testen Server. Die CookUnit-Tests sollten jedoch sicherstellen, dass die Implementierung einen Hamburger zurückgibt, wenn ein Hamburger bestellt wurde, und keinen Gummireifen.

Tyler Treat
quelle
3
Ich bin mit der Aussage nicht einverstanden. Sie sollten keine Aufrufe der Datenbank verspotten, da dies den Zweck zunichte machen würde. weil es zu allgemein erscheint. Wie andere unten sagen, müssen Sie alles isoliert testen. Wenn das, was Sie Unit-Tests durchführen, der Datenbankzugriff ist, ist Ihr Kommentar sicher korrekt. Wenn das, was Sie Unit-Tests durchführen, kein Datenbankzugriff ist, ist Ihr erster Satz falsch. Ich stimme mit allem überein, was Sie sagen. +0. :-)
Peter K.
6

Es ist vollkommen in Ordnung, Businesslogic zusammen mit der Datenbank zu testen. Diese Tests werden jedoch auch dann als Integrationstests bezeichnet, wenn Sie diese mit nunit oder junit oder phpunit ausführen.

Unittests sind spezialisierte Tests, bei denen isolierte Tests (dh Geschäftslogik ohne Datenbank) wichtig sind. Mocks / Fakes / Stups werden verwendet, um diese Isolation zu erzwingen.

k3b
quelle
1

Ein weiterer Grund besteht darin, die Ausführungszeit für die tatsächliche Ausführung der Datenbankbefehle zu vermeiden. Es scheint nicht viel zu sein, aber der Aufwand für das Einrichten und Abbauen von Verbindungen wird sich letztendlich summieren und höchstwahrscheinlich die Gesamtzeit für die Ausführung der Testsuite im Vergleich zur Verwendung von Scheinobjekten erheblich verlängern.

Jeremy
quelle
1

Einfach: um das tatsächliche DAO und nicht den Datenbankinhalt zu testen.

Angenommen, Ihre DAO-Personenklasse verfügt über eine Methode getByName (). Sie schreiben einen Test und rufen Person.getByName ("John Smith") auf. Angenommen, der Test schlägt fehl, weil jemand Johns Datensatz aus der Datenbank entfernt hat. Jetzt können jede CI-Software und Ihre Vorgesetzten / Prüfer behaupten, dass Ihre Software fehlerhaft ist, in Wirklichkeit jedoch nicht. Wenn Sie DB verspotten, können Sie beweisen, dass Ihr DAO funktioniert, wenn es die richtige Zeile aus der richtigen Tabelle erhält.

Wenn Sie die Datenbank selbst wirklich testen möchten, dh wenn die Ausführung einer bestimmten DAO-Methode Daten in einen bestimmten Zustand versetzt, ist dies ebenfalls möglich. Darüber hinaus ist es bei verrückten Datenmodellen (EAV, verschachtelter Baumsatz) sehr hilfreich, bei denen Sie nicht erwarten können, dass die Datenbank eine kugelsichere Integrität bietet. Schauen Sie sich DBUnit an, um Ihnen das Leben zu erleichtern.

Jacek Prucia
quelle
0

So isolieren Sie die Klasse, die Sie testen. Wenn der Test fehlschlägt, woher wissen Sie, dass das Problem in der zu testenden Klasse oder einer ihrer Abhängigkeiten liegt?

Craig
quelle
Rufen Sie Methoden zur DAO-Implementierung direkt auf und testen Sie sie?
Vinoth Kumar CM