使用 Bazel 生成覆盖率报告

Using Bazel to generate coverage report

我正在使用 genhtml 命令从 Bazel 生成的 coverage.dat 文件生成 html 覆盖率报告:

genhtml bazel-testlogs/path/to/TestTarget/coverage.dat --output-directory coverage

使用 genhtml 的问题是我必须提供 coverage.dat 文件的路径(在 bazel-testlogs/.. 中生成)是否可以获取那些 coverage.dat 文件作为另一个规则的输出?

我不想直接调用 genthml 命令,而是让 Bazel 处理所有事情。

我无法找到获取 coverage.dat 文件作为 bazel 规则输出的方法。但是,我能够将所有 .dat 文件的所有位置作为 src 包装到 WORKSPACE 目录中的文件组:

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

然后在包装 genthml 命令的自定义 .bzl 规则中使用该文件组以生成 html 覆盖率报告。所以现在我只需要调用

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

命令生成 coverage.dat 文件,生成 html 报告并将其压缩。因此,bazel 处理一切。

Bazel 增加了对 C++ coverage 的支持(虽然我找不到太多关于它的文档)。

我能够生成一个 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

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

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

  1. 运行ning 覆盖完整的项目模块。 运行 以下命令 ->
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
  1. 然后 运行 从父项目目录中执行命令以获取 html 视图。 Html 报告在我们指定的 output-directory-name 中生成。从那个打开 index.html 查看覆盖率报告。
genhtml -o <output-directory-name> bazel-out/_coverage/_coverage_report.dat

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

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

  1. 运行ning 模块中特定 IT/Test 的覆盖范围。 运行 从 project/sub-project 目录执行命令 ->
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
  1. 然后 运行 从父项目目录中执行命令以获取 html 视图。 Html 报告在我们指定的 output-directory-name 中生成。从那个打开 index.html 查看覆盖率报告。
genhtml -o <output-directory-name> bazel-out/_coverage/_coverage_report.dat