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


Основные сведения о модульных тестах

Убедитесь, что код работает, как ожидалось, создав и выполнив модульные тесты. Модульное тестирование получило такое название, так как функции программы разбиваются на отдельные тестируемые участки поведения, которые можно протестировать в качестве отдельных модулей. Обозреватель тестов Visual Studio предоставляет гибкий и эффективный способ запуска модульных тестов и просмотра результатов в Visual Studio. Visual Studio устанавливает платформы модульного тестирования Microsoft для управляемого и машинного кода. Платформа модульного тестирования используется для создания модульных тестов, их запуска и создания отчетов о результатах таких тестов. Завершив внесение изменений, запустите модульные тесты повторно, чтобы убедиться, что код по-прежнему работает правильно. Visual Studio Enterprise может выполнять эту задачу автоматически с помощью функции Live Unit Testing, которая определяет тесты, затронутые вносимыми в код изменениями, и выполняет их в фоновом режиме в процессе ввода.

Модульное тестирование максимально влияет на качество кода, когда оно является неотъемлемой частью рабочего процесса разработки ПО. После написания функции или другого блока кода приложения создаются модульные тесты, которые проверяют поведение кода в ответ на стандартные, граничные и некорректные случаи ввода данных; также проверяются любые явные или предполагаемые допущения, сделанные кодом. При разработке, управляемой тестами, модульные тесты создаются перед написанием кода, поэтому модульные тесты используются в качестве технической документации и спецификации функциональности.

Обозреватель тестов также может запускать тесты c платформ модульных тестов стороннего производителя и платформ на основе открытого кода, имеющих дополнительные интерфейсы для Обозревателя тестов. Многие из этих платформ могут быть добавлены при помощи Менеджера расширений Visual Studio и Галереи Visual Studio. Дополнительные сведения см. в разделе Установка платформ модульного тестирования сторонних поставщиков.

Можно быстро создавать тестовые проекты и методы теста из кода или создавать тесты вручную при необходимости. При использовании компонента IntelliTest для изучения кода .NET можно создавать тестовые данные и наборы модульных тестов. Для каждого оператора в коде создаются входные данные теста, которые будут выполнять этот оператор. Узнайте, как создавать модульные тесты для кода .NET.

Начать

Общие сведения о модульном тестировании, который принимает вас непосредственно в код, см. в одной из следующих статей:

Пример решения Bank

В этой статье в качестве примера используется разработка ненастоящего приложения, которое называется MyBank. Вам не нужен фактический код, чтобы следовать объяснениям в этой статье. Методы тестирования написаны на C# и представлены при помощи платформы модульного тестирования Microsoft для управляемого кода. Но эти принципы применимы и к другим языкам и платформам.

Решение MyBank 2019

Решение MyBank 2022

Первая попытка проектирования приложения MyBank включает в себя компонент счетов, который представляет собой лицевой счет и его транзакции с банком, а также компонент базы данных, который включает в себя функции объединения лицевых счетов и управления ими.

Создается решение Bank , которое содержит два проекта.

  • Accounts

  • BankDB

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

  • AccountInfo.cs, который определяет основную информацию о счете;

  • IAccount.cs, определяющего стандартный интерфейс IAccount для счета, включая методы внесения и снятия средств со счета и получения баланса счета;

  • CheckingAccount.cs, содержащего класс CheckingAccount, который реализует интерфейс IAccount для чекового счета.

Из опыта известно, что при снятии средств с текущего счета необходимо убедиться, что количество снимаемых средств меньше, чем размер баланса счета. Поэтому метод IAccount.Withdraw в CheckingAccount перекрывается методом, который проверяет данное условие. Метод может выглядеть следующим образом.

public void Withdraw(double amount)
{
    if(m_balance >= amount)
    {
        m_balance -= amount;
    }
    else
    {
        throw new ArgumentException(nameof(amount), "Withdrawal exceeds balance!");
    }
}

Теперь, когда есть немного кода, можно провести тестирование.

Создание модульных тестов с помощью Copilot

Вы также можете использовать команду косой черты Copilot /tests для создания модульных тестов из кода. Например, можно ввести /tests using NUnit Framework тесты NUnit. Дополнительные сведения см. в разделе "Использование команд косой черты" в Copilot Chat.

