2

当我在运行我的单元测试套件后运行 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 在DetailedHit.h. 此标头非常相似,Hit.h因此我希望报告覆盖率为 0% 时具有相同的行为,但此成员函数:

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

执行 10 次的结果。这是一个简单的函数,因此它应该像 in 中的那样内联Hit.h,但它仍然会被覆盖。万一重要,Hit 是DetailedHit 的具体基类,两者都没有虚拟方法。

我想我错过了一些关于 gcov 和 gcovr 如何工作的重要知识,但我在网上找不到相关线索,所以我很感激任何帮助。谢谢。

4

1 回答 1

3

覆盖率为 0% 的方法是标题中的内联方法。

我确实编译了我正在测试的库,使用gcc --coverage哪些工具收集机器代码来收集覆盖率。但是,我没有对测试可执行文件进行检测,因为我对测试本身的覆盖率不感兴趣。因此,测试可执行文件包含内联方法的代码,而无需对其进行检测。

结果,gcov 知道这些方法,但没有收集到覆盖率(仅执行了非仪器内联版本)。

解决方案:

  • 还使用--coverage编译器标志来检测测试
  • -e使用/ --excludegcovr 选项过滤掉不需要的测试覆盖率数据
于 2019-03-11T15:27:53.650 回答