在以下测试中使用 [ValueSourceAttribute] Nunit 测试的输出
Using the output of a [ValueSourceAttribute] Nunit Test in the following Test
我正在开发一个单元测试项目,我在测试中创建一个项目,然后在接下来的测试中为其创建子项目。
这些测试是参数化的测试,这些参数是在运行时收集的,所以项目一启动就启动。它无法从数据库中检索父项,因为它们尚未创建 "as I haven't run the first test yet"。
有解决办法吗?
第一个函数:
[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 中单击清除夹具时,测试数据被重新加载,但是有没有办法在没有 GUI 的情况下做到这一点?
在单元测试中,让一个测试依赖(即使用来自)另一个测试的输出通常是不好的做法。在这种情况下,使用 NUnit,实际上是不可能的。
这是不可能的,因为 NUnit 在测试执行之前很久就创建了测试。当 NUnit 决定存在哪些测试并填充 GUI 时,NUnit 将在我们称之为 "load time" 处调用您的 TestCaseSource 方法。
测试中的代码在 "run time" 执行测试。在 gui 中,这可能会在每次加载时发生多次 - 例如,每次单击 运行 时。
请注意,我是根据 GUI 对此进行解释的,因为这是一种将其概念化的简单方法。无论您是 运行 批处理还是交互式,NUnit 的工作方式都是一样的。
如果您希望某事只发生一次,在任何测试之前 运行,您可以使用 OneTimeSetUp(NUnit V2 中的 TestFixtureSetUp)进行设置。您可以使用 class 的成员来保存您从该执行中需要的任何内容,并从您的测试中访问它。但是,这仍然会在 "run time",加载测试后几十年(以计算机术语)发生。
我正在开发一个单元测试项目,我在测试中创建一个项目,然后在接下来的测试中为其创建子项目。
这些测试是参数化的测试,这些参数是在运行时收集的,所以项目一启动就启动。它无法从数据库中检索父项,因为它们尚未创建 "as I haven't run the first test yet"。
有解决办法吗?
第一个函数:
[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 中单击清除夹具时,测试数据被重新加载,但是有没有办法在没有 GUI 的情况下做到这一点?
在单元测试中,让一个测试依赖(即使用来自)另一个测试的输出通常是不好的做法。在这种情况下,使用 NUnit,实际上是不可能的。
这是不可能的,因为 NUnit 在测试执行之前很久就创建了测试。当 NUnit 决定存在哪些测试并填充 GUI 时,NUnit 将在我们称之为 "load time" 处调用您的 TestCaseSource 方法。
测试中的代码在 "run time" 执行测试。在 gui 中,这可能会在每次加载时发生多次 - 例如,每次单击 运行 时。
请注意,我是根据 GUI 对此进行解释的,因为这是一种将其概念化的简单方法。无论您是 运行 批处理还是交互式,NUnit 的工作方式都是一样的。
如果您希望某事只发生一次,在任何测试之前 运行,您可以使用 OneTimeSetUp(NUnit V2 中的 TestFixtureSetUp)进行设置。您可以使用 class 的成员来保存您从该执行中需要的任何内容,并从您的测试中访问它。但是,这仍然会在 "run time",加载测试后几十年(以计算机术语)发生。