我正在(终于!)为我的全新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无法处理我的报告,我是否可以使用其他等效的在线代码覆盖率来实现此目的?
答案 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上支持格式更加容易。