2016-09-01 4 views
0

Ich entwickle ein Komponententestprojekt, bei dem ich ein Element in einem Test erstelle und dann im folgenden Test Unterelemente dafür erstelle.Mit der Ausgabe eines [ValueSourceAttribute] -Nunit-Tests im folgenden Test

Bei diesen Tests handelt es sich um parametrisierte Tests, und diese Parameter werden in der Laufzeitumgebung erfasst, sodass sie beim Start des Projekts gestartet werden. Es kann das übergeordnete Element nicht aus der Datenbank abrufen, da sie noch nicht erstellt wurden, "da ich den ersten Test noch nicht ausgeführt habe".

Gibt es einen Workaround dafür?

Die erste Funktion:

[Test, Sequential] 
public void AddInitiative([ValueSourceAttribute("Get_AddInitiatives_Data_FromExcel")]AddInitiative Initiative_Object) 
{ 
     string URL = "http://" + Server_name + Port_number + "/IntegrationHub/IntegrationHub.svc/RestUnsecure/AddInitiative"; 
     string Token = Get_Security_token("gpmdev\\administrator", "Xyz7890", TenantID_Input); 
     var Response = POST_Request(Initiative_Object, URL, Token); 
     Guid Returned_GUID = GenericSerializer<Guid>.DeserializeFromJSON(Response); 
     DataBase_Queries DB = new DataBase_Queries(); 
     List<StrategyItem> StrategyItemsFromDB=DB.GetStrategyItemByID(Returned_GUID.ToString()); 
     Assert.AreEqual(Initiative_Object.Initiative.Name_En, StrategyItemsFromDB[0].Name_En); 
} 

Die zweite Funktion, die fehlschlägt:

[Test, Sequential] 
public void AddInitiativeMilestones([ValueSourceAttribute("Get_AddInitiativeMilestones_Data_FromExcel")]AddMilestone Milestone_Object) 
{ 
     string URL = "http://" + Server_name + Port_number + "/IntegrationHub/IntegrationHub.svc/RestUnsecure/AddInitiativeMilestones"; 
     string Token = Get_Security_token("gpmdev\\administrator", "Xyz7890", TenantID_Input); 
     var Response = POST_Request(Milestone_Object, URL, Token); 
     List<Milestone> Returned_Milestone = GenericSerializer<List<Milestone>>.DeserializeFromJSON(Response); 
     DataBase_Queries DB = new DataBase_Queries(); 
     List<StrategyItem> StrategyItemsFromDB = DB.GetStrategyItemByID(Returned_Milestone[0].ID.ToString()); 
     Assert.AreEqual(Milestone_Object.Milestones[0].Name_En, Returned_Milestone[0].Name_En); 
     Assert.AreEqual(Milestone_Object.Milestones[0].Name_En,StrategyItemsFromDB[0].Name_En); 
} 

Update: Wenn ich von der GUI auf Löschen geklickt fixture wurden die Testdaten neu geladen, aber gibt es da einen Weg, das ohne GUI zu machen?

Antwort

0

Es ist allgemein eine schlechte Praxis in Komponententests, dass ein Test von einem anderen Test abhängt (d. H. Verwendung von einem anderen Test). In diesem Fall ist es mit NUnit tatsächlich unmöglich.

Es ist unmöglich, weil NUnit Tests lange vor der Ausführung erstellt. NUnit ruft Ihre TestCaseSource-Methoden mit der so genannten Ladezeit auf, wenn NUnit entscheidet, welche Tests vorhanden sind, und füllt eine GUI, wenn Sie eine verwenden.

Der Code in Ihren Tests wird zu "Laufzeit" für die Tests ausgeführt. In einer gui kann dies mehrmals für jede Ladung passieren - jedes Mal, wenn Sie zum Beispiel auf Ausführen klicken.

Beachten Sie, dass ich dies in Bezug auf eine GUI erklären, weil es eine einfache Möglichkeit ist, es zu konzipieren. NUnit funktioniert auf die gleiche Weise, unabhängig davon, ob Sie im Stapelbetrieb oder interaktiv arbeiten.

Wenn Sie wollen, dass etwas nur einmal passiert, bevor Tests ausgeführt werden, können Sie OneTimeSetUp (TestFixtureSetUp in NUnit V2) verwenden, um es einzurichten. Sie können ein Mitglied der Klasse verwenden, um alles, was Sie von dieser Ausführung benötigen, zu speichern und über Ihre Tests darauf zuzugreifen. Dies geschieht jedoch immer noch zu "Laufzeit", also Jahrzehnten (nach Computern), nachdem Ihre Tests geladen wurden.