Как выполнить модульное тестирование компонента C ++ / WinRT?Желательно с охватом кода - PullRequest
0 голосов
/ 15 февраля 2019

Я нахожусь в процессе написания некоторых новых компонентов на основе C ++ / WinRT для замены более старого кода C ++ / CX.Цель состоит в том, чтобы иметь возможность использовать сторонние инструменты C ++, которые не понимают CX (статические анализаторы кода и т. Д.).

Однако первый шаг в этом пути заключается в том, чтобы убедиться, что я могу правильно выполнить модульное тестирование своего собственногокод.Модульное тестирование В коде C ++ / CX обычно используется тип проекта «C ++ Unit Test App», основанный на C ++ / CX и имеющий свои собственные проблемы (отсутствие поддержки покрытия кода, выполнение всего необходимого до появления тестов в проводнике, стабильность и т. Д.)

Просматривая доступные типы проектов в Visual Studio 2017, я не увидел шаблон проекта модульного теста для проектов на основе C ++ / WinRT.Является ли мой единственный вариант использовать шаблон "C ++ Unit Test App" со всеми его ошибками, или есть другой способ создания тестов для библиотеки C ++ / WinRT?

Возможно, есть способ настроить либо "Шаблоны проекта "Родной модульный тест" или "Тест Google" для поддержки того, что я ищу?

В идеале, то, что я ищу, это то, что не требует запуска пользовательского интерфейса, это чистый C ++ (/WinRT) и поддерживает анализ покрытия кода в Visual Studio.

Ответы [ 2 ]

0 голосов
/ 22 февраля 2019

Расширение моего комментария к ответу @ KennyKerr для тех, кто интересуется ...

Если вы планируете использовать Catch2 в соответствии с рекомендациями, тогда шаблон консольного приложения C ++ / WinRT Windows является отличной отправной точкой.Практически все, что вам нужно сделать, это настроить main () для настройки Catch2 и начать писать тестовые примеры.Моя единственная жалоба заключается в том, что шаблоны C ++ / WinRT не позволяют добавлять ссылки на проекты компонентов среды выполнения Windows через пользовательский интерфейс (это необходимо сделать, отредактировав vcxproj).Вероятно, существует аналогичная проблема с добавлением ссылок на пакеты NuGet.

Как отмечалось в моем комментарии выше, на рынке есть тестовый адаптер Catch2 для Visual Studio 2017/2019.Имейте в виду, что для включения адаптера требуется файл .runsettings, который сообщает ему, какие проекты являются тестовыми приложениями Catch2 (через регулярное выражение).Без правильно настроенных параметров запуска он не найдет ваши тесты.Мне также пришлось увеличить тайм-аут обнаружения, иначе он иногда «забывал» мои тесты.

Что касается покрытия кода, при использовании Visual Studio вы можете настроить покрытие кода для включения / исключения функций в файле .runsettings.,См. Сайт Microsoft для подробностей.Для себя я добавил следующее в раздел CodeCoverage, и он пока работает довольно хорошо:

<Functions>
  <Include>
    <Function>.*YourNamespaceHere.*</Function>
  </Include>
  <Exclude>
    <Function>winrt.*GetRuntimeClassName</Function>
    <Function>winrt::impl.*</Function>
    <Function>winrt::(?!YourNamespaceHere).*</Function>
  </Exclude>
</Functions>

Для тех, кто пытается протестировать C ++ / WinRT Windows Runtime Component, как я, и имеет код, который некак часть интерфейса WRC, вот что я сделал, чтобы сделать этот тестируемый ...

  1. Создание проекта общих элементов C ++
  2. Перемещение всего кода для среды выполнения WindowsКомпонент (WRC) проекта в проекте общих элементов, и из проекта WRC.В дальнейшем добавляйте / удаляйте файлы только из общего проекта.Таким образом, вам не нужно прикасаться к проектам WRC или Test при добавлении / удалении файлов.
  3. Добавьте ссылку на этот проект общих элементов как в исходном проекте WRC, так и в тестовом проекте
  4. Убедитесь, что ваш тестовый проект и проект WRC настроены одинаково с учетом параметров компиляции и ссылок проекта / NuGet
  5. Отредактируйте тестовый проект и убедитесь, что RootNamespace настроен так же, как проект WRC (возможно, это необходимо сделатьчерез ваш любимый редактор).Это необходимо, в противном случае сгенерированные заголовки будут иметь префикс с пространством имен и, следовательно, не будут найдены общим кодом.
  6. (Необязательно для покрытия кода) В тестовом проекте включите профилирование (Linker> Advanced>Профиль> Да)

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

Я отмечу, что вышеизложенное также можно использовать для работы «Проекта Native Unit Test» с C ++ / WinRT, у вас есть только дополнительные шаги по интеграции битов C ++ / WinRT всначала тестовый проект.

0 голосов
/ 19 февраля 2019

Нет проекта модульного тестирования, специфичного для C ++ / WinRT, так же, как и для других библиотек, таких как STL.Я бы порекомендовал Catch2 , поскольку он поддерживает C ++ 17 (требование для C ++ / WinRT) и хорошо работает в Windows.Это также то, что мы используем для тестирования самого C ++ / WinRT.Catch2 хорош, потому что он помогает вам создать простое консольное приложение, которое действует как тестовый драйвер, который включает в себя все тесты.

Что касается покрытия кода, у меня нет сильных рекомендаций, но если вы используете Visual Studio, то вы можете попробовать VSInstr .Он может использоваться для покрытия кода и создает отчет, который можно просматривать в Visual Studio.

Убедитесь, что ваш код построен с использованием опции / profile linker.Это обеспечит включение хуков профиля в специальный раздел PE-файла.Затем запустите vsinstr, чтобы настроить любой из интересующих вас двоичных файлов (которые ранее были созданы с помощью / profile):

vsinstr /coverage tests.exe

Теперь запустите vsperfcmd, чтобы начать сбор данных покрытия:

vsperfcmd /start:coverage /output:report

Запустите код как обычно.Для Catch2 вы можете просто запустить исполняемый файл из командной строки.Затем вам нужно остановить сбор следующим образом:

vsperfcmd /shutdown

И все готово.Теперь вы можете просмотреть отчет в Visual Studio:

devenv report.coverage

Надеюсь, это поможет.Опять же, это не относится к C ++ / WinRT, и, поскольку C ++ / WinRT - это библиотека только для заголовков, вы наверняка получите много шума, не связанного с вашим конкретным проектом.Я еще не нашел хороший способ справиться с этим.

...