Ich codiere Tests in C # und habe mich mit dieser Struktur abgefunden:
try
{
// ==========
// ARRANGE
// ==========
// Insert into the database all test data I'll need during the test
// ==========
// ACT
// ==========
// Do what needs to be tested
// ==========
// ASSERT
// ==========
// Check for correct behavior
}
finally
{
// ==========
// CLEANUP
// ==========
// Inverse of ARRANGE, delete the test data inserted during this test
}
Das Konzept war "jeder Test räumt das Chaos auf, das er macht". Bei einigen Tests bleibt die Datenbank jedoch verschmutzt, und die folgenden Tests schlagen fehl.
Was ist der richtige Weg, um dies zu tun? (Fehler minimieren, Laufzeit minimieren)
- Deletes everything» Insert defaults» Insert test data»Test durchführen?
Insert defaults» Insert test data» Test ausführen » Delete everything?
Derzeit :
- (pro Sitzung) Deletes everything»Insert defaults
- (pro Test) Insert test data»Test ausführen»Delete test data
Das große Problem bei Datenbanken und (Unit-) Tests ist, dass Datenbanken so verdammt gut darin sind, Dinge zu persistieren.
Die übliche Lösung besteht darin, in Ihren Komponententests keine tatsächliche Datenbank zu verwenden, sondern die Datenbank zu verspotten oder eine In-Memory-Datenbank zu verwenden, die zwischen den Tests problemlos vollständig gelöscht werden kann.
Nur beim Testen des Codes, der direkt mit der Datenbank interagiert, oder bei End-to-End-Tests wird die tatsächliche Datenbank verwendet.
quelle
Auf einem C # -Server mit SQL Server und PetaPoco haben wir diesen Ansatz gewählt, um Daten in Unit-Tests zu bereinigen.
Ein typischer Unit-Test hätte Setup und Teardown wie folgt:
Wobei PlatformDataObject eine Klasse ist, die für die Kommunikation mit der Datenbank verantwortlich ist, z. B. für Select Insert Update Deletes. Alle * DataObject-Typen erben ServerDataObject - die Basisklasse verfügt über Methoden zum Abbrechen, Zurücksetzen oder Festschreiben der Transaktion.
Alle Komponententests würden RollbackTransaction () aufrufen und letztendlich IDbTransaction.Rollback () aufrufen.
In Tests haben wir festgestellt, dass es Routine ist, eine neue Instanz eines * DataObject zu erstellen, einige Zeilen mit Insert-Anweisungen zu erstellen, Tests für sie durchzuführen (Selects, Updates usw.) und dann ein Rollback durchzuführen.
Wir können eine Reihe von Testdaten einrichten, bevor alle Tests mit einem SetUpFixture ausgeführt werden - eine Klasse, die einmal ausgeführt wird, bevor alle Tests ausgeführt werden, und die Daten beim Herunterfahren löschen / zurücksetzen, nachdem alle Tests ausgeführt wurden.
quelle