Bazel和GTest的C++项目

Pic*_*ent 12 c++ googletest bazel

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

什么是最小化设置?

(我的计算机上只安装了Bazel,而且我在Linux下运行)

Pic*_*ent 20

项目结构是:

.
??? bin
?   ??? BUILD
?   ??? hello.cpp
??? MyLib
?   ??? BUILD
?   ??? message.hpp
?   ??? message.cpp
?   ??? ... 
??? test
?   ??? BUILD
?   ??? message_test.cpp
?   ??? ... 
??? gmock.BUILD
??? WORKSPACE
Run Code Online (Sandbox Code Playgroud)

与Bazel + GTest相关的文件

  • 工作区

你从github下载gtest:

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

您定义下面定义的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"],
  )
Run Code Online (Sandbox Code Playgroud)
  • 测试/ BUILD

此构建文件生成测试:

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

测试/ message_test.cpp文件被定义为:

#include "gtest/gtest.h"

#include "MyLib/message.hpp"

TEST(message_test,content)
{
  EXPECT_EQ(get_message(),"Hello World!");
}
Run Code Online (Sandbox Code Playgroud)

这就是全部!其他文件通常定义如下:

支持示例的文件

  • MyLib中/ BUILD

创建libMyLib.solibMyLib.a库.

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

使用基本的message.hpp

#include <string>

std::string get_message();
Run Code Online (Sandbox Code Playgroud)

message.cpp

#include "MyLib/message.hpp"

std::string get_message()
{
   return "Hello World!";
}
Run Code Online (Sandbox Code Playgroud)

例.

  • 斌/ BUILD

创建hello可执行文件.

cc_binary(
    name = "hello",
    srcs = ["hello.cpp"],
    deps = ["//MyLib:MyLib"],
)
Run Code Online (Sandbox Code Playgroud)

这是:

#include "MyLib/message.hpp"

#include <iostream>

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

  return EXIT_SUCCESS;
}
Run Code Online (Sandbox Code Playgroud)

用法:

  • 编译所有目标:

这也将从其github repo下载gtest并进行编译

bazel build ...
Run Code Online (Sandbox Code Playgroud)
  • 检查hello目标:

你可以运行它:

bazel run bin:hello
Run Code Online (Sandbox Code Playgroud)
  • 使用GTest运行测试

这是本说明的要点:

bazel test ... --test_output=errors
Run Code Online (Sandbox Code Playgroud)

你应该得到类似的东西:

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.
Run Code Online (Sandbox Code Playgroud)

重现结果

为了方便起见,我创建了一个包含这个例子的github repo.我希望它开箱即用.

  • googletest存储库包含bazel构建文件https://github.com/google/googletest/blob/master/BUILD.bazel我可以以某种方式将其提供给Bazel,而无需将文件明确复制到我的项目中吗? (2认同)

Phi*_*hil 10

既然googletest提供了BUILD文件,这将变得更加容易:

在工作空间中

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

在建立

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