You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

求Bazel环境下Closure JS代码覆盖率统计的可用示例

Bazel + Closure JS测试代码覆盖率方案示例

核心配置示例(BUILD文件)

针对closure_js_test场景,以下是符合Bazel封闭构建理念的成熟实现配置:

load("@io_bazel_rules_closure//closure:defs.bzl", "closure_js_library", "closure_js_test")

# 业务代码库
closure_js_library(
    name = "my_library",
    srcs = ["utils.js", "core.js"],
)

# 带覆盖率插桩的测试目标
closure_js_test(
    name = "my_test",
    srcs = ["utils_test.js", "core_test.js"],
    deps = [":my_library"],
    # 开启Closure Compiler原生覆盖率插桩
    compiler_flags = [
        "--instrument_for_coverage",
        "--variable_map_output_file=$(BINDIR)/coverage/variable_map.js",
    ],
    # 指定测试运行时的覆盖率数据输出路径
    args = [
        "--coverage_output_file=$(BINDIR)/coverage/coverage.json",
    ],
    # 声明输出文件,让Bazel追踪构建产物
    outputs = [
        "coverage/variable_map.js",
        "coverage/coverage.json",
    ],
)

# 转换Closure覆盖率数据为Bazel兼容的lcov格式
genrule(
    name = "convert_coverage",
    srcs = [":my_test"],
    outs = ["coverage.lcov"],
    cmd = """
        $(location :convert_coverage.sh) \
            $(BINDIR)/coverage/coverage.json \
            $(BINDIR)/coverage/variable_map.js \
            $@
    """,
    tools = [":convert_coverage.sh"],
)

覆盖率转换脚本(convert_coverage.sh)

将Closure输出的JSON格式覆盖率数据转换成通用的lcov格式:

#!/bin/bash
# 依赖Node.js,可通过Bazel规则引入node工具链
node <<EOF
const fs = require('fs');
const coverageData = JSON.parse(fs.readFileSync('$1', 'utf8'));
const variableMap = JSON.parse(fs.readFileSync('$2', 'utf8'));

let lcovContent = '';
Object.entries(coverageData).forEach(([fileId, stats]) => {
  const filePath = variableMap.files[fileId];
  lcovContent += `SF:${filePath}\n`;
  Object.entries(stats.lineCounts).forEach(([lineNum, hitCount]) => {
    lcovContent += `DA:${lineNum},${hitCount}\n`;
  });
  lcovContent += 'end_of_record\n';
});

fs.writeFileSync('$3', lcovContent);
EOF

执行步骤

  1. 运行测试并生成原始覆盖率数据:
bazel coverage //path/to:my_test
  1. 转换为lcov格式:
bazel run //path/to:convert_coverage
  1. 生成HTML可视化报告(需安装lcov工具):
genhtml bazel-bin/path/to/coverage.lcov -o coverage_report

方案说明

  • 基于Closure Compiler原生的覆盖率插桩能力,而非第三方工具的非正规改造,稳定性和兼容性有保障
  • 所有构建产物和依赖均由Bazel追踪管理,完全符合封闭构建的设计理念,避免外部环境依赖
  • 对比JSCover方案:JSCover需要额外集成到Bazel的测试执行流程中,涉及自定义规则和环境配置,复杂度更高;本方案利用官方支持的能力,实现更简洁

内容的提问来源于stack exchange,提问作者BCS

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.26 18:32:54