Создание проектов модульных тестов и методов тестирования (C#)

Для C# как правило, проще создать проект модульного теста и заглушки модульных тестов из кода. Кроме того, можно создать проект модульных тестов и тесты вручную в зависимости от потребностей. Если вы хотите создать модульные тесты из кода с 3-й сторонней платформой, вам потребуется один из этих расширений: NUnit или xUnit. Если вы не используете C#, пропустите этот раздел и перейдите к разделу Создание проекта и модульных тестов вручную.

Создание проекта модульного теста и заглушек модульных тестов

  1. В окне редактора кода выберите в контекстном меню команду Создать модульные тесты.

    В окне редактора просмотрите контекстное меню

    Примечание.

    Команда меню Создать модульные тесты доступна только для кода C#. Чтобы использовать этот метод для .NET Core или .NET Standard, требуется Visual Studio 2019 или более поздней версии.

    В окне редактора просмотрите контекстное меню

    Примечание.

    Команда меню Создать модульные тесты доступна только для кода C#. Чтобы использовать этот метод для .NET Core или .NET Standard, требуется Visual Studio 2019 или более поздней версии.

  2. Нажмите кнопку "ОК ", чтобы принять значения по умолчанию, чтобы создать модульные тесты или изменить значения, используемые для создания и имени проекта модульного теста и модульных тестов. Можно выбрать код, который добавляется по умолчанию в методы модульных тестов.

    Диалоговое окно

    Диалоговое окно

  3. Заглушки модульных тестов создаются в новом проекте модульного теста для всех методов в классе.

    Модульные тесты созданы

    Модульные тесты созданы

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

Создание проекта и модульных тестов вручную

Проект модульного теста отражает структуру проекта кода. В примере MyBank добавляются два проекта модульного тестирования с именами AccountsTests и BankDbTests в решение Bank . Имена проекта теста произвольны, но рекомендуется принять концепцию стандартного именования.

Добавление нового проекта модульного тестирование в решение

  1. В обозревателе решений щелкните решение правой кнопкой мыши и выберите пункты Добавить>Новыйпроект.

  2. Введите test в поле поиска шаблона проекта, чтобы найти шаблон проекта модульного теста для платформы тестирования, которую вы хотите использовать. (В примерах этой статьи мы используем MSTest.)

  3. На следующей странице присвойте проекту имя. Для тестирования проекта Accounts в нашем примере проект можно назвать AccountsTests.

  4. В проекте модульного тестирования добавьте ссылку на проект кода в тесте, а в данном примере — на проект Счета.

    Создание ссылки на проект кода

    1. В проекте модульного теста в обозревателе решений щелкните правой кнопкой мыши узел Ссылки или Зависимости, после чего выберите Добавить ссылку на проект или Добавить ссылку, в зависимости от того, что доступно.

    2. В диалоговом окне диспетчера ссылок откройте узел Решение и выберите Проекты. Выберите наименование проекта кода и закройте диалоговое окно.

Каждый проект модульного тестирования содержит классы, которые отражают имена классов в проекте кода. В данном примере проект AccountsTests будет содержать следующие классы.

  • КлассAccountInfoTests содержит методы модульного тестирования для класса AccountInfo в проекте Accounts .

  • КлассCheckingAccountTests содержит методы модульного тестирования для класса CheckingAccount .

Написание тестов

Платформа модульного тестирования и Visual Studio IntelliSense помогут вам в написании кода модульных тестов для проекта кода. Для запуска в обозревателе тестов многие платформы требуют добавления особых атрибутов для определения методов модульного тестирования. Платформы также предоставляют способ — обычно при помощи оператора контроля или атрибутов метода -— для определения успешности или не успешности теста. Другие атрибуты определяют необязательные методы установки, которые выполняются при инициализации класса и перед каждым методом тестирования, а также методы разборки, которые запускаются после каждого метода тестирования и после уничтожения класса.

Модель AAA (размещение, действие, утверждение) является стандартным способом написания модульных тестов для метода тестирования.

  • Подраздел Размещение метода модульного тестирования инициализирует объекты и устанавливает значение данных, которые переданы методу для теста.

  • Подраздел Действие вызывает метод для теста с размещенными параметрами.

  • Подраздел Утверждение проверяет, чтобы метод для теста действовал, как ожидается. В .NET для проверки зачастую используются методы класса Assert.

Чтобы протестировать метод CheckingAccount.Withdraw в контексте нашего примера, мы можем написать два теста: один, проверяющий стандартное поведение метода, и второй, проверяющий, что снятие суммы, превышающей остаток, не удастся (в нижеприведенном коде показан модульный тест MSTest, который поддерживается в .NET.). В классе CheckingAccountTests добавьте следующие методы.

[TestMethod]
public void Withdraw_ValidAmount_ChangesBalance()
{
    // arrange
    double currentBalance = 10.0;
    double withdrawal = 1.0;
    double expected = 9.0;
    var account = new CheckingAccount("JohnDoe", currentBalance);

    // act
    account.Withdraw(withdrawal);

    // assert
    Assert.AreEqual(expected, account.Balance);
}

[TestMethod]
public void Withdraw_AmountMoreThanBalance_Throws()
{
    // arrange
    var account = new CheckingAccount("John Doe", 10.0);

    // act and assert
    Assert.ThrowsException<System.ArgumentException>(() => account.Withdraw(20.0));
}

Дополнительные сведения о платформах модульного тестирования Майкрософт см. в одной из следующих статей:

Настройка времени ожидания для модульных тестов

Если вы используете платформу MSTest, можно использовать TimeoutAttribute для установки времени ожидания в отдельном методе теста:

[TestMethod]
[Timeout(2000)]  // Milliseconds
public void My_Test()
{ ...
}

Задние лимита времени на максимально разрешенный

[TestMethod]
[Timeout(TestTimeout.Infinite)]  // Milliseconds
public void My_Test ()
{ ...
}

Выполнение тестов в обозревателе тестов

При построении проекта тестирования тесты появляются в обозревателе тестов. Если обозреватель тестов не виден, выберите Тест в меню Visual Studio, Windows, затем обозреватель тестов (или нажмите клавиши CTRL + E, T).

Обозреватель модульных тестов

Обозреватель модульных тестов

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

Кроме того, можно фильтровать тесты по совпадению текста в поле поиска на глобальном уровне или с помощью одного из предустановленных фильтров. Можно запустить любую выборку тестов в любое время. Результаты запущенного теста появляются сразу же в строке "успешно/не успешно" наверху окна обозревателя. Детальная информация результата метода тестирования отображается при выборе теста.

Выполнение и просмотр тестов

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

Запуск тестов из панели инструментов обозревателя тестов

Запуск тестов из панели инструментов обозревателя тестов

Можно выбрать Запустить все, чтобы запустить все тесты (или нажать клавиши CTRL + R, V), или выбрать Запустить, чтобы выбрать подмножество тестов для запуска (или нажать клавиши CTRL + R, T). Выберите тест, чтобы просмотреть детальную информацию по нему на панели сведений. Выберите "Открыть тест " в меню правой кнопкой мыши (клавиатура: F12), чтобы отобразить исходный код для выбранного теста.

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

Запуск тестов после каждой сборки

Чтобы запустить модульные тесты после каждой локальной сборки, на панели инструментов обозревателя тестов щелкните значок "Параметры" и выберите в меню пункт Выполнить тесты после сборки.

Фильтрация и группировка списка тестов

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

Категории фильтров поиска

Категории фильтров поиска

Кнопка Description
Кнопка группы обозревателя тестов Для группировки тестов по категории, нажмите кнопку Группировать по .

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

Q&A

Вопрос. Как выполнять отладку модульных тестов?

Ответ. Чтобы запустить сеанс отладки для тестов, можно использовать обозреватель тестов. Пошагово выполняя код, отладчик Visual Studio плавно переключается назад и вперед между модульными тестами и проектом для тестирования. Начало отладки

  1. В редакторе Visual Studio установите точку останова в одном или нескольких методах тестирования, которые вы хотите проверить.

    Примечание.

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

  2. В обозревателе тестов выберите методы тестирования и затем Отладить выбранные тесты из меню быстрого запуска.

См. дополнительные сведения об отладке модульных тестов.

В. Если я использую TDD, как я могу создать код из тестов?

Ответ. Используйте быстрые действия для создания классов и методов в коде проекта. Напишите инструкцию в методе теста, который вызывает класс или метод, который требуется создать, а затем откройте лампочку, которая отображается под ошибкой. Если вызов предназначен для конструктора нового класса, выберите Сформировать тип из меню и следуйте подсказкам мастера, чтобы вставить класс в проект кода. Если вызов предназначен для метода, выберите Сформировать метод из меню IntelliSense.

Пункт меню быстрого действия

Пункт меню быстрого действия

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

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

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

Дополнительные сведения о модульных тестах, управляемых данными.

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

Ответ. Да. Вы можете определить объем кода, который фактически тестируется модульными тестами с помощью средства покрытия Visual Studio Code в Visual Studio Enterprise. Поддерживаются машинные и управляемые языки и все платформы модульного тестирования, которые могут быть запущены платформой модульного тестирования.

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

Чтобы запустить анализ объема протестированного кода для методов теста в решении, выберите Тестирование>Анализ покрытия кода для всех тестов.

Результаты покрытия появляются в окне Результаты объема протестированного кода.

Результаты покрытия кода

Результаты покрытия кода

Узнайте больше об объеме протестированного кода.

Вопрос. Можно ли протестировать методы в коде, которые имеют внешние зависимости?

Ответ. Да. В выпуске Visual Studio Enterprise компонент Microsoft Fakes можно использовать с методами тестов, которые были написаны с помощью платформ модульного тестирования для управляемого кода.

Microsoft Fakes использует два подхода при создании классов-заменителей для внешних зависимостей:

  1. Заглушки создают классы на замену, которые являются производными от родительского интерфейса класса зависимости цели. Методы заглушек могут быть заменены на публичные виртуальные методы класса цели.

  2. Оболочки используют инструментарий среды выполнения для перевода вызовов целевого метода на метод заменяющей оболочки для невиртуальных методов.

При обоих подходах используются созданные делегаты вызовов для метода зависимости для определения требуемого поведения в данном методе тестирования.

Дополнительные сведения об изоляции методов модульного тестирования с помощью Microsoft Fakes.

В. Можно ли использовать другие платформы модульного тестирования для создания модульных тестов?

О . Да, выполните инструкции по поиску и установке других платформ. Перезапустив Visual Studio, повторно откройте решение, чтобы создать модульные тесты, и выберите установленные платформы здесь:

Выбор другой установленной платформы модульного тестирования

Заглушки модульных тестов будут созданы с помощью выбранной платформы.