Использование вывода тестового объекта [ValueSourceAttribute] в следующем тесте
Я разрабатываю проект модульного теста, в котором я создаю элемент в тесте, а затем создаю для него вспомогательные элементы в следующем тесте.
Эти тесты являются параметризованными тестами, и эти параметры собираются во время выполнения, поэтому при запуске проекта он запускается. Не удается получить родительский элемент из базы данных, потому что они еще не созданы, "поскольку я еще не выполнил первый тест".
Есть ли обходной путь для этого?
Первая функция:
[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, тестовые данные были перезагружены, но есть ли способ сделать это без графического интерфейса?
1 ответ
Обычно в модульных тестах плохая практика, когда один тест зависит от другого теста (т. Е. Использует выходные данные). В этом случае с NUnit это фактически невозможно.
Это невозможно, потому что NUnit создает тесты задолго до их выполнения. NUnit будет вызывать ваши методы TestCaseSource в то, что мы называем "временем загрузки", когда NUnit решает, какие тесты существуют, и заполняет графический интерфейс, если вы его используете.
Код в ваших тестах выполняется во время выполнения тестов. В графическом интерфейсе это может происходить несколько раз для каждой загрузки - например, при каждом нажатии кнопки "Выполнить".
Обратите внимание, что я объясняю это в терминах графического интерфейса, потому что это простой способ его концептуализации. NUnit работает одинаково, независимо от того, работаете ли вы в пакетном режиме или в интерактивном режиме.
Если вы хотите, чтобы что-то произошло только один раз, перед запуском каких-либо тестов вы можете использовать OneTimeSetUp (TestFixtureSetUp в NUnit V2) для его настройки. Вы можете использовать члена класса, чтобы сохранить все, что вам нужно, от этого выполнения и получить к нему доступ из ваших тестов. Однако это все равно произойдет во время выполнения, спустя десятилетия (в компьютерном выражении) после загрузки ваших тестов.