Ich arbeite mit vielen Webanwendungen, die von Datenbanken unterschiedlicher Komplexität im Backend gesteuert werden. In der Regel gibt es eine ORM- Schicht, die von der Geschäfts- und Präsentationslogik getrennt ist. Dies macht das Unit-Testen der Geschäftslogik ziemlich einfach; Dinge können in diskreten Modulen implementiert werden und alle Daten, die für den Test benötigt werden, können durch Objektverspottung gefälscht werden.
Das Testen des ORM und der Datenbank selbst war jedoch immer mit Problemen und Kompromissen behaftet.
Im Laufe der Jahre habe ich einige Strategien ausprobiert, von denen mich keine vollständig zufriedenstellte.
Laden Sie eine Testdatenbank mit bekannten Daten. Führen Sie Tests gegen das ORM durch und bestätigen Sie, dass die richtigen Daten zurückkommen. Der Nachteil hierbei ist, dass Ihre Test-DB mit allen Schemaänderungen in der Anwendungsdatenbank Schritt halten muss und möglicherweise nicht mehr synchron ist. Es basiert auch auf künstlichen Daten und deckt möglicherweise keine Fehler auf, die aufgrund dummer Benutzereingaben auftreten. Wenn die Testdatenbank klein ist, werden keine Ineffizienzen wie ein fehlender Index angezeigt. (OK, das letzte ist nicht wirklich das, wofür Unit-Tests verwendet werden sollten, aber es tut nicht weh.)
Laden Sie eine Kopie der Produktionsdatenbank und testen Sie diese. Das Problem hierbei ist, dass Sie möglicherweise zu keinem Zeitpunkt eine Ahnung haben, was sich in der Produktionsdatenbank 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 beide Strategien auf bestimmten Daten beruhen und ein Komponententest nur die Funktionalität testen sollte. Zu diesem Zweck habe ich vorgeschlagen gesehen:
- Verwenden Sie einen nachgebildeten Datenbankserver und überprüfen Sie nur, ob der ORM die richtigen Abfragen als Antwort auf einen bestimmten Methodenaufruf sendet.
Welche Strategien haben Sie zum Testen datenbankgesteuerter Anwendungen verwendet, falls vorhanden? Was hat bei Ihnen am besten funktioniert?