跳到主要内容

CMake 配置 GTest 单元测试

使用 Google Test(GTest) 时,需要先获取 GTest 并链接到你的测试可执行文件,再通过 add_test() 把该可执行文件注册为 CTest 测试。

方式一:find_package(系统已安装 GTest)

若系统或工具链已安装 GTest 并提供 CMake 配置:

find_package(GTest REQUIRED)

add_executable(mytest test_main.cpp)
target_link_libraries(mytest PRIVATE GTest::gtest GTest::gtest_main)
# 使用 gtest_main 时无需手写 main(),否则链接 GTest::gtest 并自写 main 调用 RUN_ALL_TESTS()

enable_testing()
add_test(NAME MyTest COMMAND mytest)

方式二:FetchContent(从源码拉取)

无系统包时可用 FetchContent 在配置时拉取 Google Test 源码并构建:

include(FetchContent)
FetchContent_Declare(
googletest
GIT_REPOSITORY https://github.com/google/googletest.git
GIT_TAG v1.14.0
)
set(gtest_force_shared_crt ON CACHE BOOL "" FORCE)
FetchContent_MakeAvailable(googletest)

add_executable(mytest test_main.cpp)
target_link_libraries(mytest PRIVATE GTest::gtest GTest::gtest_main)

enable_testing()
add_test(NAME MyTest COMMAND mytest)

这样 GTest 会作为当前项目的一部分被构建,无需预先安装。

编写测试代码

test_main.cpp 示例(使用 gtest_main,无需自己写 main):

#include <gtest/gtest.h>

TEST(Sample, Basic) {
EXPECT_EQ(1 + 1, 2);
}

若链接的是 GTest::gtest(未链接 gtest_main),需自己写 main:

#include <gtest/gtest.h>
int main(int argc, char **argv) {
::testing::InitGoogleTest(&argc, argv);
return RUN_ALL_TESTS();
}

运行

在构建目录执行:

ctest
# 或直接运行可执行文件
./mytest

小结

  • 系统有 GTest 时用 find_package(GTest)target_link_libraries(测试目标 PRIVATE GTest::gtest GTest::gtest_main)
  • 无系统包时用 FetchContent 拉取 googletest 再 FetchContent_MakeAvailable,同样链接 GTest::gtest / GTest::gtest_main
  • add_test(NAME ... COMMAND 测试可执行文件) 将用例纳入 CTest,便于 ctest 统一运行。
阿基米东
📝 作者:阿基米东

GetIoT.tech 创始人,独立开发者,Linux 重度用户,开源软件作者,创业者,INTJ