Frage

Ich habe mich gefragt, was andere Ansätze zum Testen von Domain-Service für eine Datenbank haben könnte? Ich habe bereits eine Reihe von Mock-Repositories, die ich in der Lage bin in den Domain-Dienste nutzen, um die Domain-Dienste selbst zu testen. Ein Teil der Konstruktion dieses Mock-Repositories ist, dass sie Proben Aggregate und assoziierten Unternehmen aufzubauen und validieren sie gegen die gleichen Geschäftsregeln, die sonst innerhalb des Modells verwendet werden würden. Dies bietet auch ein schönes und einfache Mittel mögliche Auswirkungen Punkte innerhalb der Einheiten zu erfassen, selbst in dem Fall, dass ihre Schnittstellen zu ändern.

Das Hauptproblem, das ich mit Live-Tests meiner SQL-basierte Repositorys sehen, ist die Konsistenz der Datenbank. Zum Beispiel wird einmal ein Test der „create“ Aspekte läuft bereits ausgeführt werden. sie wieder laufen würde offensichtlich Fehler verursachen, da die Datenbank nicht mehr unberührte ist. Ich erwäge eine gespiegelte Datenbank nur für diese Art von Tests verwendet erstellen. Es wäre minimal, enthaltende Struktur, Programmierbarkeit, Einschränkungen, etc. Ich würde auch eine minimale Menge von Daten für bestimmte etablierte Tests zur Verfügung stellen. Meine Linie des Denkens ist, dass ich eine gespeicherte Prozedur haben könnte, die ich nennen könnte die Datenbank auf den „ursprünglichen“ Zustand mit Basisdaten vor dem Start des Testlaufs zurückgesetzt werden.

Dies ist zwar nicht so wichtig, auf einer Entwicklermaschine ist nach der Funktionalität zunächst überprüft wurde, suche ich mehr in die Bedeutung dieser Tests als Teil des Nightly Build laufen; so dass im Fall eines fehlgeschlagenen Tests könnte die Build zurückgehalten wird, wie nicht die Zieleinsatzumgebung Foul (speziell in diesem Fall würde es die Umwelt sein, dass das Testteam verwendet).

Ich glaube nicht unbedingt, dass die Plattform Angelegenheiten, aber im Falle hat jemand Implementierung spezifische Anliegen, meine Umgebung sieht wie folgt aus:

Windows 7 (Entwicklung) / Windows Server 2008 R2 (Server) Visual Studio 2008 Team Edition (C #) Microsoft SQL Server 2008 Standard (Entwicklung / Server)

Ich bin mit Team Build laufen meine baut, aber das ist wahrscheinlich kein Faktor im Rahmen der Frage.

War es hilfreich?

Lösung

  

Zum Beispiel, wenn ein Test der „create“ lief Aspekte haben laufen bereits. sie wieder laufen würde offensichtlich Fehler verursachen, da die Datenbank nicht mehr unberührte ist.

Vielleicht könnten Sie Ihre Unit-Tests Transaktions machen. Führen Sie Ihre Tests, rollen sie zurück, und die Datenbank unverändert.

Frühling hat Transaktions Unit-Test-Klassen, die diese einfach zu tun zu machen. Sie brauchen nur einen Transaktionsmanager.

Andere Tipps

Sie können mit SQL Server Express (I‘ habe es getan mit 2005, aber habe nicht versucht, mit 2008) „Testplattform“ Datenbanken einrichten, die als Dateien gespeichert werden. Diese können in der Quellcodeverwaltung überprüft werden, dann Testhilfsklassen können (a) kopieren Sie sie in temporäre Ordner, (b) Schreib ermöglichen ihnen, und (c) eine Verbindung zu ihnen. Um den ursprünglichen Zustand, löschen Sie die temporäre Kopie wiederherstellen und wiederholen Sie a-c.

Dies ist ein großer Schmerz. Wenn Sie können mit Transaktionen erhalten, indem (wie duffymo vorgeschlagen) ich damit gehen würde. Die Schmerzpunkte mit Transaktionen sind verschachtelte Transaktionen und verteilte diejenigen - achten Sie auf die im Code

.

Sie können eine Reihe von Daten Fabriken in Testcode erstellen, die zunächst beim Start des Testlaufs laufen. Dann nutzen Sie die Transaktion Rollback-Methode es ursprünglich zu halten. Um es einfacher, eine Unterklasse alle Testklassen und legen Sie die Transaktion Accessor und Rollback-Code drin. Rollback Code kann so eingestellt werden, um automatisch bei Beendigung eines jeden Testverfahren ausgeführt werden.

, wenn Sie tatsächlich die Ausführung von Unit-Tests für das Repository werden, die eine Datenbank schlagen, TUN SIE NICHT Unit-Tests. Es könnte ein hilfreicher Test, aber es ist kein Gerät zu testen. Das ist ein Integrationstest. Wenn Sie das tun wollen und es einen Integrationstest nennt, dann ist das völlig in Ordnung. Wenn Sie jedoch sind folgende gute Design-Prinzipien in Ihrer Repositorys, dann müssen Sie nicht auf die Datenbank zu testen, überhaupt, in der Unit-Tests.

Ganz einfach, Ihr Repository Unit-Test ist nicht zu testen, was breite Effekte in der Datenbank auftreten, am Eingang in das Repository basiert; es wird bestätigt, dass die Eingabe in das Repository zu einem Aufruf zu einem Mitarbeiter mit so und so einer Reihe von Werten.

Sie sehen, das Repository, wie der Rest des Codes, sollte das Einzel reposibility Prinzip folgen. Grundsätzlich wird Ihre respoitory haben eine und nur eine reposibility und das ist auf Domänenmodell API Bedenken auf die zugrunde liegende Datenzugriff technoloy Schicht zu vermitteln (in der Regel ADO.Net können aber Entity Framework oder L2S oder was auch immer sein). Möchten Sie das Beispiel von ADO.Net Anrufen, sollte Ihr Repository nimmt nicht an der Verantwortung eine Fabrik für die Datenschicht zu sein und stattdessen eine Abhängigkeit von einem Mitarbeiter aus den ADO.Net Datenschnittstellen nehmen sollte (speziell IDbConnection / IDbCommand / IDbParameter usw). Nehmen Sie einfach einen IDbConnection als Konstruktorparameter und nennen es einen Tag. Dies bedeutet, dass Sie Repository Unit-Tests gegen die Schnittstellen und Versorgungs Mocks (oder Fälschungen oder Stubs oder was auch immer Sie benötigen) schreiben kann, und bestätigen, dass die erforderlichen Methoden, um mit den erwarteten Eingaben gemacht werden. Go check out my MS Blog auf genau dieses Thema -> http://blogs.msdn.com/b/schlepticons/archive/2010/07/20/unit-testing-repositories-a-rebuttal.aspx

Hopfully dies hilft Ihnen aus macht einen Fehler in dem Test- und Design in der Zukunft.

BTW: Wenn Sie Einheit wollen die Datenbank testen Sie können. Verwenden Sie einfach Visual Studio Database Tests. Seine eingebaute INTO vs und gibt es schon seit VS2005. Das ist nichts Neues. Aber ich muss Sie warnen, sie müssen Tests vollständig SEPERATE Einheit.

Wenn Ihr Code ziemlich Datenbank unabhängig ist, unter Verwendung eines In-Memory-Datenbank wie SQLite für Unit-Tests (nicht Integrationstests) werden Ihnen die Vorteile der Geschwindigkeit und Leichtigkeit (Ihre Testaufbauten initialisieren db).

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