我正在尝试在 Windows 上使用 LLVM 工具为大型 C++ 项目生成代码覆盖率,但我所能获得的只是一级深度覆盖率,这是正常行为还是我做错了什么? 这是设置: 我有两节课:
class A
{
public:
bool foo() {return true;}
};
class B
{
private:
A kung;
public:
bool bar(){return kung.foo();}
};
我使用 Google Test 对所有内容进行单元测试:
TEST(Suite, Name)
{
B ba;
EXPECT_TRUE(ba.bar());
}
该项目是使用 CMake/Ninja 配置和生成的,并使用 clang-cl 进行编译,具有以下标志:
-fprofile-instr-generate -fcoverage-mapping
。编译在发布时完成,所有优化均关闭 (-Xclang -O0
)。
运行测试会创建预期的
profraw
文件,然后将其输入到 grcov
中以生成 html 和 markdown 报告。
grcov ./bin --llvm --branch --llvm-path <MS_LLMV_PATH> -b ./bin -s ./Sources -t html,markdown --ignore-not-existing -o .
生成的报告仅显示 50% 的覆盖率,并显示调用了
B::bar()
,但未调用 A::foo()
。
这种行为是否正确且符合预期?我做错了什么吗?我使用的工具有错误吗?
PS:我还尝试了 --coverage 编译器选项,它生成
.gcno
文件,然后在运行测试后生成 .gcda
文件。但我在报告中得到了更奇怪的结果,代码浏览器中有很多空白行(所以既没有被覆盖也没有被发现!)。
原来我是个白痴:)
我正在为所有库生成静态和动态版本,并且我只是为动态库生成 CC 信息(并且大多数单元测试当前都使用静态库)。
现在一切都很好。