如何获得 header 文件中成员函数的正确代码覆盖率
How to get correct code coverage for member functions in header files
当我在 运行 单元测试套件之后 运行 gcovr 时,我得到错误的覆盖 header 文件的数字,其中放置了一些内联成员函数定义。例如:
----------------------------------------------------------------------------
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%,但我确信在单元测试 运行 期间至少执行了 header 中的一些代码,因为如果我放置一个 cout 然后我在控制台输出中看到它。在网络上,经常有人认为这是编译器内联成员函数代码的问题,因此没有生成函数调用,因此覆盖工具不会跟踪执行。所以我添加了标志:
-fno-inline -fno-inline-small-functions -fno-default-inline
调用编译器 (gcc 8.2.1),但我得到了相同的覆盖率报告。所以我不明白发生了什么。
最让我困惑的是为什么 gcovr 在 DetailedHit.h
中报告了 2 条被覆盖的行。这个 header 与 Hit.h
非常相似,所以我希望报告覆盖率为 0% 的行为相同,但是这个成员函数:
const std::vector<Herd::ParticleHit> ParticleHits() const {
return _particleHits;
}
执行10次的结果。这是一个简单的函数,所以它应该像 Hit.h
中的那样内联,但它仍然会被覆盖。如果重要的话,Hit 是 DetailedHit 的具体基础 class,两者都没有虚拟方法。
我想我遗漏了一些关于 gcov 和 gcovr 如何工作的重要知识,但我在网上找不到相关线索,因此我将不胜感激。谢谢。
覆盖率为 0% 的方法是 header 中的内联方法。
我确实用 gcc --coverage
编译了我正在测试的库,它检测机器代码以收集覆盖率。但是,我没有检测测试可执行文件,因为我对测试本身的覆盖范围不感兴趣。因此,测试可执行文件包含内联方法的代码,但未对它们进行检测。
因此,这些方法为 gcov 所知,但未收集覆盖率(仅执行了 non-instrumented 内联版本)。
解决方法:
- 还使用
--coverage
编译器标志 检测测试
- 使用
-e
/--exclude
gcovr 选项 过滤掉不需要的测试覆盖率数据
当我在 运行 单元测试套件之后 运行 gcovr 时,我得到错误的覆盖 header 文件的数字,其中放置了一些内联成员函数定义。例如:
----------------------------------------------------------------------------
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%,但我确信在单元测试 运行 期间至少执行了 header 中的一些代码,因为如果我放置一个 cout 然后我在控制台输出中看到它。在网络上,经常有人认为这是编译器内联成员函数代码的问题,因此没有生成函数调用,因此覆盖工具不会跟踪执行。所以我添加了标志:
-fno-inline -fno-inline-small-functions -fno-default-inline
调用编译器 (gcc 8.2.1),但我得到了相同的覆盖率报告。所以我不明白发生了什么。
最让我困惑的是为什么 gcovr 在 DetailedHit.h
中报告了 2 条被覆盖的行。这个 header 与 Hit.h
非常相似,所以我希望报告覆盖率为 0% 的行为相同,但是这个成员函数:
const std::vector<Herd::ParticleHit> ParticleHits() const {
return _particleHits;
}
执行10次的结果。这是一个简单的函数,所以它应该像 Hit.h
中的那样内联,但它仍然会被覆盖。如果重要的话,Hit 是 DetailedHit 的具体基础 class,两者都没有虚拟方法。
我想我遗漏了一些关于 gcov 和 gcovr 如何工作的重要知识,但我在网上找不到相关线索,因此我将不胜感激。谢谢。
覆盖率为 0% 的方法是 header 中的内联方法。
我确实用 gcc --coverage
编译了我正在测试的库,它检测机器代码以收集覆盖率。但是,我没有检测测试可执行文件,因为我对测试本身的覆盖范围不感兴趣。因此,测试可执行文件包含内联方法的代码,但未对它们进行检测。
因此,这些方法为 gcov 所知,但未收集覆盖率(仅执行了 non-instrumented 内联版本)。
解决方法:
- 还使用
--coverage
编译器标志 检测测试
- 使用
-e
/--exclude
gcovr 选项 过滤掉不需要的测试覆盖率数据