目标
我想通过 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
作为此规则的输出(如您所见,这是我第一次尝试实现自己的规则);
很感谢任何形式的帮助!
参考资料