Catch2适合新手快速上手,单头文件、无需链接、自动提供main;GoogleTest适合中大型项目,支持Mock、参数化测试等工程特性,但需配置CMake和链接库。

Catch2 和 Google Test 是 CLion 中最常用、开箱即用支持最好的两个 C++ 测试框架。直接用它们创建测试类,比手动写 main() + 断言快得多,也更利于后续调试和批量运行。
用 Catch2 创建测试类(推荐新手)
Catch2 不需要单独的 fixture 类定义,而是靠 TEST_CASE + SECTION 组织逻辑,本质就是“测试类”的轻量替代。它对初学者更友好,因为:
-
#define CATCH_CONFIG_MAIN只需在**一个 .cpp 文件**里写一次,自动提供入口,不用自己写main() - 标签(如
[vector])可直接用于过滤运行,CLion 的测试面板能识别并分组显示 - 失败时的错误信息带表达式展开(比如
54 == 42),调试效率高 - 不需要链接库或修改
CMakeLists.txt—— 只要下载catch_amalgamated.hpp放进项目目录即可
实操建议:
- 新建
test_main.cpp,第一行写#define CATCH_CONFIG_MAIN,第二行#include "catch_amalgamated.hpp" - 在同目录放好
catch_amalgamated.hpp(从 Catch2 官方 release 页面 下载) - 每个
TEST_CASE("xxx", "[tag]")就是一个独立测试单元;用SECTION拆分子场景,共享初始化代码 - CLion 会自动识别
TEST_CASE,侧边栏出现绿色三角图标,点它就能单独运行该测试
用 Google Test 创建测试类(适合已有工程)
Google Test 要求显式定义测试类(继承 testing::Test),更适合需要共享 SetUp()/TearDown() 状态的场景。但它依赖外部库,CMakeLists.txt 配置稍重。
立即学习“C++免费学习笔记(深入)”;
- 必须先让 CMake 找到 gtest:用
find_package(GTest REQUIRED)或add_subdirectory(googletest) - 测试类名必须以
Test结尾(如StringTest),否则gtest的宏注册机制可能失效 - 类内写
TEST_F(StringTest, EmptyStringReturnsZero),其中StringTest必须与类名完全一致 - CLion 仅在目标被正确声明为
add_executable(my_test ...)且链接了gtest_main时,才激活测试运行按钮
常见错误现象:
- 运行按钮灰色 → 检查
CMakeLists.txt是否漏掉target_link_libraries(my_test gtest_main) - 报错
undefined reference to main→ 忘了链接gtest_main,只链了gtest - 测试不显示在测试面板 → 测试函数名含空格或特殊字符,或未用
TEST_F正确绑定 fixture 类
CLion 中运行单个测试的快捷方式
别总去菜单里找「Run」——效率低还容易配错配置。
- 把光标放在
TEST_CASE或TEST_F行任意位置,按⌃⇧R(macOS)或Ctrl+Shift+R(Windows/Linux),直接运行该测试 - 在测试函数内部右键 → 选「Run …」,CLion 自动推导出最小作用域,不会误跑整个可执行文件
- 想临时禁用某个测试?在名字前加
DISABLED_(Google Test)或用SUBCASE替代SECTION并注释掉(Catch2) - 注意:CLion 的测试结果视图默认折叠断言详情,点击「Show full output」才能看到
REQUIRE展开的实际值
真正容易被忽略的是测试文件和源码文件的编译作用域问题:CLion 默认只把 add_executable 列表里的文件编译进测试可执行体。如果你把待测函数写在 utils.cpp 却没把它加进 add_executable(my_test ...) 的参数里,链接阶段就会报 undefined reference —— 这和语法无关,纯属 CMake 配置疏漏。


















