生成由单独测试调用的 C++ 静态库的测试覆盖率 类

Generating test coverage of C++ static library as called by separate test classes

我正在使用 QT Creator 在 C++ 中处理一个中型项目。

项目结构基本上是这样的

  1. 项目

    • A组
      • 图书馆A1
    • B组
      • 图书馆B1
      • 图书馆B2
      • ...等等
    • 测试

      • LibA1_Test
      • LibB1_Test
      • LibB2_Test
      • ...等等

库由测试项目中的可执行文件测试。我已经设法在启用 gcov 的情况下自行编译测试,并使用 lcov 生成代码覆盖率报告,但它们显示的覆盖率只是测试用例,而不是我正在测试的实际代码。我也尝试过使用 gcov 编译静态库,但是当我 运行 针对这些库进行测试时,它不会生成任何 gcov 输出文件。

如何通过将我的项目库与测试链接来生成 gcov 输出文件?我想看看我的单元测试有没有漏洞。

来自ld manual

--whole-archive
For each archive mentioned on the command line after the --whole-archive option, include every object file in the archive in the link, rather than searching the archive for the required object files.

所以 link 你的静态库使用 --whole-archive 进入你的测试,这将导致你的测试二进制文件具有整个静态库,并提供 gcov 整个可见性代码

说实话,你真的不需要--whole-archive,只需将以下内容添加到所有静态库和单元测试中就足够了,你想要的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#Instrumentation-Options

中也提到了。 因此无需添加 -fprofile-arcs 或任何其他标志的混合。 在您的情况下,将这些标志添加到 A1.pro、B1.pro 和 B2.pro。

在标志周围添加的 scope 只是防止代码覆盖标志在发布或调试模式下污染您的构建。只需将“CONFIG+=CodeCoverage”传递给 qmake.exe,这样它就会以代码覆盖率构建: https://doc.qt.io/archives/qt-4.8/qmake-advanced-usage.html#configuration-and-scopes

之后只是 检查 是否在编译后生成了 *.gcno 文件并在 运行 单元测试后生成了 *.gcda 文件-目录并调用 lcovhttps://gcc.gnu.org/onlinedocs/gcc/Gcov-Data-Files.html#Gcov-Data-Files

附加信息

Whosebug 帮助我解决了我 运行 遇到的问题: Where are the gcov symbols?

如果您 运行 遇到链接器错误,例如(对 __gcov_init 和 __gcov_merge_add 的未定义引用),请注意您实际上是在将这些标志添加到每个单元: https://www.spinics.net/lists/gcchelp/msg29518.html