Написание модульных тестов для C/C++ в Visual Studio

С помощью окна Обозреватель тестов вы можете создавать и выполнять модульные тесты для C++. Делается это так же, как и для других языков. Дополнительные сведения об использовании обозревателя тестов см. в разделе Выполнение модульных тестов с помощью обозревателя тестов.

Примечание.

Некоторые функции, такие как Live Unit Testing, закодированные тесты пользовательского интерфейса и IntelliTest, не поддерживаются для C++.

Visual Studio включает в себя эти платформы тестирования C++ без дополнительных загрузок:

  • Платформа модульного тестирования Майкрософт для C++
  • Google Test
  • Boost.Test
  • CTest

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

Visual Studio 2017 и более поздних версий (Professional и Enterprise)

Проекты модульных тестов для C++ поддерживают CodeLens.

Visual Studio 2017 и более поздних версий (все выпуски)

  • Адаптер Google Test включен по умолчанию в рабочую нагрузку Разработка классических приложений на C++. Он содержит шаблон проекта, который можно добавить в решение. Щелкните правой кнопкой мыши узел решения в Обозревателе решений и выберите Добавить>Новый проект в контекстном меню, чтобы добавить шаблон проекта. Параметры адаптера также можно настроить в окне Сервис>Параметры. Дополнительные сведения см. в статье "Практическое руководство . Использование Google Test в Visual Studio".

  • Компонент Boost.Test включен по умолчанию в рабочую нагрузку Разработка классических приложений на C++. Он интегрирован с обозревателем тестов, но в настоящее время не имеет шаблона проекта. Его необходимо настроить вручную. Дополнительные сведения см. в статье "Практическое руководство. Использование Boost.Test в Visual Studio".

  • Поддержка CTest включена в компонент Средства CMake C++, который входит в рабочую нагрузку Разработка классических приложений на C++. Дополнительные сведения см. в разделе "Практическое руководство. Использование CTest в Visual Studio".

Более ранние версии Visual Studio

Вы можете скачать расширения "Адаптер Google Test" и "Адаптер Boost.Test" в Visual Studio Marketplace. Найти их можно на страницах Test Adapter for Boost.Test (Адаптер теста для Boost.Test) и Test Adapter for Google Test (Адаптер теста для Google Test).

Совет

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

Базовый процесс тестирования

В следующих разделах описываются основные действия по началу модульного тестирования для C++. Базовая настройка для платформ Майкрософт и Google Test схожа. Boost.Test требует создать тестовый проект вручную.

Создание тестового проекта в Visual Studio 2022

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

Чтобы добавить новый тестовый проект в существующее решение:

  1. В Обозревателе решений щелкните правой кнопкой мыши узел решения.
  2. Во всплывающем меню выберите пункты Добавить>Новый проект.
  3. Задайте С++ для параметра Язык и введите "тест" в поле поиска. На приведенном ниже рисунке показаны тестовые проекты, доступные при установке рабочей нагрузки Разработка классических приложений на C++ и Разработка для универсальной платформы Windows.

Тестовые проекты на C++ в Visual Studio 2022

Создание тестового проекта в Visual Studio 2019

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

  1. В Обозревателе решений щелкните правой кнопкой мыши узел решения.
  2. Во всплывающем меню выберите пункты Добавить>Новый проект.
  3. Задайте С++ для параметра Язык и введите "тест" в поле поиска. На приведенном ниже рисунке показаны тестовые проекты, доступные при установке рабочей нагрузки Разработка классических приложений на C++ и Разработка для универсальной платформы Windows.

Тестовые проекты на C++ в Visual Studio 2019

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

Чтобы обеспечить доступ к функциям в тестируемом проекте, добавьте ссылку на проект в тестовый проект. Щелкните правой кнопкой мыши узел тестового проекта в обозревателе решений. Во всплывающем меню выберите пункты Добавить>Ссылка. В диалоговом окне Добавление ссылки выберите проекты, которые нужно тестировать.

Добавление ссылки

