Ich arbeite mit einer Vielzahl von Webanwendungen, die von Datenbanken unterschiedlicher Komplexität im Backend gesteuert werden. Typischerweise gibt es eine ORM Schicht, die von der Geschäfts- und Präsentationslogik getrennt ist. Dies macht das Unit-Testing der Geschäftslogik recht einfach; die Dinge können in diskreten Modulen implementiert werden und alle für den Test benötigten Daten können durch Objekt-Mocking gefälscht werden.
Aber das Testen des ORM und der Datenbank selbst war schon immer mit Problemen und Kompromissen behaftet.
Im Laufe der Jahre habe ich einige Strategien ausprobiert, von denen mich keine wirklich zufrieden gestellt hat.
-
Laden Sie eine Testdatenbank mit bekannten Daten. Führen Sie Tests gegen den ORM durch und bestätigen Sie, dass die richtigen Daten zurückkommen. Der Nachteil dabei ist, dass Ihre Test-DB mit allen Schemaänderungen in der Anwendungsdatenbank Schritt halten muss und daher möglicherweise nicht mehr synchron ist. Außerdem ist sie auf künstliche Daten angewiesen und kann Fehler, die durch dumme Benutzereingaben entstehen, nicht aufdecken. Und schließlich, wenn die Testdatenbank klein ist, werden Ineffizienzen wie ein fehlender Index nicht aufgedeckt. (OK, der letzte Punkt ist nicht wirklich das, wofür Unit-Tests verwendet werden sollten, aber es kann nicht schaden).
-
Laden Sie eine Kopie der Produktionsdatenbank und testen Sie mit dieser. Das Problem dabei ist, dass Sie möglicherweise keine Ahnung haben, was sich zu einem bestimmten Zeitpunkt in der Produktions-DB befindet; Ihre Tests müssen möglicherweise neu geschrieben werden, wenn sich die Daten im Laufe der Zeit ändern.
Einige Leute haben darauf hingewiesen, dass diese beiden Strategien auf bestimmten Daten beruhen und dass ein Einheitstest nur die Funktionalität testen sollte. Zu diesem Zweck habe ich gesehen, vorgeschlagen:
- Verwenden Sie einen Mock-Datenbankserver und überprüfen Sie nur, ob der ORM die richtigen Abfragen als Antwort auf einen bestimmten Methodenaufruf sendet.
Welche Strategien haben Sie für das Testen datenbankgestützter Anwendungen verwendet, wenn überhaupt? Was hat sich für Sie am besten bewährt?