Поделиться через


Атрибуты MSTest

MSTest использует пользовательские атрибуты для идентификации и настройки тестов.

Чтобы получить более четкий обзор платформы тестирования, этот раздел упорядочивает члены Microsoft.VisualStudio.TestTools.UnitTesting пространства имен в группы связанных функциональных возможностей.

Примечание.

Атрибуты, имена которых заканчиваются атрибутом, можно использовать с атрибутом или без нее в конце. Атрибуты, имеющие конструктор без параметров, могут быть записаны с скобками или без них. Следующие примеры кода работают так же:

[TestClass()]

[TestClassAttribute()]

[TestClass]

[TestClassAttribute]

Атрибуты для идентификации тестовых классов и методов

Каждый тестовый класс должен иметь атрибут TestClass, а каждый тестовый метод — атрибут TestMethod.

TestClassAttribute

Атрибут TestClass помечает класс, содержащий тесты и, при необходимости, инициализировать или очистить методы.

Этот атрибут можно расширить для изменения или расширения поведения по умолчанию.

Пример:

[TestClass]
public class MyTestClass
{
}

TestMethodAttribute

Атрибут TestMethod используется в объекте TestClass для определения фактического метода тестирования для выполнения.

Метод должен быть методом экземпляра public , определенным как void, Taskили ValueTask (начиная с MSTest версии 3.3). Это может быть async необязательно, но не должно быть async void.

Метод должен иметь ноль параметров, если он не помечен атрибутом DataRow, атрибутом DynamicData или аналогичным атрибутом, предоставляющим данные тестового варианта для метода тестирования.

Рассмотрим следующий пример тестового класса:

[TestClass]
public class MyTestClass
{
    [TestMethod]
    public void TestMethod()
    {
    }
}

Атрибуты, используемые для тестирования на основе данных

Используйте следующие элементы, чтобы настроить тесты на основе данных. Дополнительные сведения см. в статьях Создание модульного теста, управляемого данными и Использование файла конфигурации для определения источника данных.

DataRowAttribute

Атрибут DataRow позволяет выполнять один и тот же метод тестирования с несколькими различными входными данными. Он может отображаться один или несколько раз в методе тестирования. Он должен сочетаться с атрибутом TestMethod.

Число и типы аргументов должны точно соответствовать сигнатуре метода теста. Рассмотрим следующий пример допустимого тестового класса, демонстрирующего использование DataRowAttribute с встроенными аргументами, которые соответствуют параметрам метода тестирования:

[TestClass]
public class TestClass
{
    [TestMethod]
    [DataRow(1, "message", true, 2.0)]
    public void TestMethod1(int i, string s, bool b, float f)
    {
        // Omitted for brevity.
    }

    [TestMethod]
    [DataRow(new string[] { "line1", "line2" })]
    public void TestMethod2(string[] lines)
    {
        // Omitted for brevity.
    }

    [TestMethod]
    [DataRow(null)]
    public void TestMethod3(object o)
    {
        // Omitted for brevity.
    }

    [TestMethod]
    [DataRow(new string[] { "line1", "line2" }, new string[] { "line1.", "line2." })]
    public void TestMethod4(string[] input, string[] expectedOutput)
    {
        // Omitted for brevity.
    }
}

Примечание.

Вы также можете использовать функцию params для записи нескольких входных DataRowAttributeданных.

[TestClass]
public class TestClass
{
    [TestMethod]
    [DataRow(1, 2, 3, 4)]
    public void TestMethod(params int[] values) {}
}

Примеры недопустимых сочетаний:

[TestClass]
public class TestClass
{
    [TestMethod]
    [DataRow(1, 2)] // Not valid, we are passing 2 inline data but signature expects 1
    public void TestMethod1(int i) {}

    [TestMethod]
    [DataRow(1)] // Not valid, we are passing 1 inline data but signature expects 2
    public void TestMethod2(int i, int j) {}

    [TestMethod]
    [DataRow(1)] // Not valid, count matches but types do not match
    public void TestMethod3(string s) {}
}

Примечание.

Начиная с MSTest версии 3, если вы хотите передать ровно 2 массива, больше не нужно упаковать второй массив в массив объектов. До:[DataRow(new string[] { "a" }, new object[] { new string[] { "b" } })]Staring с версией 3:[DataRow(new string[] { "a" }, new string[] { "b" })]

Отображаемое имя можно изменить в Visual Studio и средства ведения журнала для каждого экземпляра DataRowAttribute , задав DisplayName свойство.

[TestClass]
public class TestClass
{
    [TestMethod]
    [DataRow(1, 2, DisplayName = "Functional Case FC100.1")]
    public void TestMethod(int i, int j) {}
}

Вы также можете создать собственный специализированный DataRow атрибут, наследуя DataRowAttribute.

[AttributeUsage(AttributeTargets.Method, AllowMultiple = true)]
public class MyCustomDataRowAttribute : DataRowAttribute
{
}

