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

Когда я запускаю gcovr после запуска моего модульного теста, я получаю неправильный номер для покрытия заголовочных файлов, где размещены некоторые определения встроенных функций-членов.Например:

----------------------------------------------------------------------------  
File                                       Lines    Exec  Cover   Missing  
------------------------------------------------------------------------------   
include/analysis/dataobjects/DetailedHit.h     6       2    33%   41-43,45
include/analysis/dataobjects/Hit.h            19       0     0%   31-33,35-36,42-43,50-51,58-59,74-75,82-83,90-91,98-99

Для Hit.h зарегистрированное покрытие составляет 0%, но я уверен, что по крайней мере некоторый код из этого заголовка будет выполнен во время выполнения модульного теста, так как, если я помещу cout втогда я вижу это в консоли.В Интернете часто говорят, что это проблема, связанная с тем фактом, что компилятор включает код функции-члена, так что вызов функции не генерируется, и, следовательно, инструменты покрытия не отслеживают выполнение.Поэтому я добавил флаги:

-fno-inline -fno-inline-small-functions -fno-default-inline

к вызову компилятора (gcc 8.2.1), но я получаю тот же отчет о покрытии.Так что я не понимаю, что происходит.

Меня больше всего удивляет то, что gcovr сообщает о 2 закрытых строках в DetailedHit.h.Этот заголовок очень похож на Hit.h, поэтому я ожидал бы того же поведения с 0% заявленным покрытием, но эта функция-член:

const std::vector<Herd::ParticleHit> ParticleHits() const {
  return _particleHits;
}

результаты будут выполнены 10 раз.Это простая функция, поэтому она должна быть вставлена ​​как те, что указаны в Hit.h, но все же она должна быть покрыта.В случае, если это имеет значение, Hit является конкретным базовым классом для DetailHit, и у обоих нет виртуальных методов.

Я думаю, что мне не хватает некоторых важных знаний о том, как работают gcov и gcovr, но я не смогя не могу найти подходящую подсказку в Интернете, поэтому я буду признателен за любую помощь в этом.Благодаря.

1 Ответ

1 голос
/ 11 марта 2019

Методы с охватом 0% были встроенными методами в заголовке.

Я скомпилировал библиотеку, которую я тестировал, с gcc --coverage, которая использует машинный код для сбора покрытия.Тем не менее, я не тестировал исполняемый файл теста, поскольку не заинтересован в освещении самих тестов.Таким образом, исполняемый файл теста содержал код для встроенных методов без их инструментария.

В результате методы были известны gcov, но покрытие не было собрано (была выполнена только неинструментированная встроенная версия).

Решение:

  • также проводит тестирование, используя флаг компилятора --coverage
  • , отфильтровывает нежелательные данные покрытия тестов с помощью -e / * 1015.* gcovr option
...