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

如何通过直接运行程序而非编写单元测试获取Bazel覆盖率?

用Bazel配合LLVM获取黑盒测试的覆盖率

当然可以做到,不需要依赖Bazel自带的coverage命令,直接通过编译注入LLVM覆盖率支持,再手动运行黑盒测试来收集数据就行,步骤如下:

1. 给Bazel配置LLVM覆盖率编译/链接标志

你可以全局配置或者针对单个目标设置:

  • 全局配置:在项目根目录的.bazelrc里添加以下内容
    build:coverage-llvm --copt=-fprofile-instr-generate
    build:coverage-llvm --copt=-fcoverage-mapping
    build:coverage-llvm --linkopt=-fprofile-instr-generate
    
  • 单个目标配置:在BUILD文件的cc_binary规则里直接加标志
    cc_binary(
        name = "my_program",
        srcs = ["main.cc"],
        copts = ["-fprofile-instr-generate", "-fcoverage-mapping"],
        linkopts = ["-fprofile-instr-generate"],
    )
    

2. 编译带覆盖率支持的二进制

用刚才的配置编译目标程序:

bazel build --config=coverage-llvm //path/to:my_program

编译好的二进制会在bazel-bin/path/to/my_program路径下。

3. 运行程序并收集覆盖率数据

先设置LLVM环境变量指定输出文件,然后运行程序并完成黑盒测试的交互操作:

export LLVM_PROFILE_FILE="my_program.profraw"
./bazel-bin/path/to/my_program
# 这里执行你的黑盒测试流程,模拟用户输入,操作完成后退出程序

程序退出后,会生成my_program.profraw原始覆盖率数据文件。

4. 转换数据并生成覆盖率报告

用LLVM工具处理原始数据,生成可读的报告:

  • 先把原始数据转换成标准格式:
    llvm-profdata merge -sparse my_program.profraw -o my_program.profdata
    
  • 生成文本报告:
    llvm-cov show ./bazel-bin/path/to/my_program -instr-profile=my_program.profdata
    
  • 或者生成更直观的HTML报告:
    llvm-cov show ./bazel-bin/path/to/my_program -instr-profile=my_program.profdata -format=html -output-dir=coverage_report
    

注意事项

  • 确保你的环境里有LLVM的llvm-profdata和llvm-cov工具,或者Bazel工具链已配置这些工具。
  • 这种方式完全脱离Bazel的单元测试覆盖率流程,完美适配黑盒测试场景的覆盖率收集需求。
  • 如果是其他语言(比如Go、Java),思路类似:调整对应语言的编译覆盖率标志,用语言生态的工具收集和生成报告即可。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.02 06:00:47