0

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

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

有解决方法吗?

第一个功能:

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

更新:当我从 GUI 上单击 Clear 夹具时,测试数据被重新加载,但有没有办法在没有 GUI 的情况下做到这一点?

4

1 回答 1

0

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

这是不可能的,因为 NUnit 在执行之前很久就创建了测试。NUnit 将在我们所谓的“加载时间”调用您的 TestCaseSource 方法,此时 NUnit 决定存在哪些测试并填充 GUI(如果您使用一个)。

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

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

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

于 2016-09-01T16:36:54.453 回答