如何通过直接运行程序而非编写单元测试获取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
相关产品推荐
相关产品推荐