Если тестовый код не экспортирует функции, которые требуется проверить, добавьте выходные .obj или LIB-файлы в зависимости тестового проекта. Дополнительные сведения см. в разделе Связывание тестов с объектным файлом или файлом библиотеки. Не включать файлы объектов, имеющие main функцию или другую стандартную точку входа, например wmain, WinMainили DllMain. При добавлении новых исходных файлов в проект обновите зависимости тестового проекта, чтобы включить соответствующие файлы объектов.

Добавление директив #include для файлов заголовков

Далее в CPP-файле модульного теста добавьте директивы #include для всех файлов заголовков, в которых объявляются тестируемые типы и функции. Введите #include "и активирует IntelliSense, чтобы помочь вам выбрать. Повторите эти действия для других заголовков.

Снимок экрана: Обозреватель решений, в окне которого показано добавление директивы #include с помощью IntelliSense. Выделен файл заголовка для включения.

Чтобы не вводить полный путь в каждой инструкции include в исходном файле, можно добавить необходимые папки в разделе Проект>Свойства>C/C++>Общие>Дополнительные каталоги включаемых файлов.

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

Примечание.

В этом разделе представлен синтаксис при использовании платформы модульного тестирования Майкрософт для C/C++. Он задокументирован в справочнике по API Microsoft.VisualStudio.TestTools.CppUnitTestFramework. Документацию по Google Test см. на странице Google Test Primer (Начало работы с Google Test). Сведения о Boost.Test см. на странице Boost Test Library: The Unit Test Framework (Библиотека Boost.Test: платформа модульного тестирования).

В CPP-файле в тестовом проекте определены класс-заглушка и метод-заглушка. Они служат примером того, как следует писать код теста. В сигнатурах используются макросы TEST_CLASS и TEST_METHOD, что позволяет обнаруживать методы в окне обозревателя тестов.

Снимок экрана: окно Обозревателя тестов, в котором показан файл кода unittest1.cpp, содержащий заглушку класса и метода при использовании макросов TEST CLASS и TEST_METHOD.

TEST_CLASS и TEST_METHOD являются частью собственной платформы тестирования Microsoft. Обозреватель тестов обнаруживает методы теста в других поддерживаемых платформах аналогичным образом.

TEST_METHOD возвращает пустое значение. Чтобы получить результат теста, используйте статические методы класса Assert для сравнения фактических результатов с ожидаемыми. В приведенном ниже примере предполагается, что MyClass имеет конструктор, принимающий std::string. В этом примере показано, как можно проверить, что конструктор инициализирует класс так, как ожидается:

TEST_METHOD(TestClassInit)
{
    std::string name = "Bill";
    MyClass mc(name);
    Assert::AreEqual(name, mc.GetName());
}

В предыдущем примере результат вызова Assert::AreEqual определяет, пройден ли тест успешно. Класс Assert содержит множество других методов для сравнения ожидаемых и фактических результатов.

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

Запуск тестов

  1. В меню Тест выберите пункт Windows>, а затем пункт Обозреватель тестов. На рисунке ниже показан тестовый проект, тесты которого еще не выполнялись.

    Обозреватель тестов до выполнения тестов

    Примечание.

    Интеграция CTest с обозревателем тестов пока не доступна. Запустите тесты CTest в главном меню CMake.

  2. Если в окне видны не все тесты, выполните сборку тестового проекта, щелкнув правой кнопкой мыши его узел в Обозревателе решений и выбрав Сборка или Перестроить.

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

    Обозреватель тестов после выполнения тестов

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

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

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

Использование CodeLens

Visual Studio 2017 и более поздних версий (выпуски Professional и Enterprise)

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

Инициализировать CodeLens для проекта модульного теста C++ можно любым из перечисленных ниже способов.

  • Отредактировать и собрать тестовый проект или решение.
  • Перестроить проект или решение.
  • Запустить тесты из окна обозревателя тестов.

После инициализации значки состояния тестов отобразятся над каждым модульным тестом.

Значки CodeLens для C++

Щелкните значок для получения дополнительных сведений или выполните или отладите модульный тест:

Запуск и отладка CodeLens для C++