Вы находитесь на странице: 1из 22

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

1) Создать Тестовый Проект в Решении, которое содержит Основной Проект и Тести-


руемую Функцию
2) Задать в Тестовом Проекте ссылку на Основной Проект
3) Подключить Заголовочный Файл с Тестируемой Функцией из Основного Проекта
4) Задать в Тестовом проекте ссылку на Объектный файл из Основного Проекта
5) Написать Методы Модульного Теста в Тестовом Проекте
6) Запустить Модульный Тест
1) Создание тестового проекта в Visual Studio 2019

https://docs.microsoft.com/ru-ru/visualstudio/test/writing-unit-tests-for-c-cpp?view=vs-2019

Тесты определяются и выполняются в одном или нескольких тестовых проектах, которые


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

Чтобы код теста имел доступ к функциям в тестируемом проекте, добавьте ссылку на этот
проект в тестовый проект. Щелкните правой кнопкой мыши узел тестового проекта в обо-
зревателе решений и выберите пункты Добавить > Ссылка. Затем в диалоговом окне
выберите проекты, которые нужно тестировать.
3) Добавление директив #include для файлов заголовков

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

https://docs.microsoft.com/ru-ru/visualstudio/test/unit-testing-existing-cpp-applications-with-test-
explorer?view=vs-2015#objectRef

1) В обозревателе решений в контекстном меню тестового проекта выберите пункт Свой-


ства. Откроется окно свойств проекта.
2) Выберите Свойства конфигурации, Каталоги VC++, Каталоги включаемых
файлов.

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


3) Выберите Свойства конфигурации, Компоновщик, Общие, Дополнительные
каталоги библиотек.

Выберите Изменить и добавьте путь к каталогу файлов .obj или .lib. Путь обычно на-
ходится внутри папки построения тестируемого проекта.
4) Выберите Свойства конфигурации, Компоновщик, Ввод, Дополнительные за-
висимости.
5) Выберите Изменить и добавьте имена файлов .obj или .lib. Не используйте полный
путь.
5) Написание методов теста

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


вания Майкрософт для C/C++. Он описан здесь: Справочник по API
Microsoft.VisualStudio.TestTools.CppUnitTestFramework.

В CPP-файле в тестовом проекте определены класс-заглушка и метод-заглушка в качестве


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

TEST_CLASS и TEST_METHOD являются частью собственной платформы тестирования


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

TEST_METHOD возвращает пустое значение. Чтобы получить результат теста, используйте


статические методы класса Assert для сравнения фактических результатов с ожидаемыми.
#include "stdafx.h"
#include "CppUnitTest.h"
#include "MyProjectUnderTest.h"
using namespace Microsoft::VisualStudio::CppUnitTestFramework;
namespace MyTest
{
TEST_CLASS(MyTests)
{
public:
TEST_METHOD(MyTestMethod)
{
Assert::AreEqual(MyProject::Multiply(2,3), 6);
}
};
}

В предыдущем примере результат вызова Assert::AreEqual определяет, пройден ли тест ус-


пешно. Класс Assert содержит множество других методов для сравнения ожидаемых и фак-
тических результатов.
6) Запуск тестов

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

2. Если в окне видны не все тесты, выполните сборку тестового проекта, щелкнув его
узел в обозревателе решений правой кнопкой мыши и выбрав пункт Сборка или
Перестроить.
3. В обозревателе тестов нажмите Запустить все или выберите тесты, которые сле-
дует запустить. Щелкните тест правой кнопкой мыши, чтобы получить доступ к дру-
гим командам, включая запуск в режиме отладки с включенными точками останова.
После выполнения всех тестов в окне будет показано, какие из них были пройдены
успешно, а какие — неудачно.
Для неудачных тестов приводятся подробные сведения, которые могут помочь установить
причину. Вы можете щелкнуть неудачный тест правой кнопкой мыши и выбрать команду
Отладить выбранные тесты для пошагового выполнения функции, в которой произо-
шел сбой.

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


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

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


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

