Генерация тестового покрытия статической библиотеки C++, вызываемой отдельными тестовыми классами
Я использую QT Creator для работы над проектом среднего размера на C++.
Структура проекта в основном выглядит так
проект
- Группа А
- Библиотека А1
- Группа Б
- Библиотека B1
- Библиотека В2
- ...так далее
Тестовое задание
- LibA1_Test
- LibB1_Test
- LibB2_Test
- ...так далее
- Группа А
Библиотеки тестируются исполняемыми файлами в тестовом проекте. Мне удалось скомпилировать сами тесты с включенным gcov и создать отчеты о покрытии кода с помощью lcov, но все, что они демонстрировали, - это тестовые случаи, а не сам код, который я тестирую. Я также пытался скомпилировать статические библиотеки с помощью gcov, но когда я запускаю тесты для этих библиотек, он не генерирует никаких выходных файлов gcov.
Как я могу сгенерировать выходные файлы gcov, связав мои библиотеки проектов с тестами? Я хочу увидеть, есть ли пробелы в моих юнит-тестах.
1 ответ
Из руководства ld
--whole-archive
Для каждого архива, упомянутого в командной строке, после--whole-archive
опцию, включите каждый объектный файл в архиве в ссылку, вместо поиска в архиве требуемых объектных файлов.
Так что свяжите свою статическую библиотеку с тестом, используя --whole-archive
, что приведет к тому, что ваш тестовый бинарный файл будет иметь всю статическую библиотеку, и даст gcov
видимость всего кода
Честно говоря, вам действительно не нужен --whole-archive, достаточно просто добавить следующее во все staticlib и Unit-Tests, из которых вы хотите получить информацию gcov:
# only apply codecoverage when CodeCoverage is set and debug-mode is active
CodeCoverage
{
debug:QMAKE_CXXFLAGS_DEBUG += --coverage # -fprofile-arcs -ftest-coverage
debug:QMAKE_LFLAGS_DEBUG += --coverage # -lgcov
}
--coverage
является контекстно-зависимым, и его значение зависит от того, передаете ли вы его в CXXFLAGS или LFLAGS: https://gcc.gnu.org/onlinedocs/gcc/Instrumentation-Options.html
Также упоминается в /questions/1632652/gde-nahodyatsya-simvolyi-gcov/1632672#1632672. Так что не нужно добавлять -fprofile-arcs или любую другую комбинацию флагов. В вашем случае добавьте эти флаги в A1.pro, B1.pro и B2.pro.
Добавленная область видимости вокруг флагов просто предотвращает загрязнение вашей сборки флагами codecoverage в режиме Release или Debug. Просто передайте "CONFIG+=CodeCoverage" в qmake.exe, чтобы он создавался с покрытием кода: https://doc.qt.io/archives/qt-4.8/qmake-advanced-usage.html
После этого просто проверьте, были ли после компиляции файлы *.gcno и после запуска Unit-Test файлы *.gcda были сгенерированы в каталоге сборки и вызовитеlcov
на них: https://gcc.gnu.org/onlinedocs/gcc/Gcov-Data-Files.html
Дополнительная информация
Stackru, который помог мне решить мои проблемы, с которыми я столкнулся: Где символы gcov?
если вы сталкиваетесь с ошибками компоновщика, такими как (неопределенная ссылка на __gcov_init и __gcov_merge_add), обратите внимание, что вы действительно добавляете эти флаги к каждому модулю: https://www.spinics.net/lists/gcchelp/msg29518.html