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


Основы модульного теста

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

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

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

Начало работы

Введение в модульное тестирование, которое познакомит вас с кодированием, см. в одной из следующих статей.

Пример решения Банка

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

Решение 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

Начиная с версии Insiders сборки Visual Studio 2026, можно использовать функцию тестирования GitHub Copilot для .NET для автоматической генерации модульных тестов. Тестирование GitHub Copilot для .NET не только создает тесты, но и отлаживает их, и запускает в Test Explorer. Дополнительные сведения см. в разделе "Обзор тестирования GitHub Copilot для .NET". Это рекомендуемый метод для создания тестов.

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

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

Используя сборку Visual Studio 2026 Insiders, вы можете воспользоваться функцией тестирования GitHub Copilot для .NET для автоматического создания модульных тестов.

Большинство процедур, описанных в этой статье, применяются к созданным вручную тестам. Если вы хотите узнать больше подробных сведений об модульном тестировании, ознакомьтесь с остальной частью этой статьи или перейдите к разделу "Выполнение тестов" в обозревателе тестов.

Создание модульных тестов с помощью 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 или более поздней версии.

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

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

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

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

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

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

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

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

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

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

    Замечание

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

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

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

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

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

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

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

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

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

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

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

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

  4. В проекте модульного теста добавьте ссылку на тестируемый проект кода в нашем примере в проект Accounts.

    Чтобы создать ссылку на проект кода:

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

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

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

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

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

Пишите свои тесты

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

Шаблон AAA (Arrange, Act, Assert) — это распространенный способ написания модульных тестов для метода под тестом.

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

  • В разделе Act вызывается тестируемый метод с упорядоченными параметрами.

  • В разделе Assert проверяется, что действие метода в тестируемом режиме работает должным образом. Для .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).

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

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

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

Вы также можете фильтровать тесты в любом представлении, сопоставляя текст в поле поиска на глобальном уровне или выбрав один из предварительно определенных фильтров. Вы можете выполнять любой выбор тестов в любое время. Результаты тестового запуска сразу же видны на панели состояния (успех/неудача) в верхней части окна проводника. При выборе теста отображаются сведения о результатах метода теста.

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

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

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

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

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

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

Выполнение тестов после каждой сборки

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

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

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

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

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

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

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

Q&A

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

A: Используйте обозреватель тестов для запуска сеанса отладки для тестов. Пошаговое выполнение кода с помощью отладчика Visual Studio позволяет легко переходить между модульными тестами и проектом, на который выполняется тестирование. Чтобы начать отладку, выполните следующие действия.

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

    Замечание

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

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

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

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

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

Меню быстрых действий для создания шаблона метода

Меню быстрых действий для создания шаблона метода

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

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

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

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

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

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

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

Вы можете запустить анализ покрытия кода для выбранных тестов или для всех тестов в рамках решения. В окне "Результаты покрытия кода" отображается процент выполнения блоков кода продукта по строкам, функциям, классам, пространствам имен и модулям.

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

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

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

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

Дополнительные сведения о охвате кода.

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

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

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

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

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

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

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

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

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

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

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

Вопрос. Как экспортировать результаты модульного теста?

A: С помощью командной строки или интегрированной среды разработки Visual Studio можно использовать файл .runsettings , чтобы настроить модульные тесты и задать файл результатов теста. Дополнительные сведения см. в разделе "Элемент LoggerRunSettings".