1

目标

我想通过 Bazel 处理生成带有测试覆盖率数据的 HTML 报告的整个过程。

成分

为了实现我的目标,我了解以下组件是必要的:

  • lcov .dat 文件 提供有关在运行特定测试用例时程序的哪些部分实际执行(即“覆盖”)的信息。我可以通过运行为我的项目生成所需的 lcov 文件(我的./bazelw query "attr(name, '.*test_main', //...)" | xargs ./bazelw coverage --combined_report=lcov所有测试目标都命名为test_main,这就是我可以coverage在所有这些目标中执行命令并将结果与--combined_report=lcov​​ ;
  • genhtml : 一个可执行文件,可以解析 lcov 文件并从中生成 HTML 测试报告(最终目标);
  • coverage.blz:一个自定义的 bazel 规则,将.dat文件和genrule二进制文件作为输入并吐出最终的 HTML 及其 deps(图像和其他 HTML);

到目前为止我能做的...

为 genhtml 创建一个可执行脚本

我不确定这是否是最好的方法,但是,在这一点上对我来说似乎是合理的:

#!/bin/zsh

TOOLS_ROOT="${HOME}/.devxp/tools"
LCOV_BIN_HOME="${TOOLS_ROOT}/lcov/bin"
LCOV_GIT_REPO="https://github.com/linux-test-project/lcov.git"
GENHTML="${LCOV_BIN_HOME}/genhtml"


function main () {
  if [[ ! -f "${GENHTML}" ]]; then
    _install &> /dev/null
  fi

  "${GENHTML}" "${@}"
}

function _install () {
  mkdir -p "${LCOV_HOME}"
  pushd "${TOOLS_ROOT}" || true
  git clone "${LCOV_GIT_REPO}"
  cd "${LCOV_HOME}" || true
  make install
  popd &> /dev/null || true
}

main "${@}"

创建文件组以访问存储库中的 .dat

遵循 -使用 Bazel 生成覆盖率报告的建议;

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

这存在于我的存储库的根BUILD文件中

开始我的自定义规则

存档coverage_report.bzl

def _coverage_report_impl(ctx):
    dat_lcov_file = ctx.attr.coverage_files

coverage_report = rule(
    implementation = _coverage_report_impl,
    attrs = {
        "coverage_files": attr.label(),
    },
)

在自定义规则实现的上下文中,我有以下问题:

  • 问题 1:我不知道此时 .dat 文件是否已经生成,因为它需要bazel coverage运行。我可以从这里强制 bazel 覆盖吗?
  • 问题 2:我不知道如何genhtml在这里引用我的可执行工具。我的计划是做类似的事情genhtml *.dat -o output
  • 问题 3:我不知道如何指定 的输出文件genhtml作为此规则的输出(如您所见,这是我第一次尝试实现自己的规则);

很感谢任何形式的帮助!

参考资料

4

0 回答 0