2016-09-01 2 views
0

Je développe un projet de test unitaire dans lequel je crée un élément dans un test, puis crée des sous-éléments pour le test suivant.Utilisation de la sortie d'un test Nunit [ValueSourceAttribute] dans le test suivant

Ces tests sont des tests paramétrés, et ces paramètres sont collectés dans le runtime. Ainsi, au démarrage du projet, il démarre. Il ne parvient pas à récupérer l'élément parent de la base de données car ils ne sont pas encore créés "car je n'ai pas encore exécuté le premier test".

Y a-t-il une solution de contournement pour cela?

La première fonction:

[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); 
} 

La deuxième fonction qui échoue:

[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); 
} 

Mise à jour: Quand je clique depuis l'interface graphique sur Effacer luminaire les données de test ont été rechargées, mais il y a un moyen de le faire sans l'interface graphique?

Répondre

0

Il est généralement mauvais dans les tests unitaires de faire dépendre un test (c'est-à-dire utiliser une sortie d'un autre test). Dans ce cas, avec NUnit, c'est en fait impossible.

C'est impossible parce que NUnit crée des tests bien avant qu'ils ne soient exécutés. NUnit appelle vos méthodes TestCaseSource à ce que nous appelons "load time" quand NUnit décide quels tests existent et remplit une interface graphique si vous en utilisez une.

Le code de vos tests s'exécute au moment de l'exécution des tests. Dans un GUI, cela peut arriver plusieurs fois pour chaque chargement - chaque fois que vous cliquez sur Exécuter, par exemple.

Notez que j'explique ceci en termes de GUI parce que c'est un moyen facile de le conceptualiser. NUnit fonctionne de la même manière, que vous soyez en mode batch ou interactif.

Si vous souhaitez que quelque chose ne se produise qu'une seule fois, avant d'exécuter des tests, vous pouvez utiliser OneTimeSetUp (TestFixtureSetUp dans NUnit V2) pour le configurer. Vous pouvez utiliser un membre de la classe pour sauvegarder ce dont vous avez besoin de cette exécution et y accéder à partir de vos tests. Cependant, cela se produira encore au «temps d'exécution», des décennies (en termes d'ordinateur) après que vos tests ont été chargés.