GoogleTest 使用文档

GoogleTest 使用文档

摘要

GoogleTest 是 Google 开发的 C++ 测试框架,提供了丰富的功能和灵活的使用方式。本文档将详细介绍如何安装、使用 GoogleTest,以及如何进行开发和测试。

安装

GitHub 地址

GoogleTest GitHub 地址

GoogleTest 通用构建指南

设置

要构建 GoogleTest 及使用它的测试项目,您需要告诉构建系统 GoogleTest 的头文件和源文件的位置。具体方法取决于您使用的构建系统,但通常比较简单。

使用 CMake 构建

GoogleTest 配备了一个 CMake 构建脚本(CMakeLists.txt),适用于多种平台。如果尚未安装 CMake,可以从 CMake 官网 免费下载。

CMake 通过生成原生 makefile 或构建项目来适应您选择的编译器环境。您可以将 GoogleTest 作为独立项目构建,或者将其整合到现有 CMake 构建的其他项目中。

独立 CMake 项目

构建 GoogleTest 作为独立项目时,典型工作流程如下:

git clone https://github.com/google/googletest.git -b v1.16.0
cd googletest        # 克隆仓库的主目录。
mkdir build          # 创建一个目录来保存构建输出。
cd build
cmake ..             # 为 GoogleTest 生成原生构建脚本。

默认情况下,上述命令还包括 GoogleMock。如果只想构建 GoogleTest,应将最后一条命令替换为:

cmake .. -DBUILD_GMOCK=OFF

在类 Unix 系统上,当前目录下会生成一个 Makefile。只需输入 make 即可构建 GoogleTest。系统管理员还可以通过以下命令安装 GoogleTest:

make
sudo make install    # 默认安装在 /usr/local/

如果您使用 Windows 并安装了 Visual Studio,则会生成一个 gtest.sln 文件和多个 .vcproj 文件。然后可以使用 Visual Studio 构建它们。

在安装了 Xcode 的 Mac OS X 上,会生成一个 .xcodeproj 文件。

整合到现有 CMake 项目中

如果要在已使用 CMake 的项目中使用 GoogleTest,最简单的方法是获取已安装的库和头文件。

可以通过 find_package(或 pkg_check_modules)导入 GoogleTest。例如,如果 find_package(GTest CONFIG REQUIRED) 成功,则可以将库作为 GTest::gtestGTest::gmock 使用。

更健壮和灵活的方法是直接将 GoogleTest 作为项目的一部分构建。这可以通过将 GoogleTest 源代码提供给主构建并使用 CMake 的 add_subdirectory() 命令添加它来实现。这样做的显著优势是 GoogleTest 和项目其余部分使用相同的编译器和链接器设置,从而避免了因使用不兼容库(例如调试/发布版本)而产生的问题。这对于 Windows 特别有用。

使 GoogleTest 源代码可供主构建使用的方法有多种:

  1. 手动下载 GoogleTest 源代码并将其放置在已知位置。这是最不灵活的方法,可能难以与持续集成系统等配合使用。
  2. 将 GoogleTest 源代码作为直接副本嵌入主项目的源树中。这通常是最简单的办法,但也最难保持更新。一些组织可能不允许这种方法。
  3. 将 GoogleTest 添加为 git 子模块或类似项。这可能并不总是可行或合适。例如,git 子模块有其自身的优缺点。
  4. 使用 CMake 在构建的配置步骤中下载 GoogleTest。这种方法没有其他方法的限制。

最后一种方法通过一小段 CMake 代码实现,该代码下载并将 GoogleTest 代码拉入主构建中。

只需在您的 CMakeLists.txt 中添加:

include(FetchContent)
FetchContent_Declare(
  googletest
  # 指定您依赖的提交并定期更新。
  URL https://github.com/google/googletest/archive/5376968f6948923e2411081fd9372e71a59d8e77.zip
)
# 对于 Windows:防止覆盖父项目的编译器/链接器设置
set(gtest_force_shared_crt ON CACHE BOOL "" FORCE)
FetchContent_MakeAvailable(googletest)

# 现在只需根据需要链接到 gtest 或 gtest_main。例如:
add_executable(example example.cpp)
target_link_libraries(example gtest_main)
add_test(NAME example_test COMMAND example)

注意,这种方法需要 CMake 3.14 或更高版本,因为它使用了 FetchContent_MakeAvailable() 命令。

Visual Studio 动态与静态运行库

默认情况下,新的 Visual Studio 项目动态链接 C 运行库,但 GoogleTest 静态链接。这将导致类似以下的错误:gtest.lib(gtest-all.obj) : error LNK2038: 检测到 'RuntimeLibrary' 不匹配:值 'MTd_StaticDebug' 与 main.obj 中的 'MDd_DynamicDebug' 不匹配

GoogleTest 已为此提供了一个 CMake 选项:gtest_force_shared_crt

启用此选项将使 gtest 也动态链接运行库,并与包含它的项目匹配。

C++ 标准版本

要成功构建 GoogleTest,需要支持 C++14 的环境。一种确保此要求的方法是在顶级项目中指定标准,例如通过使用 set(CMAKE_CXX_STANDARD 14) 命令以及 set(CMAKE_CXX_STANDARD_REQUIRED ON)。如果不可行,例如在使用 GoogleTest 进行验证的 C 项目中,则可以通过添加到 cmake 的选项中指定,例如通过 -DCMAKE_CXX_FLAGS 选项。

