Ich hatte in letzter Zeit viele Gelegenheiten, in denen ich komplexe gespeicherte Prozeduren und Funktionen verwalten musste. Diese waren bereits kaputt, normalerweise auf ziemlich subtile Weise - es gab nur sehr wenige Fälle, in denen Sie den SP mit gültigen Parametern aufriefen, und es funktionierte einfach nicht.
Meine Lösung bestand darin, ein Rahmenwerk zu entwickeln, das die gespeicherten Prozeduren innerhalb einer Transaktion ausführt, nachdem die Datenbank unter den von mir benötigten Anfangsbedingungen initialisiert und dann auch innerhalb derselben Transaktion auf das erwartete Ergebnis getestet wurde. Die Transaktion wurde am Ende des Tests zurückgesetzt.
Das hat sehr gut funktioniert. Einige würden dies jedoch als "Integrationstest" bezeichnen, da es sich um die Integration in die Datenbank handelt. Ich nenne es Unit-Test, da ich einzelne Komponenten und einzelne Testfälle für diese Komponenten getestet habe und den Anfangszustand der Datenbank vollständig kontrolliert habe.
Aber wo soll die Linie gezogen werden? Handelt es sich um Integrationstests oder Unit-Tests? Gibt es einen praktischen Grund, warum diese Art von Test eine schlechte Idee ist? Wenn dies "nur" Integrationstests sind, hat jemand Vorschläge, wie tatsächliche "Unit-Tests" für diese gespeicherten Prozeduren durchgeführt werden können?
Update, 3 1/2 Jahre später. Bei meinem aktuellen Projekt habe ich mit Erfolg begonnen, SSDT-Komponententests zu verwenden, obwohl diese besser sein könnten. Siehe Überprüfen des Datenbankcodes mithilfe von SQL Server-Komponententests . Diese stellen das Datenbankprojekt normalerweise auf Ihrer Instanz von SQL Server LocalDB bereit, sodass alle Fragen zur Datenbankumgebung, die sich auf den Test auswirken, beseitigt werden. Ich fülle die Datenbank während des Vortests mit den erforderlichen Daten, wodurch Fragen zum Datenbankinhalt entfernt werden. Tatsächlich verwende ich dazu MERGE-Anweisungen, um sicherzustellen, dass alle Daten, die ich für den aktuellen Test nicht benötige, vor dem Test aus der Datenbank entfernt, eingefügt oder aktualisiert werden. Sie haben Probleme:
- Sie sind nicht schnell
- Es ist nicht möglich, Testbedingungen wiederzuverwenden
- Es ist nicht möglich, Vortests wiederzuverwenden (es sei denn, Sie machen sie allen Tests in einem Projekt gemeinsam).
- Die Benutzeroberfläche könnte verbessert werden
Einer der Gründe für die oben genannten Probleme ist, dass ich mich noch nicht darüber beschwert habe. Ich empfehle allen Interessierten, diese Funktion auszuprobieren und sich dann darüber zu beschweren. So werden Verbesserungen vorgenommen.