使用Bazel和GTest的C++项目

22

我想创建一个使用 gtest 进行单元测试的 Bazel C++ 项目。

最小化设置是什么?

(我只安装了 Bazel,并在 Linux 操作系统下运行。)

3个回答

28

现在有了googletest的BUILD文件,这变得更容易了:

WORKSPACE

load("@bazel_tools//tools/build_defs/repo:git.bzl", "git_repository")
git_repository(
    name = "gtest",
    remote = "https://github.com/google/googletest",
    branch = "v1.10.x",
)

正在构建中

cc_test (
    name = "hello_test",
    srcs = [
        "hello_test.cc",
    ],
    deps = [
        "@gtest//:gtest",
        "@gtest//:gtest_main" # Only if hello_test.cc has no main()
    ],
)

1
非常感谢!这允许在父目录中没有 gmock.BUILD 文件。 - Dat

26
项目结构如下:
.
├── bin
│   ├── BUILD
│   ├── hello.cpp
├── MyLib
│   ├── BUILD
│   ├── message.hpp
│   ├── message.cpp
│   ├── ... 
├── test
│   ├── BUILD
│   ├── message_test.cpp
│   ├── ... 
├── gmock.BUILD
└── WORKSPACE

Bazel+GTest相关文件

  • WORKSPACE

你可以从github下载gtest:

new_git_repository(
    name = "googletest",
    build_file = "gmock.BUILD",
    remote = "https://github.com/google/googletest",
    tag = "release-1.8.0",
)

您需要定义一个 gmock BUILD 文件,如下所示:
  • gmock.BUILD
该 BUILD 文件负责编译 gtest/gmock。
cc_library(
      name = "gtest",
      srcs = [
            "googletest/src/gtest-all.cc",
            "googlemock/src/gmock-all.cc",
      ],
      hdrs = glob([
          "**/*.h",
          "googletest/src/*.cc",
          "googlemock/src/*.cc",
      ]),
      includes = [
          "googlemock",
          "googletest",
          "googletest/include",
          "googlemock/include",
      ],
      linkopts = ["-pthread"],
      visibility = ["//visibility:public"],
  )

  cc_library(
      name = "gtest_main",
      srcs = ["googlemock/src/gmock_main.cc"],
      linkopts = ["-pthread"],
      visibility = ["//visibility:public"],
      deps = [":gtest"],
  )
  • test/BUILD

该构建文件用于生成测试:

cc_test(
    name = "MyTest",
    srcs = glob(["**/*.cpp"]),
    deps = ["//MyLib:MyLib",
           "@googletest//:gtest_main"],
)

test/message_test.cpp文件的定义如下:

#include "gtest/gtest.h"

#include "MyLib/message.hpp"

TEST(message_test,content)
{
  EXPECT_EQ(get_message(),"Hello World!");
}

就这些了!其他文件像往常一样定义:

支持示例的文件

  • MyLib/BUILD

创建libMyLib.solibMyLib.a 库。

cc_library(
    name="MyLib",
    hdrs=glob(["**/*.hpp"]),
    srcs=glob(["**/*.cpp"]),
    visibility = ["//visibility:public"],
)

使用基本的 message.hpp

#include <string>

std::string get_message();

message.cpp 相关

#include "MyLib/message.hpp"

std::string get_message()
{
   return "Hello World!";
}

例子。

  • bin/BUILD

创建 hello 可执行文件。

cc_binary(
    name = "hello",
    srcs = ["hello.cpp"],
    deps = ["//MyLib:MyLib"],
)

which is:

#include "MyLib/message.hpp"

#include <iostream>

int main()
{
  std::cout << "\n" << get_message() << std::endl;

  return EXIT_SUCCESS;
}

用法:

  • 编译所有目标:

这也将从其 github 存储库下载 gtest 并对其进行编译。

bazel build ...
  • 检查 hello 目标:

您可以使用以下命令运行它:

bazel run bin:hello
  • 使用GTest运行您的测试

这是本笔记的主要内容:

bazel test ... --test_output=errors

你应该得到类似如下的结果:
INFO: Analysed 3 targets (0 packages loaded).
INFO: Found 2 targets and 1 test target...
INFO: Elapsed time: 0.205s, Critical Path: 0.05s
INFO: Build completed successfully, 2 total actions
//test:MyTest   
PASSED in 0.0s
Executed 1 out of 1 test: 1 test passes.

重现结果

为了方便起见,我创建了一个GitHub仓库来包含这个例子。希望它可以直接使用。


如果您还需要一些测试数据文件,https://dev59.com/DqTja4cB1Zd3GeqPKf2d 描述了如何管理它们。 - Picaud Vincent
3
googletest 存储库包含 bazel 构建文件 https://github.com/google/googletest/blob/master/BUILD.bazel。我是否可以以某种方式将其提供给 Bazel,而无需显式复制该文件到我的项目中? - MAnyKey
@MAnyKey BUILD.bazel 是用于构建 gtest 的。当您在项目中使用 gtest 作为第三方库时,您只需要一个 git_repositorylocal_repository 规则即可。然后 bazel 就知道如何将 gtest 编译为库,因此您不需要显式地复制 BUILD 文件。 - Yixing Liu

0

目前的推荐做法是使用http_archive,以避免依赖于系统中的git并利用存储库缓存

WORKSPACE

# 5376968f6948923e2411081fd9372e71a59d8e77 is the commit sha for v1.12.0. 
# Periodically update to the latest to "live at head"
http_archive(
    name = "com_google_googletest",
    sha256 = "199e68f9dff997b30d420bf23cd9a0d3f66bfee4460e2cd95084a2c45ee00f1a",
    strip_prefix = "googletest-5376968f6948923e2411081fd9372e71a59d8e77",
    urls = ["https://github.com/google/googletest/archive/5376968f6948923e2411081fd9372e71a59d8e77.zip"],
)

test/BUILD

cc_test(
    name = "test_greet",
    srcs = ["greeting_test.cpp"],
    deps = [
        "//src:greeting",
        "@com_google_googletest//:gtest_main",
    ],
)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接