2010-10-26 8 views
5

Dies hat wahrscheinlich viele Male, aber hier geht es gefragt worden:Wie Unit-Test-Datenbank Klasse

Ich habe eine Klasse voller db Verbindungen

offene Verbindung
Abfrage db
gelesenen Werte
schließen Verbindung

Wie soll ich dieses Zeug testen?

Muss ich eine gefälschte Datenbank erstellen? Ich denke, ich könnte die MySql-Klassen (für C#) verspotten, aber das ist auch eine Menge Arbeit.

Einige der Aussagen sind "INSERT INTO", was soll ich dagegen tun?

+3

Wenn Sie denken, dass eine Frage möglicherweise vor Ihnen gestellt wurde, sollten Sie [danach suchen] (http://stackoverflow.com/search?q=unit+test+database+class). – meagar

Antwort

7

Stuff, die schwer zu testen sind, ist oft tightly coupled oder nicht nach Single Responsibility principle.

Zunächst einmal. Teilen Sie Ihre Datenebene auf. Schau dir die repository pattern an. Jede Entität (Tabelle oder Sicht) sollte ihre eigene Klasse haben, die Daten holt.

Verwenden Sie anstelle der spezifischen Treiberimplementierung Datenschnittstellen: IDbConnection anstelle von SqlConnection. Verwenden Sie DbProviderFactory, um die richtige Verbindungsimplementierung zu erhalten. Verwenden Sie dann connection.CreateCommand(), um einen Befehl usw. zu erhalten.

All dies würde es viel einfacher machen, Ihre Datenschicht zu testen. Und denken Sie daran, der Datylyer sollte keine Logik haben. Es dient nur dem Laden von Daten aus einer Datenquelle.

Aber wenn Sie nicht Dinge ändern wollen: Arbeiten gegen eine Datenbank ist der einfachste Weg. Entfernen Sie alle Daten und fügen Sie vor jedem Test neue Testdaten ein (um Änderungen während eines vorherigen Tests zu entfernen).

+0

ok, aber achten Sie darauf, ob diese Komponententests parallel ausgeführt werden - zu diesem Zeitpunkt löscht der zweite Test die für den ersten Test erforderlichen Daten. Dies kann passieren, wenn das Testframework geändert wird oder wenn eine neue Version die Testausführungssequenz ändert. Ich habe dieses Problem in letzter Zeit gelöst. –

2

Am einfachsten wäre es, eine neue Test-DB zu erstellen und einige Insert-Querys zu erstellen und dann die Ergebnismengen in einer Liste oder etwas zu speichern und dann mit dem Debugger zu starten, um zu sehen, ob das Resultset in der Liste gespeichert ist erstellt.

Haben Sie keine intsert in den Quellcode, verwenden Sie sql Management Studios und machen Sie stattdessen die Einsätze dort, bis Sie wissen, dass die Verbindungen und alles funktioniert. Einfach alle diese Werte vorläufig tabellieren.

0

Sie können eine Live-MySql-Datenbank verwenden, die lokal auf Ihrem Computer ausgeführt wird.

Ich habe ein Nuget Paket für diesen Zweck gemacht, dass Sie zu Ihrem Projekt hinzufügen können: https://github.com/stumpdk/MySql.Server

Es beginnt einem lokalen MySQL-Server jedes Mal, wenn Sie Ihre Tests laufen. Es ist schnell, gibt eine Lösung, die Ihr Team teilen kann, und Sie müssen Ihre Zeit nicht damit verbringen, einen Server zu installieren.

Verwandte Themen