在以下测试中使用[ValueSourceAttribute] Nunit Test的输出

时间:2016-09-01 13:30:18

标签: nunit nunit-console parameterized-unit-test

我正在开发一个单元测试项目,我在测试中创建一个项目,然后在下面的测试中为它创建子项目。

这些测试是参数化测试,这些参数是在运行时收集的,因此当项目启动时它会启动。它无法从数据库中检索父项,因为它们尚未创建“因为我还没有运行第一个测试”。

有解决方法吗?

第一个功能:

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

第二个失败的功能:

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

更新:当我从Clear fixture上的GUI点击时,重新加载了测试数据,但是没有GUI可以实现这一点吗?

1 个答案:

答案 0 :(得分:0)

在单元测试中通常不好的做法是让一个测试依赖于(即使用另一个测试的输出)。在这种情况下,使用NUnit,实际上是不可能的。

这是不可能的,因为NUnit在执行之前很久就会创建测试。当NUnit决定存在哪些测试时,NUnit将在我们称之为“加载时间”的位置调用TestCaseSource方法,如果使用的话,则填充GUI。

测试中的代码在测试的“运行时”执行。在gui中,每次加载时可能会多次发生这种情况 - 例如,每次单击“运行”时。

请注意,我是根据GUI解释这一点,因为它是一种简单的概念化方法。无论您是批量运行还是以交互方式运行,NUnit的工作方式都相同。

如果您希望某些事情只发生一次,那么在运行任何测试之前,您可以使用OneTimeSetUp(NUnit V2中的TestFixtureSetUp)进行设置。您可以使用该类的成员来保存该执行所需的任何内容,并从您的测试中访问它。但是,这仍然会在加载测试后的“运行时间”,数十年(以计算机术语)发生。