2017-12-13 15 views
4

Ich habe Integrationstest mit MSTest eingerichtet. Meine Integrationstests erstellen gefälschte Daten und fügen sie in die Datenbank ein (echte Abhängigkeiten). Für jedes Business-Objekt, habe ich eine Methode, wie diese, die ein "Fake" erstellt und fügt es in der db:Integrationstest Mülldaten

public static EventAction Mock() 
{ 
    EventAction action = Fixture.Build<EventAction>().Create(); 
    action.Add(false); 
    AddCleanupAction(action.Delete); 
    AppendLog("EventAction was created."); 
    return action; 
} 

ich aufzuräumen alle Fälschungen in [AssemblyCleanup]:

public static void CleanupAllMockData() 
{ 
    foreach (Action action in CleanUpActions) 
    { 
     try 
     { 
      action(); 
     } 
     catch 
     { 
      AppendLog($"Failed to clean up {action.GetType()}. It is possible that it was already cleaned up by parent objects."); 
     } 
    } 
} 

Jetzt habe ich ein großes Problem. In meiner Continuous Integration-Umgebung (TeamCity) haben wir eine separate Datenbank zum Testen und sie bereinigt sich nach jedem Testlauf selbst. In meiner lokalen Umgebung verweisen die Integrationstests jedoch auf meine lokale Datenbank. Nun, wenn ich den Testlauf aus irgendeinem Grund abbricht, hinterlässt dies eine Menge von Mülldaten in meiner lokalen Datenbank, weil CleanupAllMockData() niemals aufgerufen wird.

Was ist der beste Weg, damit umzugehen? Ich konnte keine Möglichkeit finden, die Testannullierung in MSTest abzufangen.

+0

Sie könnten CleanupAllMockData() nach jedem Test ausführen? – Kris

+0

@Kris, zunächst habe ich es in [TestCleanup] ausgeführt, aber eine negative Auswirkung auf die Leistung festgestellt. Der Testlauf dauerte 20 Minuten vs ~ 6 Minuten, Aber wieder, wenn ich den Test absage, würden die Fälschungen nicht aufgeräumt werden. –

Antwort

1

Ich sehe zwei Möglichkeiten zur Lösung Ihres Problems:

  1. Cleanup Mock Daten vor jedem Start. Nur vor dem Start.
  2. Jeder Test wird als db-Transaktion umschlossen, die nie festgeschrieben wird. Ich erkläre diese Option here
+0

Würde der zweite Ansatz im folgenden Szenario funktionieren? Ich möchte eine Reihe von Datensätzen in DB hinzufügen, dann möchte ich diese Datensätze auswählen, um zu bestätigen. –

+0

@ Shervin Shahrdar, ja. Ja, es wird innerhalb einer Testmethode funktionieren. Der Rollback der Transaktion wird nach dem Beenden des Verfahrens, d. Wenn Sie die hinzugefügten Zeilen zwischen den Testmethoden speichern müssen, müssen Sie etwas Ähnliches in den 'SetUp'- und' TearDown'-Methoden implementieren. –

+0

Ich habe beide Vorschläge ausprobiert. Die zweite hatte aus irgendeinem Grund ein kleines Leistungsproblem, und einige meiner Tests scheiterten, weil sie die Übertragung von Daten erforderten. Ich ging mit der ersten Option. Allerdings musste ich meinen gefälschten Datenbereinigungscode optimieren, um alle Abhängigkeiten zuerst zu entfernen, bevor das tatsächliche gefälschte Objekt entfernt wurde. Die Leistung ist jetzt akzeptabel. –