使用Bazel生成覆盖率报告

9
我正在使用genhtml命令从由Bazel生成的coverage.dat文件生成HTML覆盖率报告:
genhtml bazel-testlogs/path/to/TestTarget/coverage.dat --output-directory coverage

使用genhtml的问题在于我必须提供到覆盖率数据文件(生成在bazel-testlogs / ..中)的路径。是否可能从另一个规则的输出中获取这些覆盖率数据文件?我希望不必直接调用genhtml命令,而是让Bazel处理一切。

1
嗨,你是否曾经在运行 bazel coverage 时遇到过 ERROR: output '_coverage/_coverage_report.dat' was not created 的错误? - stamaimer
@stamaimer 不记得出现过这个特定的错误,这是一段时间以前的事了... - Zeitgeist
你好,你能记得你用来编译的gcc版本吗? - stamaimer
3个回答

12

我找不到一种方法将coverage.dat文件作为bazel规则的输出。但我成功地将所有.dat文件的位置用srcs包装到了WORKSPACE目录下的一个filegroup中:

filegroup(
    name = "coverage_files",
    srcs = glob(["bazel-out/**/coverage.dat"]),
)

然后,在一个自定义的.bzl规则中使用该文件组,对genthml命令进行封装以生成HTML覆盖报告。现在,我只需要调用

bazel coverage //path/... --instrumentation_filter=/path[/:]

用命令生成 coverage.dat 文件,生成 HTML 报告并压缩。这样,bazel 会处理一切。


你能展示一下如何使用filegroupgenhtml结合生成最终的index.html覆盖率报告吗?你使用了genrule吗?我在工作区根目录的BUILD文件中添加了filegroupgenrule,但似乎没有起作用。 - Pavan Manjunath
@PavanManjunath 找不到所有的代码。我有一个自定义的 .bzl 文件,使用 run_shell 和 cmd 运行 python 的 coverage html 命令,生成 html 文件。不确定这是否有帮助,请让我知道您需要更多信息。 - Zeitgeist
@Zeitgeist 我不明白,你是不能发布代码?还是找不到它?你能否分享一下你是如何生成HTML的呢? - Sam Gammon
@sgammon 正确,我没有访问代码的权限,已经在另一个项目上工作多年了。为了生成HTML文件,我使用WORKSPACE中的http_file()下载了genhtml可执行文件,然后创建了一个自定义的bzl规则,在其中加入了运行该可执行文件的cmd命令。(由于这是很久以前完成的,现在可能有更好的方法来处理这些事情) - Zeitgeist

3
Bazel增加了对C++覆盖率的支持(尽管我找不到太多的文档)。
我能够生成一个合并的coverage.dat文件。
bazel coverage -s \
  --instrument_test_targets \
  --experimental_cc_coverage \
  --combined_report=lcov \
  --coverage_report_generator=@bazel_tools//tools/test/CoverageOutputGenerator/java/com/google/devtools/coverageoutputgenerator:Main \
  //...

覆盖文件将被添加到 bazel-out/_coverage/_coverage_report.dat

你使用的是哪个 Bazel 版本? - pylipp
我测试了0.21.0版本。 - Ryan Burn
就此事而言,你提供的链接已经失效。 - Taekahn

0

对于基于Java的项目,我们可以通过以下方式获取代码覆盖率

要获得完整模块的覆盖范围 ->

  1. 运行完整项目模块的覆盖范围。 运行以下命令 ->
bazel coverage ... --compilation_mode=dbg --subcommands --announce_rc --verbose_failures --jobs=auto  --sandbox_debug --build_runfile_links --combined_report=lcov --coverage_report_generator=@bazel_tools//tools/test/CoverageOutputGenerator/java/com/google/devtools/coverageoutputgenerator:Main

2. 然后从父项目目录运行以下命令以获取HTML视图。 HTML报告将在我们指定的output-directory-name中生成。 从中打开index.html以查看覆盖率报告。
genhtml -o <output-directory-name> bazel-out/_coverage/_coverage_report.dat

bazel-out目录通常在项目父目录中创建(例如,WORKSPACE文件所在的位置)

要获取模块中特定IT/Test的覆盖率 ->

  1. 对于模块中特定的IT/Test运行覆盖率。从项目/子项目目录运行以下命令 ->
bazel coverage <class-name-of-Test-or-IT> --compilation_mode=dbg --subcommands --announce_rc --verbose_failures --jobs=auto  --sandbox_debug --build_runfile_links --combined_report=lcov --coverage_report_generator=@bazel_tools//tools/test/CoverageOutputGenerator/java/com/google/devtools/coverageoutputgenerator:Main

2. 然后从父项目目录运行以下命令以获取HTML视图。 HTML报告将在我们指定的output-directory-name中生成。 从中打开index.html以查看覆盖率报告。
genhtml -o <output-directory-name> bazel-out/_coverage/_coverage_report.dat

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接