Использование платформы 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 Task
TestClass
) и отображаться только один раз. Для инициализации требуется один аргумент типа 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 Task
TestClass
) и отображаться только один раз. Для инициализации требуется один аргумент типа 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
или (илиTask
TestClass
) в параметре без параметров и отображаться один или несколько раз.
[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, но вместо вызова закрытых методов экземпляра используется вызов закрытых статических методов.
См. также
- Справочная документация по Microsoft.VisualStudio.TestTools.UnitTesting.