Как установить категорию теста для всех тестов в классе
Я использую MSTest и хочу установить одну и ту же категорию теста для всех методов в классе теста одновременно, не устанавливая атрибут TestCategory для каждого метода в отдельности. Как это может быть сделано?
Наиболее удобный и очевидный способ - установить атрибут TestCategory для класса, но его можно применять только к методам.
Конечная цель - пропустить интеграционные тесты во время тестирования при регистрации TFS.
6 ответов
Чтобы иметь возможность установить [TestCategory]
атрибут на уровне класса, установите TestFramework "MSTest V2" с помощью NuGet.
Я хотел сделать что-то подобное, и я нашел решение, которое действительно хорошо работает для моих целей.
Это не решает проблему применения TestCategory для каждого класса, но вы можете использовать /test:
аргумент командной строки для mstest
указать строку поиска, соответствующую любой части полного имени метода теста. Это означает, что вы обычно можете сопоставить класс, или пространство имен, или любую строку поиска, к которой вы можете прийти, которая будет соответствовать целевым тестам. И если это не делает этого, вы можете использовать /test:
аргумент несколько раз. То есть:
> mstest /testcontainer:My.dll /test:My.FullyQualified.Namespace
/test:My.FullyQualified.OtherNamespace.OtherClass
Конечная цель - пропустить интеграционные тесты во время тестирования при регистрации TFS.
Есть и другие способы сделать это. В ваших сборках TFS вы можете указать, какие модульные тесты вы хотите запускать, в зависимости от их имени сборки.
В качестве поведения по умолчанию он запускает все модульные тесты в сборках, которые имеют "test" в своем названии. Простым решением будет переименование ваших интеграционных тестов во что-то, что не включает "тест".
Если вы хотите использовать категории, вы можете попробовать использовать АОП. Например, в Postsharp вы можете создать аспект в сборке интеграционного теста, который поместит атрибут в метод. Затем включите аспект для всех открытых методов в вашей интеграционной сборке, если все тесты сгруппированы в одну dll или в каждом классе интеграционных тестов.
Один из способов обойти это ограничение - поместить категорию теста в начало каждого метода тестирования. Например, назовите ваши юнит-тесты
public void UnitTestDoSomething_ExpectThis()
и ваш интеграционный тест
public void IntegrationTestDoSomething_ExpectThis()
Затем, когда вы делаете запрос TFS, чтобы получить интеграционные тесты, вы можете сделать
Field[Automated Test Name] with Operator[Contains] and Value[IntegrationTest]
Хотя это не идеальное решение, оно поможет вам различать ваши тесты в коде и TFS. Кроме того, вы можете посмотреть на области и пути итерации.
Вы можете группировать по "Имя класса" в панель "Test Explorer".
С атрибутом test TestCategory вы не можете решить вашу проблему только потому, что атрибуты в C# являются метаданными и не могут использоваться в качестве динамических значений.
В VS 2017 это возможно (и выглядит как часть обновления VS2012 1).
Вы можете поместить [TestCategory("Integration")] в класс в вашем модульном тесте и применить его ко всем тестам, а также [TestCategory("Unit")] в ваших классах модульных тестов.
Затем вы можете использовать панель поиска в Test Explorer для фильтрации по Trait name = Unit и "Run All" будет запускать только те тесты, которые соответствуют вашему поиску.
Когда вы запускаете эти тесты на своем сервере сборки, вы можете использовать переключатель типа /category:Unit для запуска только модульных тестов.