Использование вывода тестового объекта [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) для его настройки. Вы можете использовать члена класса, чтобы сохранить все, что вам нужно, от этого выполнения и получить к нему доступ из ваших тестов. Однако это все равно произойдет во время выполнения, спустя десятилетия (в компьютерном выражении) после загрузки ваших тестов.

Другие вопросы по тегам