[TestClass]
public class TestClass
{
    [TestMethod]
    [MyCustomDataRow(1)]
    public void TestMethod(int i) {}
}

Атрибуты, используемые для инициализации и очистки

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

Уровень сборки

Атрибут AssemblyInitialize вызывается сразу после загрузки сборки, а атрибут AssemblyCleanup вызывается прямо перед выгрузкой сборки.

Методы, помеченные этими атрибутами, должны быть определены как static void, static Task или static ValueTask (начиная с MSTest версии 3.3), в классе, помеченном TestClassAttribute, и отображаться только один раз. Для инициализации требуется один параметр типа TestContext, а очистка может либо не требовать параметров, либо с версии MSTest 3.8 иметь один параметр типа TestContext.

[TestClass]
public class MyTestClass
{
    [AssemblyInitialize]
    public static void AssemblyInitialize(TestContext testContext)
    {
    }

    [AssemblyCleanup]
    public static void AssemblyCleanup() // Starting with MSTest 3.8, it can be AssemblyCleanup(TestContext testContext)
    {
    }
}

Уровень класса

Атрибут classInitialize вызывается прямо перед загрузкой класса (но после статического конструктора), а ClassCleanup вызывается сразу после выгрузки класса.

Это важно

По умолчанию ClassCleanupAttribute будет активирован после последнего теста сборки (аналогично AssemblyCleanupAttribute). Это поведение можно изменить, настроив CleanupBehavior в атрибуте. Кроме того, это поведение можно задать глобально для сборки с помощью атрибута сборки ClassCleanupExecutionAttribute.

Также можно управлять поведением наследования: только для текущего класса с помощью InheritanceBehavior.Noneили для всех производных классов с помощью InheritanceBehavior.BeforeEachDerivedClass.

Методы, помеченные этими атрибутами, должны быть определены как static voidили static Taskstatic ValueTask (начиная с MSTest версии 3.3) в объекте TestClassи отображаются только один раз. Для инициализации требуется один параметр типа TestContext и очистка либо нет параметров, либо начиная с MSTest 3.8 может иметь один параметр типа TestContext.

[TestClass]
public class MyTestClass
{
    [ClassInitialize]
    public static void ClassInitialize(TestContext testContext)
    {
    }

    [ClassCleanup]
    public static void ClassCleanup() // Starting with MSTest 3.8, it can be ClassCleanup(TestContext testContext)
    {
    }
}

Уровень тестирования

Атрибут testInitialize вызывается прямо перед началом теста, а TestCleanup вызывается сразу после завершения теста.

Аналогично TestInitializeAttribute конструктору классов, но обычно подходит для длительных и асинхронных инициализаций. TestInitializeAttribute всегда вызывается после конструктора и вызывается для каждого теста (включая каждую запись управляемых данными тестов).

Аналогично TestCleanupAttribute классу Dispose (или DisposeAsync) но обычно подходит для длительных или асинхронных очистки. TestCleanupAttribute всегда вызывается непосредственно перед DisposeAsync/Dispose и вызывается для каждого теста (включая каждую запись тестов на основе данных ).

Методы, помеченные этими атрибутами, должны быть определены как void, Task или ValueTask (начиная с MSTest версии 3.3), в параметре TestClassдолжны быть без параметров и отображаться один или несколько раз.

[TestClass]
public class MyTestClass
{
    [TestInitialize]
    public void TestInitialize()
    {
    }

    [TestCleanup]
    public void TestCleanup()
    {
    }
}

Атрибуты, используемые для управления выполнением тестов

Следующие атрибуты можно использовать для изменения способа выполнения тестов.

TimeoutAttribute

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

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

Примечание.

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

При использовании функции времени ожидания создается отдельный поток или задача для запуска метода теста. Основной поток или задача отвечает за мониторинг времени ожидания и отмены отслеживания потока метода или задачи при достижении времени ожидания.

Начиная с MSTest 3.6, можно указать CooperativeCancellation свойство атрибута (или глобально через запуски), чтобы включить совместную отмену. В этом режиме метод отвечает за проверку маркера отмены и прерывание теста, если он сигнализирует, как и в типичном async методе. Этот режим является более производительным и позволяет более точно контролировать процесс отмены. Этот режим можно применять как к асинхронным, так и к методам синхронизации.

STATestClassAttribute

При применении к тестовому классу атрибут STATestClass указывает, что все тестовые методы (и методы [ClassInitialize] и [ClassCleanup]) в классе должны выполняться в однопоточной модели (STA). Этот атрибут полезен, если методы тестирования взаимодействуют с COM-объектами, для которых требуется STA.

Примечание.

Это поддерживается только в Windows и в версии 3.6 и более поздних версий.

STATestMethodAttribute

При применении к методу теста атрибут STATestMethod означает, что метод теста должен выполняться в однопоточной квартире (STA, Single-Threaded Apartment). Этот атрибут полезен при взаимодействии метода тестирования с COM-объектами, для которых требуется STA.

