如何使用Bazel获得C ++代码覆盖率?

时间:2019-10-14 00:37:05

标签: c++ code-coverage bazel

我有一个C ++项目,并且我想使用bazel coverage来获取其代码覆盖率信息。

但是,运行命令后,我发现coverage.dat中的文件bazel-testlogs不包含任何内容。

那么我在寻找正确的地方吗?还是Bazel有问题?

我正在使用Bazel 1.0.0。

完整示例

WORKSPACE

load("@bazel_tools//tools/build_defs/repo:git.bzl", "git_repository")

git_repository(
    name = "gtest",
    remote = "https://github.com/google/googletest",
    commit = "3306848f697568aacf4bcca330f6bdd5ce671899",
)

lib/a.cc

int f(int x) {
    if (x == 0)
        return x + 1;
    else
        return 1 + x;
}

lib/BUILD

cc_library(
    name = "a",
    srcs = ["a.cc"],
    visibility = ["//test:__pkg__"],
)

test/my_test.cc

#include "gtest/gtest.h"

TEST(FactorialTest, Negative) {
  EXPECT_EQ(1, 1);
}

test/BUILD

cc_test(
    name = "my_test",
    srcs = ["my_test.cc"],
    copts = ["-Iexternal/gtest"],
    deps = ["@gtest//:gtest_main", "//lib:a"],
)

运行bazel coverage //test:my_test后,我看到在bazel-testlogs/test/my_test/coverage.dat处生成了一个文件,但该文件为空(0字节)。

2 个答案:

答案 0 :(得分:1)

当前Bazel覆盖范围<>仅支持Linux。

我使用bazel创建了一个项目,用于导出C ++代码覆盖率(https://github.com/hohaidang/STM32-from-scratch/tree/master/004_SPI_driver_CPP) 打开unit_test文件夹以获取有关BUILD文件的更多详细信息

Bazel版本3.5.0

$ bazel coverage unit_test:ut_gpio --combined_report=lcov

$ genhtml bazel-out/_coverage/_coverage_report.dat -o test_coverage

注意:您应该将所有测试文件和源文件放在同一文件夹中。如果文件夹不同,它将生成无效的.dat文件。我仍然不知道如何解决。

答案 1 :(得分:0)

以这种方式运行bazel coverage

bazel coverage -s \
    --instrument_test_targets \
    --experimental_cc_coverage \
    --combined_report=lcov \
    --coverage_report_generator=@bazel_tools//tools/test/CoverageOutputGenerator/java/com/google/devtools/coverageoutputgenerator:Main \
    //...