Генерация тестового покрытия статической библиотеки C++, вызываемой отдельными тестовыми классами

Я использую QT Creator для работы над проектом среднего размера на C++.

Структура проекта в основном выглядит так

  1. проект

    • Группа А
      • Библиотека А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

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