Mat*_*nti 9 code-coverage llvm-cov codecov
我正在(终于!)为我全新的 C++ 项目设置代码覆盖率监控。由于我需要一些高级 C++20 功能(读取、协程),我将其clang 6用作编译器。
现在,我按照本指南了解如何为您的项目进行基本代码覆盖,一切都像魔术一样工作。如果我做:
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
Run Code Online (Sandbox Code Playgroud)
我在我的终端上收到一份漂亮的彩色报告,告诉我哪些内容被覆盖,哪些未被覆盖。
到现在为止还挺好!我以为我已经接近我想要的东西了,但是当我试图将报告上传到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 无法处理我的报告,是否还有其他等效的在线代码覆盖率可用于使其正常工作?
看起来 codecov 用来将覆盖率数据上传到他们的站点的 bash 脚本会查找与它所理解的格式相关的各种模式匹配的文件。这些文档记录不充分,但您至少可以通过查看Github上的脚本来了解哪些模式是可行的。当然,这并不能告诉您 codecov 对匹配给定模式的文件格式有什么期望,正如您在coverage.json文件被拒绝时所发现的那样。
通过反复试验,我发现以下内容会生成一个文件,当您运行 bash 脚本时,codecov 将正确解释该文件:
llvm-cov show ./test.out -instr-profile=default.profdata > coverage.txt
我没有广泛测试允许使用哪些文件名,但似乎您可以在要将覆盖率数据传送到的文件名之间coverage和.txt名称中放置任何您想要的附加字符(例如,您可以调用它coverage_my_file_name.txt)。
编辑:以防万一这对任何人都有帮助,事实证明,上述的一个重要推论是,避免将任何不是覆盖报告的内容命名为与此模式匹配的内容至关重要。我刚刚处理了一个场景,我有一堆名为coverage_[more_text_here].out 的可执行文件与报告一起上传。事实证明,尝试将汇编代码解析为覆盖率报告可能会导致 codecov 神秘地失败而没有任何有用的错误。
| 归档时间: |
|
| 查看次数: |
978 次 |
| 最近记录: |