Примечание.

Это поддерживается только в Windows и в версии 3.6 и более поздних версий.

ParallelizeAttribute

По умолчанию MSTest выполняет тесты в последовательном порядке. Атрибут уровня сборки атрибут Parallelize можно использовать для параллельного выполнения тестов. Можно указать, должен ли параллелизм находиться на уровне класса (несколько классов могут выполняться параллельно, но тесты в данном классе выполняются последовательно) или на уровне метода.

Кроме того, можно указать максимальное количество потоков, используемых для параллельного выполнения. Значение 0 (значение по умолчанию) означает, что число потоков равно числу логических процессоров на компьютере.

Кроме того, можно указать параллелизм через свойства параллелизации файла runsettings.

DoNotParallelizeAttribute

Атрибут DoNotParallelize можно использовать для предотвращения параллельного выполнения тестов в данной сборке. Этот атрибут можно применять на уровне сборки, уровне класса или на уровне метода.

Примечание.

По умолчанию MSTest выполняет тесты в последовательном порядке, поэтому этот атрибут необходимо использовать только при применении уровня сборки атрибута Parallelize.

RetryAttribute

Атрибут Retry появился в MSTest 3.8. Этот атрибут выполняет повторное выполнение метода теста при сбое или превышении времени выполнения. Он позволяет указать максимальное количество попыток повторных попыток, задержку времени между повторными попытками и тип отложенного отступа, который является константой или экспоненциальным.

Ожидается, что в тестовом методе будет присутствовать только один RetryAttribute, и RetryAttribute нельзя использовать в методах, которые не обозначены как TestMethod.

Примечание.

RetryAttribute является производным от абстрактного RetryBaseAttribute. Вы также можете создать собственные реализации механизма повторных попыток, если встроенный RetryAttribute вам не устроит.

Атрибуты служебных программ

DeploymentItemAttribute

Атрибут DeploymentItem используется для копирования файлов или папок, указанных в качестве элементов развертывания в каталог развертывания (без добавления пользовательского пути вывода скопированные файлы будут находиться в папке TestResults в папке проекта). Каталог развертывания состоит в том, что все элементы развертывания присутствуют вместе с библиотекой DLL тестового проекта.

Его можно использовать либо в классах тестирования (классах, помеченных атрибутом TestClass), либо в методах тестирования (методах, помеченных атрибутом TestMethod).

Пользователи могут иметь несколько экземпляров атрибута, чтобы указать несколько элементов.

И здесь вы увидите его конструкторы.

Пример

[TestClass]
[DeploymentItem(@"C:\classLevelDepItem.xml")]   // Copy file using some absolute path
public class UnitTest1
{
    [TestMethod]
    [DeploymentItem(@"..\..\methodLevelDepItem1.xml")]   // Copy file using a relative path from the dll output location
    [DeploymentItem(@"C:\DataFiles\methodLevelDepItem2.xml", "SampleDataFiles")]   // File will be added under a SampleDataFiles in the deployment directory
    public void TestMethod1()
    {
        string textFromFile = File.ReadAllText("classLevelDepItem.xml");
    }
}

Предупреждение

Не рекомендуется использовать этот атрибут для копирования файлов в каталог развертывания.

ExpectedExceptionAttribute

Атрибут ExpectedException определяет исключение, вызываемое методом теста. Тест считается пройденным, если возникает ожидаемое исключение и сообщение об этом исключении соответствует ожидаемому.

Предупреждение

Этот атрибут существует для обратной совместимости и не рекомендуется для новых тестов. Вместо этого используйте метод Assert.ThrowsException (или Assert.ThrowsExactly при использовании метода MSTest 3.8 и более поздних версий).

Атрибуты метаданных

Следующие атрибуты и значения, назначенные им, отображаются в Visual Studioокне свойств для определенного метода теста. Эти атрибуты не предназначены для доступа через код теста. Вместо этого они влияют на способы использования или запуска теста через интегрированную среду разработки Visual Studio или модуль тестирования Visual Studio. Например, некоторые из этих атрибутов отображаются в качестве столбцов в окне диспетчера тестов и окне результатов тестов. Это позволяет использовать их для группировки и сортировки тестов и их результатов. Одним из таких атрибутов является TestPropertyAttributeдобавление произвольных метаданных в тесты.

Например, его можно использовать для хранения имени "тестового прохода", который охватывает этот тест, помечая тест с [TestProperty("Feature", "Accessibility")]помощью . Кроме того, вы можете использовать его для хранения индикатора типа теста.[TestProperty("ProductMilestone", "42")] Созданное с помощью этого атрибута свойство и присвоенное ему значение отображаются в окне свойств Visual Studio под заголовком Относится к тесту.

Приведенные ниже атрибуты связаны с методом тестирования, который они украшают сущности в иерархии проектов Team Foundation Server команды: