快速入门:使用 Bazel 构建

本教程旨在帮助您使用 Bazel 构建系统快速启动和运行 GoogleTest。如果您是第一次使用 GoogleTest 或需要复习,我们建议您从本教程开始。

先决条件

要完成本教程,您需要

有关与 GoogleTest 兼容的平台的更多信息,请参见支持的平台

如果您尚未安装 Bazel,请参见Bazel 安装指南

{: .callout .note} 注意:本教程中的终端命令显示的是 Unix shell 提示符,但这些命令也可以在 Windows 命令行中使用。

设置 Bazel 工作区

Bazel 工作区是文件系统上的一个目录,您可以使用它来管理要构建的软件的源文件。每个工作区目录都有一个名为 MODULE.bazel 的文本文件,该文件可能为空,或者可能包含对构建输出所需的外部依赖项的引用。

首先,为您的工作区创建一个目录

$ mkdir my_workspace && cd my_workspace

接下来,您将创建 MODULE.bazel 文件以指定依赖项。从 Bazel 7.0 开始,推荐的使用 GoogleTest 的方法是通过 Bazel Central Registry。为此,在您的 Bazel 工作区的根目录中创建一个 MODULE.bazel 文件,内容如下

# MODULE.bazel

# Choose the most recent version available at
# https://registry.bazel.build/modules/googletest
bazel_dep(name = "googletest", version = "1.17.0")

现在您可以构建使用 GoogleTest 的 C++ 代码了。

创建并运行二进制文件

设置好 Bazel 工作区后,您现在可以在自己的项目中使用 GoogleTest 代码。

例如,在您的 my_workspace 目录中创建一个名为 hello_test.cc 的文件,内容如下

#include <gtest/gtest.h>

// Demonstrate some basic assertions.
TEST(HelloTest, BasicAssertions) {
  // Expect two strings not to be equal.
  EXPECT_STRNE("hello", "world");
  // Expect equality.
  EXPECT_EQ(7 * 6, 42);
}

GoogleTest 提供了 断言,您可以使用它们来测试代码的行为。上面的示例包括主要的 GoogleTest 头文件,并演示了一些基本断言。

要构建代码,请在同一目录中创建一个名为 BUILD 的文件,内容如下

cc_test(
    name = "hello_test",
    size = "small",
    srcs = ["hello_test.cc"],
    deps = [
        "@googletest//:gtest",
        "@googletest//:gtest_main",
    ],
)

cc_test 规则声明了您要构建的 C++ 测试二进制文件,并链接到 GoogleTest 库(@googletest//:gtest")和 GoogleTest main() 函数(@googletest//:gtest_main)。有关 Bazel BUILD 文件的更多信息,请参见Bazel C++ 教程

注意:在下面的示例中,我们假设使用 Clang 或 GCC 并设置 --cxxopt=-std=c++17 以确保 GoogleTest 被编译为 C++17 而不是编译器默认设置。对于 MSVC,等效的将是 --cxxopt=/std:c++17。有关支持的语言版本的更多详细信息,请参见支持的平台

现在您可以构建并运行您的测试

$ bazel test --cxxopt=-std=c++17 --test_output=all //:hello_test
INFO: Analyzed target //:hello_test (26 packages loaded, 362 targets configured).
INFO: Found 1 test target...
INFO: From Testing //:hello_test:
==================== Test output for //:hello_test:
Running main() from gmock_main.cc
[==========] Running 1 test from 1 test suite.
[----------] Global test environment set-up.
[----------] 1 test from HelloTest
[ RUN      ] HelloTest.BasicAssertions
[       OK ] HelloTest.BasicAssertions (0 ms)
[----------] 1 test from HelloTest (0 ms total)

[----------] Global test environment tear-down
[==========] 1 test from 1 test suite ran. (0 ms total)
[  PASSED  ] 1 test.
================================================================================
Target //:hello_test up-to-date:
  bazel-bin/hello_test
INFO: Elapsed time: 4.190s, Critical Path: 3.05s
INFO: 27 processes: 8 internal, 19 linux-sandbox.
INFO: Build completed successfully, 27 total actions
//:hello_test                                                     PASSED in 0.1s

INFO: Build completed successfully, 27 total actions

恭喜!您已成功使用 GoogleTest 构建并运行了测试二进制文件。

下一步