Bazel生成coverage.dat后genHTML提示无有效记录求助
我执行./bazel coverage --combined_report=lcov //src/teams/test/...成功生成了coverage.dat文件,但用genHTML生成HTML报告时一直报错:genhtml: ERROR: no valid records found in tracefile _coverage_report.dat。试过直接指定文件路径和官方文档里的genhtml --output genhtml "$(bazel info output_path)/_coverage/_coverage_report.dat"命令,都不行。我是新手,想问是不是漏了什么步骤或者配置?
附Bazel执行输出:
Command> ./bazel coverage --combined_report=lcov //src/teams/test/... INFO: Invocation ID: 48b15c3a-43bb-435c-97d5-e608703cc53a INFO: Using default value for --instrumentation_filter: "^//src/teams/test/keys[/:],^//src/teams/test/server[/:],^//src/teams/test/store/postgres[/:],^//src/teams/test/tools/keyrotate[/:],^//src/teams/test/vault[/:]". INFO: Override the above default with --instrumentation_filter INFO: Build option --instrumentation_filter has changed, discarding analysis cache. DEBUG: Rule 'distroless' indicated that a canonical reproducible form can be obtained by modifying arguments shallow_since = "1564086429 -0400" DEBUG: Repository distroless instantiated at: /Users/userme/code/company/git-team/product/WORKSPACE:32:20: in <toplevel> /private/var/tmp/_bazel_userme/e6e1d0cbd051dd43ed59dca5541f019d/external/product/wkspc/phase0.bzl:62:23: in static_repositories Repository rule git_repository defined at: /private/var/tmp/_bazel_userme/e6e1d0cbd051dd43ed59dca5541f019d/external/bazel_tools/tools/build_defs/repo/git.bzl:199:33: in <toplevel> INFO: Analyzed 33 targets (68 packages loaded, 21664 targets configured). INFO: Found 28 targets and 5 test targets... INFO: LCOV coverage report is located at /private/var/tmp/_bazel_userme/e6e1d0cbd051dd43ed59dca5541f019d/execroot/product/bazel-out/_coverage/_coverage_report.dat and execpath is bazel-out/_coverage/_coverage_report.dat INFO: From Coverage report generation: Dec 09, 2022 11:36:27 AM com.google.devtools.coverageoutputgenerator.Main getTracefiles INFO: Found 5 tracefiles. Dec 09, 2022 11:36:27 AM com.google.devtools.coverageoutputgenerator.Main parseFilesSequentially INFO: Parsing file bazel-out/darwin-fastbuild/testlogs/src/teams/test/vault/vault_test/coverage.dat Dec 09, 2022 11:36:27 AM com.google.devtools.coverageoutputgenerator.Main parseFilesSequentially INFO: Parsing file bazel-out/darwin-fastbuild/testlogs/src/teams/test/server/server_test/coverage.dat Dec 09, 2022 11:36:27 AM com.google.devtools.coverageoutputgenerator.Main parseFilesSequentially INFO: Parsing file bazel-out/darwin-fastbuild/testlogs/src/teams/test/store/postgres/postgres_test/coverage.dat Dec 09, 2022 11:36:27 AM com.google.devtools.coverageoutputgenerator.Main parseFilesSequentially INFO: Parsing file bazel-out/darwin-fastbuild/testlogs/src/teams/test/keys/keys_test/coverage.dat Dec 09, 2022 11:36:28 AM com.google.devtools.coverageoutputgenerator.Main parseFilesSequentially INFO: Parsing file bazel-out/darwin-fastbuild/testlogs/src/teams/test/tools/keyrotate/keyrotate_test/coverage.dat Dec 09, 2022 11:36:28 AM com.google.devtools.coverageoutputgenerator.Main getGcovInfoFiles INFO: No gcov info file found. Dec 09, 2022 11:36:28 AM com.google.devtools.coverageoutputgenerator.Main getGcovJsonInfoFiles INFO: No gcov json file found. Dec 09, 2022 11:36:28 AM com.google.devtools.coverageoutputgenerator.Main getProfdataFileOrNull INFO: No .profdata file found. Dec 09, 2022 11:36:28 AM com.google.devtools.coverageoutputgenerator.Main runWithArgs WARNING: There was no coverage found. INFO: Elapsed time: 65.521s, Critical Path: 52.28s INFO: 247 processes: 25 disk cache hit, 75 internal, 146 darwin-sandbox, 1 worker. INFO: Build completed successfully, 247 total actions //src/teams/test/keys:keys_test PASSED in 3.1s /private/var/tmp/_bazel_userme/e6e1d0cbd051dd43ed59dca5541f019d/execroot/product/bazel-out/darwin-fastbuild/testlogs/src/teams/test/keys/keys_test/coverage.dat //src/teams/test/server:server_test PASSED in 1.1s /private/var/tmp/_bazel_userme/e6e1d0cbd051dd43ed59dca5541f019d/execroot/product/bazel-out/darwin-fastbuild/testlogs/src/teams/test/server/server_test/coverage.dat //src/teams/test/store/postgres:postgres_test PASSED in 3.8s /private/var/tmp/_bazel_userme/e6e1d0cbd051dd43ed59dca5541f019d/execroot/product/bazel-out/darwin-fastbuild/testlogs/src/teams/test/store/postgres/postgres_test/coverage.dat //src/teams/test/tools/keyrotate:keyrotate_test PASSED in 1.3s /private/var/tmp/_bazel_userme/e6e1d0cbd051dd43ed59dca5541f019d/execroot/product/bazel-out/darwin-fastbuild/testlogs/src/teams/test/tools/keyrotate/keyrotate_test/coverage.dat //src/teams/test/vault:vault_test PASSED in 2.3s /private/var/tmp/_bazel_userme/e6e1d0cbd051dd43ed59dca5541f019d/execroot/product/bazel-out/darwin-fastbuild/testlogs/src/teams/test/vault/vault_test/coverage.dat Executed 5 out of 5 tests: 5 tests pass. INFO: Build completed successfully, 247 total actions
genHTML执行输出:
genhtml /private/var/tmp/_bazel_userme/e6e1d0cbd051dd43ed59dca5541f019d/execroot/product/bazel-out/_coverage/_coverage_report.dat Reading data file _coverage_report.dat genhtml: ERROR: no valid records found in tracefile _coverage_report.dat
从Bazel输出里的WARNING: There was no coverage found能看出问题根源——生成的合并报告里没有任何有效覆盖率记录,所以genhtml报错。具体原因和解决步骤如下:
1. 修正 instrumentation_filter 配置
Bazel默认的instrumentation_filter只包含了测试代码路径,但测试代码本身的覆盖率没有实际意义,你需要把被测试的业务代码路径加入过滤规则。比如你的业务代码在//src/teams/keys/...、//src/teams/server/...等路径,执行coverage命令时手动指定:
./bazel coverage --combined_report=lcov --instrumentation_filter="^//src/teams/keys[/:],^//src/teams/server[/:],^//src/teams/store/postgres[/:],^//src/teams/tools/keyrotate[/:],^//src/teams/vault[/:]" //src/teams/test/...
这样Bazel才会对业务代码做插桩,收集真实的覆盖率数据。
2. 验证单个测试的coverage.dat文件
先查看单个测试生成的coverage.dat(比如bazel-out/darwin-fastbuild/testlogs/src/teams/test/keys/keys_test/coverage.dat)是否有有效内容:
- 如果单个文件也为空,说明测试没有正确覆盖业务代码,或者插桩未生效;
- 如果单个文件有内容,但合并后的报告为空,可尝试手动合并单个文件:
cat bazel-out/darwin-fastbuild/testlogs/src/teams/test/*/*/coverage.dat > combined_coverage.dat genhtml combined_coverage.dat --output genhtml
3. 检查版本兼容性
确保使用的Bazel版本和genhtml版本兼容,若Bazel版本较新,可尝试更新genhtml到最新版本,避免因LCOV格式差异导致解析失败。
4. 确认测试逻辑有效性
检查测试用例是否真正调用了业务代码的核心逻辑,若测试仅做空跑或mock了所有依赖,自然不会产生覆盖率数据。
内容的提问来源于stack exchange,提问作者AhmFM