使用

开发 Google Test 和 Google Mock

本部分讨论如何对 Google Test 项目进行自定义修改。

测试 Google Test 和 Google Mock 本身

为了确保您的修改按预期工作且不会破坏现有功能,您需要编译并运行 Google Test 和 Google Mock 自带的测试。可以使用 CMake 来完成:

  1. 编译和运行所有测试

    mkdir mybuild
    cd mybuild
    cmake -Dgtest_build_tests=ON -Dgmock_build_tests=ON ${GTEST_REPO_DIR}
    
  2. 选择仅编译 Google Test 或 Google Mock 的测试
    根据需要,可以分别配置:

    cmake -Dgtest_build_tests=ON ${GTEST_DIR}  # 配置 Google Test 测试
    cmake -Dgmock_build_tests=ON ${GMOCK_DIR}  # 配置 Google Mock 测试
    
  3. 安装 Python
    确保已安装 Python,因为 Google Test 的部分测试是用 Python 编写的。如果 CMake 报错提示找不到 Python(Could NOT find PythonInterp (missing: PYTHON_EXECUTABLE)),可以显式指定 Python 路径:

    cmake -DPYTHON_EXECUTABLE=path/to/python ...
    
  4. 编译 Google Test 和 Google Mock
    在类 Unix 系统上,通常使用以下命令:

    make
    
  5. 运行测试
    执行以下命令运行测试:

    make test
    

    所有测试应通过。

通过以上步骤,您可以验证您的修改是否正确并确保功能完整性。

调整 GoogleTest

GoogleTest 可用于多种环境。默认配置在某些环境中可能无法正常工作或效果不佳。但是,您可以通过在编译器命令行中定义控制宏来轻松调整 GoogleTest。通常,这些宏的命名格式为 GTEST_XYZ,您将其定义为 1 或 0 以启用或禁用某个功能。

以下是使用最频繁的宏列表。完整的列表,请参见文件 include/gtest/internal/gtest-port.h

多线程测试

如果 pthread 库可用,GoogleTest 是线程安全的。在 #include <gtest/gtest.h> 之后,您可以检查 GTEST_IS_THREADSAFE 宏以查看是否是这种情况(如果该宏定义为 1,则为是;如果未定义,则为否)。

如果 GoogleTest 未正确检测到您的环境中是否可用 pthread,您可以强制设置:

-DGTEST_HAS_PTHREAD=1

-DGTEST_HAS_PTHREAD=0

当 GoogleTest 使用 pthread 时,您可能需要向编译器和/或链接器添加标志以选择 pthread 库,否则将出现链接错误。如果您使用 CMake 脚本,这会为您处理。如果您使用自己的构建脚本,则需要阅读编译器和链接器的手册以确定要添加的标志。

作为共享库(DLL)

GoogleTest 很紧凑,因此大多数用户可以将其构建并链接为静态库以简化操作。如果您愿意,也可以选择将 GoogleTest 用作共享库(在 Windows 上称为 DLL)。

要将 gtest 编译为共享库,请添加:

-DGTEST_CREATE_SHARED_LIBRARY=1

到编译器标志中。您还需要告诉链接器生成共享库 - 请参阅链接器的手册以了解如何操作。

要编译使用 gtest 共享库的测试,请添加:

-DGTEST_LINKED_AS_SHARED_LIBRARY=1

到编译器标志中。

注意:虽然在使用某些编译器(例如 GCC)时,上述步骤今天并非技术上必需,但如果我们决定提高加载库的速度(有关详细信息,请参阅 GCC Wiki - Visibility),它们可能在未来变得必要。因此,建议在将 GoogleTest 用作共享库时始终添加上述标志。否则,GoogleTest 的未来版本可能会破坏您的构建脚本。

避免宏名冲突

在 C++ 中,宏不遵守命名空间。因此,如果两个库都定义了同名的宏,则会发生冲突。如果 GoogleTest 宏与其他库冲突,您可以强制 GoogleTest 重命名其宏以避免冲突。

具体来说,如果 GoogleTest 和其他代码都定义了宏 FOO,您可以添加:

-DGTEST_DONT_DEFINE_FOO=1

到编译器标志中,以告知 GoogleTest 将宏的名称从 FOO 更改为 GTEST_FOO。目前,FOO 可以是 ASSERT_EQ、ASSERT_FALSE、ASSERT_GE、ASSERT_GT、ASSERT_LE、ASSERT_LT、ASSERT_NE、ASSERT_TRUE、EXPECT_FALSE、EXPECT_TRUE、FAIL、SUCCEED、TEST 或 TEST_F。例如,使用 -DGTEST_DONT_DEFINE_TEST=1,您需要编写:

GTEST_TEST(SomeTest, DoesThis) { ... }

而不是:

TEST(SomeTest, DoesThis) { ... }

以定义测试。

结论

GoogleTest 是一个功能强大的 C++ 测试框架,通过本文档的指导,您应该能够顺利地安装、使用和开发 GoogleTest 项目。希望本文档能帮助您高效地进行测试开发。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值