2009-07-30 7 views
0

Ich arbeite an einer Testumgebung für ein Projekt und untersuche DbUnit.NET, um einen Großteil der Datenbankinteraktionstests durchzuführen. Ich habe jedoch eine sehr große Frage:DbUnit, wie man sich gegen mehrere gleichzeitig laufende Tests schützt?

Wir laufen gegen Oracle, und die Einrichtung einer separaten Test-DB-Instanz für jeden Entwickler ist wirklich nicht machbar (vor allem, da wir nur 1 DBA haben, der schon für Zeit geschnallt ist) . Dies bedeutet, dass alle Entwickler und der Continuous Integration Server dasselbe DB-Schema verwenden müssen.

Also, auf die Frage: Gibt es einen guten Weg zu verhindern, dass mehr als 1 Person zur gleichen Zeit testen? Es wäre einfach, einen Datensatz in eine db-Tabelle zu schreiben, die anzeigt, dass ein Test ausgeführt wird, und ihn nach Abschluss der Tests zu entfernen, aber NUnit hat keine Möglichkeit, etwas beim Start und am Ende der Testsitzung auszuführen.

Irgendwelche anderen Gedanken? Es scheint, als sollte es ein ziemlich häufiges Problem sein ... oder läuft eigentlich jeder einzelne DB-Instanzen für jeden Entwickler/Tester, der die Tests ausführen könnte?

Antwort

1

Wir haben eine Dummy-Tabelle mit einem einzelnen Datensatz als Sperr-Token verwendet, als wir Datenbank-Tests für eine Gruppe von Entwicklern in einer gemeinsamen Datenbank ausgeführt haben. Tatsächlich haben wir die Sperre für jeden Testfall einzeln erworben, sodass ein Entwickler, der einen Testfall ausführen möchte, nicht auf einen anderen Entwickler warten muss, der die gesamte Suite zum Abschluss ausführt. Wir haben bei jedem Test eigene Daten erstellt - keine Übertragung zwischen den Testmethoden.

Wir haben den Datenbanksperrmechanismus verwendet, um Tests in die Warteschlange zu stellen, anstatt zu versagen, wenn ein anderer Benutzer bereits einen Test ausführt. Ich denke Oracle's Locking-Algorithmus ist etwas anders, also weiß ich nicht, wie das funktionieren würde.

Der einzige Ort, an dem Probleme auftraten, war, wenn ein Entwickler einen Test im Debug-Modus durchlaufen wollte. Das würde alle anderen Entwickler blockieren, die einen Test ausführen wollten, bis er den Debugger veröffentlicht hat. Wir schrieben den Namen des aktuellen Benutzers in eine Dummy-Tabelle und ließen den Sperrmechanismus eine Nachricht drucken, wenn sie länger als 30 Sekunden blockiert war: "Bob führt gerade einen Test durch und war in den letzten 5 Minuten."

Das war OK, aber es war eine Menge Arbeit zu warten. Wir haben versucht, die Anzahl der Datenbank-Tests klein zu halten und die meisten unserer Tests als reine Unit-Tests im Speicher durchzuführen.

+0

Dies ist im Grunde, was ich dachte, ich würde tun. Mein großes Problem ist, dass ich mit einer Menge Legacy pl/sql (viel mehr als 10k Zeilen Wert) zu tun habe und an fast jedem Tisch triggert, und alles ist zur Zeit nicht getestet. Also muss ich Oracle und all seine Trigger und Sprocs passieren, sonst würde ich gerne eine SQLite-Datenbank im Speicher erstellen ... Danke für die Eingabe! – CodingWithSpike

1

Sie können das Attribut [TestFixtureSetUp] verwenden, um Ihr Flag einzufügen, das anzeigt, dass Tests ausgeführt werden, um einen "echten" Semaphor zu simulieren.

0

Etwas, das ich mit einigen Ähnlichkeiten zu diesem in ein Problem haben:

Das Programm hatte eine Konfigurationsvariable, die auf der Vorderseite aller relevanten Elemente hinzugefügt wurde. Jede Station hatte ihre eigene Einstellung, richtig eingestellt würde es keine Konflikte geben.