Как установить категорию теста для всех тестов в классе

Я использую MSTest и хочу установить одну и ту же категорию теста для всех методов в классе теста одновременно, не устанавливая атрибут TestCategory для каждого метода в отдельности. Как это может быть сделано?

Наиболее удобный и очевидный способ - установить атрибут TestCategory для класса, но его можно применять только к методам.

Конечная цель - пропустить интеграционные тесты во время тестирования при регистрации TFS.

6 ответов

Чтобы иметь возможность установить [TestCategory] атрибут на уровне класса, установите TestFramework "MSTest V2" с помощью NuGet.

Ссылка: https://blogs.msdn.microsoft.com/devops/2016/06/17/taking-the-mstest-framework-forward-with-mstest-v2/

Я хотел сделать что-то подобное, и я нашел решение, которое действительно хорошо работает для моих целей.

Это не решает проблему применения 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 для запуска только модульных тестов.

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