快速入门:使用 Bazel 构建
本教程旨在帮助您使用 Bazel 构建系统快速启动和运行 GoogleTest。如果您是第一次使用 GoogleTest 或需要复习,我们建议您从本教程开始。
先决条件
要完成本教程,您需要
- 兼容的操作系统(例如 Linux、macOS、Windows)。
- 兼容的 C++ 编译器,至少支持 C++17。
- Bazel 7.0 或更高版本,这是 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 构建并运行了测试二进制文件。