https://docs.microsoft.com/ru-ru/visualstudio/test/run-unit-tests-with-test-explorer?view=vs-2019

С помощью обозревателя тестов вы можете запускать модульные тесты из Visual Studio или
сторонних проектов модульного тестирования. Кроме того, обозреватель тестов позволяет
группировать тесты по категориям, фильтровать список тестов, а также создавать, сохранять
и запускать списки воспроизведения тестов. Также с его помощью можно выполнять отлад-
ку тестов и анализировать производительность тестов и покрытие кода.

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

При построении проекта тестирования тесты появляются в Обозревателе тестов. Если Обо-
зреватель тестов не виден, выберите Тест в меню Visual Studio, выберите Windows, затем
выберите Обозреватель тестов.

При запуске, записи и повторном запуске тестов результаты в обозревателе тестов отобра-
жаются в стандартных группах Проект, Пространство имен и Класс. Вы можете изме-
нить способ группировки тестов обозревателем тестов.
Большую часть работы по поиску, организации и выполнению тестов можно выполнять из
панели инструментов обозревателя тестов.

7.2) Выполнить тесты

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

 Чтобы выполнить все тесты в решении, выберите значок Выполнить все.

 Чтобы выполнить все тесты в группе по умолчанию, выберите значок Запуск, а затем
группу в меню.

 Выберите отдельные тесты, которые требуется запустить, откройте контекстное меню


для выбранного теста и щелкните Запустить выбранные тесты.

 Если отдельные тесты не имеют зависимостей, предотвращающих запуск этих тестов


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

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

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

При выполнении, написании и повторном запуске тестов обозреватель тестов отображает


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

7.4) Просмотр сведений о тесте

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

В области сведений о тесте отображаются следующие сведения.

 Имя исходного файла и номер строки метода теста.

 Состояние теста.

 Время, затраченное на выполнение метода теста.

Если тест не пройден, в области сведений также отображается следующее:

 сообщение, возвращенное платформой модульного тестирования для теста;

 трассировка стека во время сбоя теста.

7.5) Просмотр исходного кода метода теста

Чтобы вывести исходный код для метода теста в редакторе Visual Studio, выберите тест, а
затем в контекстном меню щелкните Открыть тест (клавиша F12).
7.6) Группирование тестов в списке тестов

Обозреватель тестов позволяет группировать тесты в иерархию. Иерархические группы по


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

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


тем классу, например, выбрав параметры "Группировать по" в порядке предпочтения.
7.7) Отладка и анализ модульных тестов

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

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

Примечание

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

2. В обозревателе тестов выберите методы теста, а затем выберите в контекстном меню


пункт Отладить выбранные тесты.

Дополнительные сведения об отладчике см. в статье Отладка в Visual Studio.

7.8) Диагностика проблем производительности метода теста

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

7.9) Анализ покрытия кода модульного теста

Можно определить количество кода продукта, который действительно был проверен мо-
дульным тестированием, при помощи средства покрытия кода Visual Studio, доступного в
выпуске Visual Studio Enterprise. Можно запустить покрытие кода на выбранных тестах или
на всех тестах решения.

Для запуска покрытия кода для методов теста в решении

 Щелкните правой кнопкой мыши в обозревателе тестов и выберите Анализ покры-


тия кода для выбранных тестов.

Окно результатов объема протестированного кода отображает процент блоков кода


продукта, которые были задействованы по строке, функции, классу, пространству имен и
модулю.

Дополнительные сведения см. в статье Использование параметра объема протестированно-


го кода для определения объема протестированного кода.
7.10) Сочетания клавиш для управления тестами

Чтобы запустить тест из обозревателя тестов, щелкните тест правой кнопкой мыши в ре-
дакторе кода и выберите Запустить тест. Также для этого можно использовать установ-
ленные по умолчанию сочетания клавиш обозревателя тестов в Visual Studio. Некоторые со-
четания клавиш зависят от контекста. Это значит, что они запускают тесты или выполняют
их отладку в зависимости от того, в каком месте редактора кода находится курсор. Если кур-
сор находится внутри метода теста, этот метод запускается. Если курсор находится на уровне
класса, запускаются все тесты в этом классе. Аналогичным образом реализуется поведение
на уровне пространства имен.

