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


Использование платформы MSTest в модульных тестах

Платформа MSTest поддерживает модульное тестирование в Visual Studio. Используйте классы и члены в Microsoft.VisualStudio.TestTools.UnitTesting пространстве имен при написании модульных тестов. Их также можно использовать при уточнении модульного теста, созданного из кода.

Элементы платформы

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

Примечание.

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

[TestClass()]

[TestClassAttribute()]

[TestClass]

[TestClassAttribute]

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

Каждый тестовый класс должен иметь атрибут TestClass, а каждый тестовый метод — атрибут TestMethod. Дополнительные сведения см. в статье Составляющие модульного теста.

TestClassAttribute

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

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

Пример:

[TestClass]
public class MyTestClass
{    
}

TestMethodAttribute

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

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

Пример

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

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

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

Datarow

Позволяет DataRowAttribute предоставлять встроенные данные, используемые при вызове метода теста. Он может отображаться один или несколько раз в методе тестирования. Он должен сочетаться с TestMethodAttribute или DataTestMethodAttribute.

Число и типы аргументов должны точно соответствовать сигнатуре метода теста.

Примеры допустимых вызовов:

[TestClass]
public class TestClass
{
    [TestMethod]
    [DataRow(1, "message", true, 2.0)]
    public void TestMethod1(int i, string s, bool b, float f) {}
    
    [TestMethod]
    [DataRow(new string[] { "line1", "line2" })]
    public void TestMethod2(string[] lines) {}

    [TestMethod]
    [DataRow(null)]
    public void TestMethod3(object o) {}

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

Обратите внимание, что вы также можете использовать функцию params для записи нескольких входных DataRowданных объекта.

[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" } })] В v3 onward: [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) {}
}

Вы также можете создать собственный специализированный атрибут строки данных, наследуя его 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 TaskTestClass) и отображаться только один раз. Для инициализации требуется один аргумент типа TestContext и очистка без аргумента.

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

    [AssemblyCleanup]
    public static void AssemblyCleanup()
    {
    }
}
[TestClass]
public class MyOtherTestClass
{
    [AssemblyInitialize]
    public static async Task AssemblyInitialize(TestContext testContext)
    {
    }

    [AssemblyCleanup]
    public static async Task AssemblyCleanup()
    {
    }
}

Класс

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

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

Также можно настроить, следует ли выполнять очистку класса в конце класса или в конце сборки (больше не поддерживается начиная с MSTest версии 4, так как EndOfClass — это поведение по умолчанию и только очистка класса ).

Методы, помеченные этими атрибутами, должны быть определены как static void или ( или static TaskTestClass) и отображаться только один раз. Для инициализации требуется один аргумент типа TestContext и очистка без аргумента.

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

    [ClassCleanup]
    public static void ClassCleanup()
    {
    }
}
[TestClass]
public class MyOtherTestClass
{
    [ClassInitialize]
    public static async Task ClassInitialize(TestContext testContext)
    {
    }

    [ClassCleanup]
    public static async Task ClassCleanup()
    {
    }
}

Тест

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

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

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

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

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

    [TestCleanup]
    public void TestCleanup()
    {
    }
}
[TestClass]
public class MyOtherTestClass
{
    [TestInitialize]
    public async Task TestInitialize()
    {
    }

    [TestCleanup]
    public async Task TestCleanup()
    {
    }
}

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

Класс TestContext

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

DeploymentItemAttribute

Платформа MSTest V2, представленная DeploymentItemAttribute для копирования файлов или папок, указанных в качестве элементов развертывания в каталог развертывания (без добавления пользовательского пути вывода скопированные файлы будут находиться в папке 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");
    }
}

Классы конфигурации теста

Атрибуты для создания отчетов

В этом разделе приведены атрибуты, связывающие метод теста, к которому они применены, с сущностями в иерархии командного проекта Team Foundation Server.

Классы, используемые с закрытыми методами доступа

Можно создать модульный тест для закрытого метода. При этом создается класс закрытых методов доступа, являющийся экземпляром объекта класса PrivateObject. Класс PrivateObject является классом-оболочкой, который использует отражение при осуществлении доступа через закрытые методы. Аналогичным является класс PrivateType, но вместо вызова закрытых методов экземпляра используется вызов закрытых статических методов.

См. также