Бөлісу құралы:


Написание тестов с помощью MSTest

В этой статье вы узнаете об API и соглашениях, используемых MSTest для написания и формирования тестов.

Примечание.

Имена атрибутов, заканчивающиеся атрибутом "Атрибут", могут использовать короткую форму. TestClass и TestClassAttribute эквивалентны. Атрибуты с конструкторами без параметров могут опустить скобки.

Структура тестирования

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

using Microsoft.VisualStudio.TestTools.UnitTesting;

[TestClass]
public class CalculatorTests
{
    [TestMethod]
    public void Add_TwoNumbers_ReturnsSum()
    {
        // Arrange
        var calculator = new Calculator();

        // Act
        int result = calculator.Add(2, 3);

        // Assert
        Assert.AreEqual(5, result);
    }
}

TestClassAttribute

Помечает TestClassAttribute класс, содержащий тесты и, при необходимости, методы для инициализации или очистки. Этот атрибут можно расширить для настройки поведения тестового класса.

TestMethodAttribute

Метод TestMethodAttribute помечается как тест для запуска. Методы тестирования должны быть:

[TestClass]
public class TestMethodExamples
{
    [TestMethod]
    public void SynchronousTest()
    {
        Assert.IsTrue(true);
    }

    [TestMethod]
    public async Task AsynchronousTest()
    {
        await Task.Delay(100);
        Assert.IsTrue(true);
    }
}

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

Не используйте async void для методов тестирования. Вместо этого используются типы async Task или async ValueTask.

DiscoverInternalsAttribute

Атрибут DiscoverInternalsAttribute сборки позволяет MSTest обнаруживать internal тестовые классы и методы. По умолчанию обнаруживаются только public тесты. Этот атрибут особенно полезен при наличии параметризованных тестов, использующих внутренние типы в качестве параметров:

[assembly: DiscoverInternals]

internal record TestInput(int Value, string Description);

[TestClass]
public class CalculatorTests
{
    internal static IEnumerable<TestInput> TestData
    {
        get
        {
            yield return new TestInput(1, "one");
            yield return new TestInput(2, "two");
        }
    }

    [TestMethod]
    [DynamicData(nameof(TestData))]
    internal void Add_WithTestInput_ReturnsExpected(TestInput input)
    {
        var calculator = new Calculator();
        int result = calculator.Add(input.Value, 1);
        Assert.AreEqual(input.Value + 1, result);
    }
}

Без DiscoverInternalsэтого метод теста и его внутренний TestInput тип параметров не будут обнаружены средством выполнения теста.

Основные понятия

Документация MSTest организована по разделу:

Тема Description
Утверждения Проверка ожидаемых результатов с помощью классов Assert
Тестирование на основе данных Выполнение тестов с несколькими входными данными (DataRow, DynamicData)
Жизненный цикл тестирования Настройка и очистка на уровнях сборки, класса и тестирования
Элемент управления выполнением Потоки, параллелизация, время ожидания, повторные попытки и условное выполнение
Тестовая организация Категории, приоритеты, владельцы и метаданные
TestContext Доступ к сведениям о среде выполнения теста

Краткий справочник по атрибутам

Категория Атрибуты Смотри
Идентификация теста TestClass TestMethod DiscoverInternals Эта страница
Управляемые данными DataRow DynamicData TestDataRow Тестирование на основе данных
Lifecycle AssemblyInitialize, , ClassInitializeTestInitializeи аналогы очистки Жизненный цикл тестирования
Нарезание резьбы STATestClass STATestMethod UITestMethod Элемент управления выполнением
Распараллеливание Parallelize, DoNotParallelize Элемент управления выполнением
Время ожидания и повторная попытка Timeout, Retry Элемент управления выполнением
Conditional Ignore OSCondition CICondition Элемент управления выполнением
Метаданные TestCategory TestProperty Owner Priority Тестовая организация
Отслеживание трудозатрат WorkItem, GitHubWorkItem Тестовая организация

Проверочные утверждения

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

Утверждения MSTest делятся на:

Тестирование частных членов

Вы можете протестировать частные члены с помощью классов оболочки отражения:

  • PrivateObject: для методов частного экземпляра
  • PrivateType: для частных статических методов

Подсказка

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

См. также