Как я могу измерить покрытие теста CppUnit (на win32 и Unix)?

У меня очень большая кодовая база, которая содержит обширные модульные тесты (с использованием CppUnit). Мне нужно выяснить, какой процент кода выполняется этими тестами, и (в идеале) сгенерировать какой-то отчет, который сообщает мне для каждой библиотеки или для каждого файла, какой объем кода был выполнен.

И вот что важно: это должно выполняться совершенно незаметно (в конечном счете, внутри непрерывной интеграции) и должно быть кроссплатформенным (ну, по крайней мере, WIN32 и *nix).

Кто-нибудь может предложить инструмент или набор инструментов, которые могут помочь мне сделать это? Я не могу измениться от CppUnit (и я бы не хотел - он пинает задницу), но в остальном я очень хочу услышать любые ваши рекомендации.

Ура,

5 ответов

Решение

Какой инструмент я должен использовать?

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

Особенности покрытия яблочко:

Что касается подключения к вашей непрерывной интеграции, это зависит от того, какое решение CI вы используете, но вы, вероятно, можете подключить этапы измерения инструментов / покрытия в файл make, который вы используете для автоматизированного тестирования.


Тестирование Linux против Windows?

Пока все ваши тесты работают правильно в обеих средах, вы должны точно измерить охват на одном или другом. (Хотя Bullseye поддерживает обе платформы). Но почему вы не делаете непрерывные интеграционные сборки в обеих средах? Если вы поставляете клиентам в обеих средах, то вам нужно тестировать в обоих.

По этой причине может показаться, что вам нужно настроить два сервера непрерывной сборки, один для сборки Linux и один для сборки Windows. Возможно, это легко сделать с помощью некоторого программного обеспечения для виртуализации, такого как vmware или virtualbox. Вам может не потребоваться запускать метрику покрытия кода в обеих ОС, но вы обязательно должны запускать свои модульные тесты в обеих.

Если вы можете использовать GNU GCC в качестве компилятора, тогда инструмент gcov работает хорошо. Очень легко полностью автоматизировать весь процесс.

Если вы используете набор инструментов GCC, gcov получит вам статистику исходного, функционального и отраслевого покрытия. gcov отлично работает для MinGW и Cygwin. Это позволит вам получать статистику покрытия, а также генерировать инструментальный исходный код, который позволяет визуализировать неисполненный код.

Однако, если вы действительно хотите выпустить его из парка с красивыми отчетами, используйте gcov в сочетании с lcov. lcov предоставит вам сводные отчеты, ограниченные файлами и каталогами, статистику функционального покрытия и просмотр исходного кода с цветовой кодировкой, чтобы показать покрытие (зеленый означает выполнение, красный означает, что нет...).

lcov прост в Linux, но может потребовать некоторого взлома Perl на Cygwin. У меня лично были некоторые проблемы с выполнением сценариев (lcov реализован на perl) в Windows. Я получил взломанную версию для работы, но будьте предупреждены.

Другой подход - сделать gcov emit для Windows и выполнить постобработку lcov для Linux, где он, безусловно, будет работать "из коробки".

Проверьте наш SD C++ Test Coverage. Его можно получить как для GCC, так и для MSVC6.

Он имеет низкую нагрузку на сбор данных, хорошее отображение данных покрытия, наложенных на ваш код, и полную генерацию отчетов со сведениями о покрытии по уровням метода /class/file/directory.

РЕДАКТИРОВАТЬ: август 2015: Теперь поддерживает GCC5 и различные диалекты MS с помощью Visual Studio 2015. Чтобы использовать эти инструменты в Linux, вам нужен Wine, но там инструменты предоставляют встроенный в Linux сценарий sh и пользовательский интерфейс на основе Linux/Java, так что инструмент чувствует как родной инструмент Linux там.

Полагаю, мне следовало указать компилятор - мы используем gcc для Linux и MSVC 6 (да, я знаю, он старый, но у нас работает (в основном)) для WIn32.

По этой причине gcov не будет работать для наших сборок Win32, а Bullseye не будет работать для наших сборок Linux.

Опять же, может быть, мне нужно только освещение в одной ОС...

Другие вопросы по тегам