让llvm-cov与codecov.io交谈

时间:2018-05-30 21:29:39

标签: code-coverage codecov llvm-cov

我正在(终于!)为我的全新C ++项目设置代码覆盖率监控的过程中。由于我需要一些高级C ++ 20功能(读取,协同程序),我使用clang 6作为编译器。

现在,我按照this guide关于如何为您的项目执行基本代码覆盖,一切都像魔术一样有效。如果我这样做:

clang++ -fprofile-instr-generate -fcoverage-mapping test.cpp -o test.out
LLVM_PROFILE_FILE="coverage/test.profraw" ./test.out
llvm-profdata merge -sparse coverage/test.profraw -o coverage/test.profdata
llvm-cov show ./test.out -instr-profile=coverage/test.profdata

我在终端上收到一份漂亮的彩色报告,告诉我什么是被覆盖的,什么不是。

到目前为止一切顺利!我以为我接近我想要的,但当我试图将报告上传到codecov.io时,痛苦就开始了。

我尝试过一些事情,包括:

  • 在我的https://codecov.io/bash文件夹中运行他们的coverage脚本,希望它可能会出现在test.profdata上。没有骰子,这是有道理的,因为即使llvm-cov也需要运行可执行文件的路径。

  • 使用export功能:运行llvm-cov export --instr-profile=coverage/test.profdata ./test.out时,我会看到一个好看的JSON文件(通过终端)。我尝试将输出放在coverage.json文件中,该文件实际上已上传,但是然后codecov只是说解析它时出错,没有进一步的信息。

我感到完全迷失了。在他们的网站上,一切似乎都是黑盒子,我只是不明白如何完成任何事情并不是完全符合他们可以管理的案例。

如何使用codecov进行此操作?如果codecov无法处理我的报告,我是否可以使用其他等效的在线代码覆盖率来实现此目的?

2 个答案:

答案 0 :(得分:2)

看起来bash脚本codecov用于将覆盖数据上传到他们的网站,查找与其理解的格式相关的各种模式的文件。这些文档记录很少,但通过查看the script on Github,您至少可以看到哪些模式是可行的。当然,这并没有告诉您codecov对匹配给定模式的文件格式的期望,正如您在coverage.json文件被拒绝时发现的那样。

通过反复试验我发现以下内容产生了一个文件,当运行bash脚本时,codecov将正确解释:

llvm-cov show ./test.out -instr-profile=default.profdata > coverage.txt

我还没有广泛测试允许使用哪些文件名,但似乎您可以在coverage.txt之间添加您想要的任何其他字符。 39;重新覆盖覆盖数据(例如,你可以称之为coverage_my_file_name.txt)。

答案 1 :(得分:0)

另一种选择是使用GCOV分析,它的精确度比基于源的精确度低一些,但受codecov.io支持。您需要“ --coverage”编译器标志才能启用它。

您可以使用grcov(也可以从https://github.com/mozilla/grcov/releases下载)来解析gcno / gcda文件,并通过codecov.io bash上传器上传它们:

grcov OBJ_DIR -s SRC_DIR -t lcov --branch > lcov.info
bash codecov.sh -f "lcov.info"

我计划在grcov中添加对基于源报表的支持,这也将使在codecov上支持格式更加容易。