
GoogleTest 使用 Bazel 构建入门从 MODULE.bazel 配置到 cc_test 测试运行完整指南【免费下载链接】googletestGoogleTest - Google Testing and Mocking Framework项目地址: https://gitcode.com/GitHub_Trending/go/googletest本文基于 GoogleTest 官方快速上手文档 quickstart-bazel.md 展开讲解如何在 Bazel 工作区中通过 BCR 模块声明引入 GoogleTest、编写第一个cc_test测试目标并成功运行它。读完后你将掌握Bazel 7.0 的MODULE.bazel依赖声明方式、googletest//:gtest与googletest//:gtest_main两个核心目标的链接关系、C17 标准参数在 Clang/GCC 与 MSVC 下的差异写法以及如何解读bazel test的输出结果。前提条件按照官方文档完成本教程需要准备一个兼容的操作系统Linux、macOS、Windows 等至少支持C17的 C 编译器Bazel 7.0 或更高版本——这是 GoogleTest 团队推荐的构建系统。关于 GoogleTest 完整支持的平台与语言标准可参阅仓库内的 支持平台文档。教程中的终端命令以 Unix shell 提示符展示但在 Windows 命令行中同样适用。创建 Bazel 工作区Bazel 工作区是一个用于管理待构建软件源文件的目录。每个工作区根目录下都应有一个MODULE.bazel文件——它可以是空的也可以包含构建产物所需的对外部依赖的声明。第一步创建工作区目录$ mkdir my_workspace cd my_workspace接下来创建MODULE.bazel文件来声明依赖。从 Bazel 7.0 开始推荐通过 Bazel Central RegistryBCR引入 GoogleTest。在 Bazel 工作区根目录创建MODULE.bazel内容如下# MODULE.bazel # 选择 BCR 上当前可用的最新版本 bazel_dep(name googletest, version 1.18.0)这里选择1.18.0是有仓库内部依据的GoogleTest 自身的根 CMakeLists.txt 中定义了set(GOOGLETEST_VERSION 1.18.0)且其 MODULE.bazel 中以module(name googletest, version head, compatibility_level 1)声明了 BCR 模块身份。也就是说BCR 上发布的 GoogleTest 模块与仓库自身的 CMake/源码版本保持一致直接消费发布版本即可获得与仓库源码等效的构建定义。创建测试文件与 BUILD 规则工作区就绪后即可在项目中开始使用 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 提供了一整套断言宏Assertions用于测试代码行为。上述示例包含了 GoogleTest 的主头文件并演示了两个基础断言EXPECT_STRNE验证两个字符串不相等EXPECT_EQ验证7 * 6与42相等。接着在同目录创建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。深入理解两个关键依赖目标从 GoogleTest 仓库根目录的 BUILD.bazel 可以看到这两个目标的具体定义这也解释了 Bazel 构建为何能做到零源码拷贝:gtestBUILD.bazel#L102-L183这是一个cc_library其srcs通过 glob 收集了googletest/src/*.cc、googletest/src/*.h与googlemock/src/*.cc等全部实现文件排除各-all.cc与_main.cc以避免重复编译。值得注意的是该库默认同时包含 Google Test 和 Google Mock 两部分源码因此依赖googletest//:gtest后你既可以使用TEST、EXPECT_*断言也可以直接使用gmock/gmock.h中的 Mock 能力。它还针对平台做了精细适配例如非 Windows 平台统一追加-pthread编译选项与链接选项Windows 平台则启用windows_export_all_symbolsfeature。:gtest_mainBUILD.bazel#L195-L204源码只有一个文件 googlemock/src/gmock_main.cc并设置了alwayslink True以保证main()函数不被链接器裁剪。再看 gmock_main.cc#L64-L72 的实现main()会先打印Running main() from gmock_main.cc然后调用testing::InitGoogleMock(argc, argv)该函数同时负责初始化 Google Test无需再单独调用InitGoogleTest()最后执行RUN_ALL_TESTS()并返回其结果——这正是后文bazel test输出中那行Running main() from gmock_main.cc的由来。此外仓库中还提供了gtest_for_librarytestonly 的:gtest别名BUILD.bazel#L185-L190如果你的被测代码是被 testonly 的库依赖用它替换:gtest可以绕过 Bazel 的 testonly 依赖检查。构建并运行测试现在可以构建并运行测试了$ bazel test --cxxopt-stdc17 --test_outputall //:hello_test说明--cxxopt-stdc17用于显式保证 GoogleTest 以 C17 标准编译而非编译器默认标准。上面的写法适用于 Clang/GCC若使用 MSVC等价参数为--cxxopt/std:c17。更多语言标准支持情况见 支持平台文档。完整的运行输出如下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输出中几个关键信息的对应关系Running main() from gmock_main.cc来自:gtest_main依赖的main()实现gmock_main.cc#L66[ RUN ]/[ OK ]/[ PASSED ] 1 test.GoogleTest 运行器对HelloTest.BasicAssertions单个用例的执行与汇总报告bazel-bin/hello_testBazel 生成的测试可执行文件路径可直接手动运行以调试linux-sandboxbazel test默认在沙箱中执行测试保证隔离性。如果你只想查看构建/测试日志而不重新执行可将bazel test替换为bazel build若需要列出某个包下的全部测试目标可使用bazel query kind(cc_test, //...)辅助排查目标名。验证依据与延伸阅读本文涉及的构建定义均可在当前仓库中直接查证根 BUILD.bazel:gtest、:gtest_main、:gtest_for_library三个核心目标的完整定义与平台适配逻辑MODULE.bazelGoogleTest 自身的 BCR 模块声明及其对abseil-cpp、platforms、re2、rules_cc的依赖声明WORKSPACE面向旧式 WORKSPACE 构建体系的等价依赖加载方式googletest_deps()googlemock/src/gmock_main.ccgtest_main提供的main()入口实现。接下来可以继续阅读 Primer系统学习如何编写简单的 GoogleTest 测试测试套件、fixture、断言宏等查看 代码示例了解参数化测试、类型化测试、死亡测试等多种 GoogleTest 特性的用法这些示例对应的源码位于 googletest/samples/ 目录且已由 BUILD.bazel 中的gtest_samples等cc_test目标集成进 Bazel 构建体系可直接运行验证。【免费下载链接】googletestGoogleTest - Google Testing and Mocking Framework项目地址: https://gitcode.com/GitHub_Trending/go/googletest创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考