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

时间:2016-06-29 18:28:05

标签: c++ gcc qt-creator code-coverage gcov

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

项目结构基本上如下所示

  1. 项目

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

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

    如何通过将项目库与测试链接来生成gcov输出文件?我想看看我的单元测试中是否有任何空白。

2 个答案:

答案 0 :(得分:2)

来自ld manual

  

--whole-archive
  对于--whole-archive选项后命令行中提到的每个归档,请在归档中包含每个目标文件   在链接中,而不是在存档中搜索所需的对象   文件。

因此,使用--whole-archive将您的静态库链接到您的测试中,这将导致您的测试二进制文件具有整个静态库,并提供gcov整个代码的可见性

答案 1 :(得分:0)

说实话,您实际上不需要--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#Instrumentation-Options

https://stackoverflow.com/a/5352713/7820869中也提到过。 因此,无需添加-fprofile-arcs或任何其他标志混合。 您可以将这些标志添加到A1.pro,B1.pro和B2.pro。

在标志周围添加的作用域只是为了防止代码覆盖标志在发布或调试模式下污染您的构建。只需将“ CONFIG + = CodeCoverage”传递给qmake.exe,即可​​使用代码覆盖率进行构建: https://doc.qt.io/archives/qt-4.8/qmake-advanced-usage.html#configuration-and-scopes

之后,只需检查,即可在构建目录中生成* .gcno文件并运行单元测试后,是否已生成* .gcda文件并调用 {{1 }} https://gcc.gnu.org/onlinedocs/gcc/Gcov-Data-Files.html#Gcov-Data-Files

其他信息

stackoverflow,它帮助我解决了遇到的问题: Where are the gcov symbols?

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