Gcov рассматривает имя файла и имя функции как вход для вычисления покрытия кода - PullRequest
0 голосов
/ 22 января 2019

В настоящее время в нашем проекте и наш клиент, и наша команда работают параллельно, для создания кода требуется код обеих командных модулей.Мы используем gcov для покрытия кода.В настоящее время сгенерированное покрытие показывает обе команды.Есть ли способ сгенерировать покрытие блока gcov только для нашего модуля (наш модуль строится не один).

Есть ли способ запустить только для наших файлов (или) можно ли запустить на основе имени функции?

1 Ответ

0 голосов
/ 29 января 2019

Да, есть два основных способа управления генерируемыми отчетами о покрытии:

  1. Указание вашему генератору (например, lcov, gcovr) включить / исключить определенные шаблоны файлов
  2. Компиляция только ваших исходных файлов с включенным покрытием.

(1) намного проще, чем (2). Например, если вы используете lcov, рассмотрите вариант --extract:

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

(2) может быть сложно (или невозможно) в зависимости от вашей системы сборки. Для этого вам необходимо:

  1. Компиляция только вашего модуля с --coverage (эквивалентно -ftest-coverage -fprofile-arcs для компиляторов GNU)
  2. Свяжите вашу библиотеку с lgcov.

Это создаст *.gcno файлы 'notes', которые сообщат генераторам покрытия о ваших исходных файлах только для файлов, которые вы скомпилировали с флагами --coverage. Затем при запуске набора тестов файлы *.gcda должны создаваться только для этого же набора файлов. Запуск окончательного отчета о покрытии / генератора HTML приведет к созданию отчета только для вашего модуля.

Для иллюстрации приведу простой файл CMake, который генерирует только информацию о покрытии для covered.cxx. Обратите внимание на дополнительные target_compile_options и target_link_libraries для библиотеки covered.

add_executable(${PROJECT_NAME} main.cxx)                  

add_library(not-covered SHARED not-covered.cxx)           
add_library(covered SHARED covered.cxx)                   

target_compile_options(covered PRIVATE --coverage)        
target_link_libraries(covered PRIVATE --coverage)         

target_link_libraries(${PROJECT_NAME} covered not-covered)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...