Часто используемые команды Сочетания клавиш

TestExplorer.DebugAllTestsInContext CTRL+R, CTRL+T

TestExplorer.RunAllTestsInContext CTRL+R, T

TestExplorer.RunAllTests CTRL+R, A

TestExplorer.RepeatLastRun CTRL+R, L
Справочник по API Microsoft.VisualStudio.TestTools.CppUnitTestFramework

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

TEST_CLASS(className)

Требуется для каждого класса, содержащего методы тестов. Определяет className как тес-
товый класс. TEST_CLASS должен быть объявлен в области пространства имен.

TEST_METHOD(methodName)
{
// test method body
}
Определяет methodName как метод теста. TEST_METHOD необходимо объявить в области
класса метода.

Проверка на равенство

Проверяет, равны ли два объекта типа double.

static void Assert::AreEqual(


double expected,
double actual,
double tolerance,
const wchar_t* message = NULL,
const __LineInfo* pLineInfo = NULL)

Пример:

Assert:AreEqual(5.0, sum(3.0, 2.0));


Assert:AreEqual(5.0, sum(3.0, 2.0), 0.000001, "sum is fail");

Проверяет, равны ли два объекта типа float.

static void Assert::AreEqual(


float expected,
float actual,
float tolerance,
const wchar_t* message = NULL,
const __LineInfo* pLineInfo = NULL)

Проверяет, равны ли две строки char*.


static void Assert::AreEqual(
const char* expected,
const char* actual,
bool ignoreCase = false,
const wchar_t* message = NULL,
const __LineInfo* pLineInfo = NULL)

Пример:

Assert:AreEqual("one two", strcat("one ", "two"));


Assert:AreEqual("one two", strcat("one ", "two"), false, "strcat is fail");

Проверка на неравенство

Проверяет неравенство двух объектов типа double.

static void Assert::AreNotEqual(


double notExpected,
double actual,
double tolerance,
const wchar_t* message = NULL,
const __LineInfo* pLineInfo = NULL)

Пример:

Assert:AreNotEqual(1.0, 1.0 + 2.0);

Проверяет неравенство двух объектов типа float.

static void Assert::AreNotEqual(


float notExpected,
float actual,
float tolerance,
const wchar_t* message = NULL,
const __LineInfo* pLineInfo = NULL)

Проверяет неравенство двух строк char*.

static void Assert::AreNotEqual(


const char* notExpected,
const char* actual,
bool ignoreCase = false,
const wchar_t* message = NULL,
const __LineInfo* pLineInfo = NULL)

Имеет значение Null

Проверяет, имеет ли указатель значение NULL.

template<typename T>
static void Assert::IsNull(
const T* actual,
const wchar_t* message = NULL,
const __LineInfo* pLineInfo = NULL)

Пример:

char *str = NULL;


Assert:IsNull (str);

Имеет значение не Null

Проверяет, что указатель не равен NULL.

template<typename T>
static void Assert::IsNotNull(
const T* actual,
const wchar_t* message = NULL,
const __LineInfo* pLineInfo = NULL)

Условие имеет значение true

Проверяет, имеет ли условие значение true.

static void Assert::IsTrue(


bool condition,
const wchar_t* message = NULL,
const __LineInfo* pLineInfo = NULL)

Пример:

Assert:IsTrue( 3 > 2 );
Условие имеет значение false

Проверяет, имеет ли условие значение false.

static void Assert::IsFalse(


bool condition,
const wchar_t* message = NULL,
const __LineInfo* pLineInfo = NULL)

Не пройден

Принудительно вернуть ошибку в тесте.

static void Assert::Fail(


const wchar_t* message = NULL,
const __LineInfo* pLineInfo = NULL)

Пример:

Assert:Fail("Not implemented");

Вам также может понравиться