Как правильно использовать тестовый код в MSTest - PullRequest
0 голосов
/ 29 марта 2020

Мы начали вводить некоторые тесты поведения, которые пытаются протестировать некоторые программные модули, например полный черный ящик. Этот набор тестов был написан с использованием наследования от базового класса тестирования для упрощения организации.

Теперь мы хотели бы повторно использовать этот набор тестов для тестирования другого совместимого с интерфейсом модуля. Решение, которое мы смогли найти, состояло в том, чтобы унаследовать тестовый класс и реализовать другой конструктор. Я хотел бы подтвердить, что лучшего варианта нет, потому что написание дублированных унаследованных классов для каждого из классов набора тестов кажется неправильным.

[TestClass]
public class RouModel_Basic_RunnerBasic : ROUModelTest_Basic
{
    public RouModel_Basic_RunnerBasic() : base()
    {
        //init basic model here
        model = basicModel;
    }
}
[TestClass]
public class RouModel_Basic_RunnerOther : ROUModelTest_Basic
{
    public RouModel_Basic_RunnerOther() : base()
    {
        //init other model here
        model = otherModel;
    }
}

public class ROUModelTest_Basic : RouModelTest
{
   [TestMethod]
   public void TestABC() 
   {
       string input = "abc"
       var result = model.run(input);
       Assert.AreEqual("123", result);
   }
}

public class RouModelTest 
{
    protected IModelTest model;
    ...
}

1 Ответ

0 голосов
/ 29 марта 2020

Если вы просто хотите повторно использовать тестовый код как есть, но с другим тестируемым модулем, наследование представляется наиболее простым, поскольку вам потребуется отдельный метод тестирования для каждого теста, а наследование является единственным способ сделать это без необходимости вводить их самостоятельно. Это не должно приводить к дублированию, поскольку вам нужно только повторно реализовать части, которые на самом деле различны в каждом подклассе.

Если ваша проблема связана с тем, что вы строите свое тестовое устройство в тестовом примере в качестве конструктора класса, альтернативой может быть применение шаблона проектирования Template Method к вашим тестовым методам и добавление метода виртуального создания для тестируемого модуля, который подклассы могут переопределять для создания экземпляров указанного модуля c Вы хотите, чтобы они протестировали. Кроме того, вы можете создать метод настройки теста и пометить его соответствующим атрибутом, как описано в этот ответ .

При этом, если вы действительно хотите Храните их все в одном и том же классе тестового примера, вы можете сделать это, если вы реализуете методы создания для отдельных тестируемых модулей в своем базовом классе тестового примера, а затем передаете имена этих методов в свои тестовые методы и вызываете их используя отражение. Должен существовать атрибут, который позволяет передавать аргументы в методы тестирования, что обсуждается в этом ответе . Однако выполнимость такого подхода с моей стороны является лишь предположением, и вы рискуете сделать свои тесты более неясными.

...