引言:什么是 Catch2 和 Google Test,为什么需要它们?
在现代 C++ 软件开发中,测试不是奢侈品,而是必需品。单元测试库允许开发人员自动验证程序的各个组件(函数、类、模块)是否正常工作。为此目的,两个最流行的库是 Catch2 和 Google Test (gtest)。
Catch2 是一个现代、轻量级且非常方便的单元测试库。其主要特点是使用宏,使测试可读性强,类似于普通英语。Catch2 支持行为驱动开发(BDD)风格、自动测试注册,并且不需要复杂的配置。
Google Test (gtest) 是 Google 开发的一个强大且成熟的库,是许多大型项目的事实标准。它提供了丰富的断言宏、创建测试固件(test fixtures)的机制、参数化测试以及与 CMake 构建系统的出色集成。
这两个库解决的是同一个问题:允许编写自动运行并报告结果的测试。两者之间的选择通常取决于个人偏好、项目要求或现有基础设施。在本文中,我们将介绍这两个库,因为它们在概念上非常相似,但在语法和 API 上有所不同。
安装
与 Python(使用 pip)不同,C++ 库的安装通常通过系统包管理器或通过与构建系统(例如 CMake)集成来完成。我们来看两种方式。
安装 Catch2
方法 1:通过 vcpkg(推荐)
# 如果尚未安装 vcpkg,请先安装git clone https://github.com/Microsoft/vcpkg.gitcd vcpkg./bootstrap-vcpkg.sh # 在 Windows 上使用 .\\bootstrap-vcpkg.bat
# 安装 Catch2./vcpkg install catch2
# 与 CMake 集成./vcpkg integrate install方法 2:仅头文件(最简单)
Catch2 可以作为仅头文件库使用。只需从官方仓库下载 catch.hpp 文件,并将其放入项目文件夹中。然后在代码中引入它:
#define CATCH_CONFIG_MAIN // 这一行只能出现在一个 .cpp 文件中#include "catch.hpp"安装 Google Test
方法 1:通过 vcpkg
./vcpkg install gtest./vcpkg integrate install方法 2:通过 CMake FetchContent(推荐用于使用 CMake 的项目)
在你的 CMakeLists.txt 中添加:
include(FetchContent)FetchContent_Declare( googletest GIT_REPOSITORY https://github.com/google/googletest.git GIT_TAG release-1.12.1)FetchContent_MakeAvailable(googletest)
# 现在你可以为你的测试文件使用 target_link_librariesadd_executable(my_tests test.cpp)target_link_libraries(my_tests GTest::gtest_main)快速入门及代码示例
让我们编写一个简单的函数,并用这两个库对其进行测试。该函数将计算一个数的阶乘。
Catch2 示例
#define CATCH_CONFIG_MAIN#include "catch.hpp"
// 待测试的函数unsigned int factorial(unsigned int n) { if (n == 0) return 1; return n * factorial(n - 1);}
// 测试用例TEST_CASE("阶乘计算正确", "[factorial]") { REQUIRE(factorial(0) == 1); REQUIRE(factorial(1) == 1); REQUIRE(factorial(2) == 2); REQUIRE(factorial(3) == 6); REQUIRE(factorial(10) == 3628800);}
// 另一个包含分节的测试用例TEST_CASE("检查边界情况", "[factorial][edge]") { SECTIO