在 macOS 上使用 CLion 进行 Google Test 单元测试
介绍
Google Test(GTest)是 Google 开源的 C++ 单元测试框架,它提供了简单易用的断言、测试夹具(Fixtures)和测试运行机制,使 C++ 开发者能够编写高效的单元测试。
本博客将介绍如何在 macOS 上使用 CLion 配置 Google Test 进行 C++ 单元测试,包括安装 Google Test、配置 CMakeLists.txt、编写和运行测试代码,以及如何测试类和使用测试夹具。
1. 安装 Google Test
Google Test 在 macOS 上可以使用 Homebrew 安装:
brew install googletest
安装完成后,库文件通常会存放在 /usr/local/Cellar/googletest/ 目录下(具体路径可通过 brew info googletest 查看)。
2. 创建 CLion 项目
- 打开 CLion,选择
New Project。 - 选择
C++ Executable,然后点击Create创建一个项目。
3. 配置 CMakeLists.txt
方式 1:使用 Homebrew 安装的 Google Test
如果通过 brew install googletest 安装了 Google Test,可以这样配置 CMakeLists.txt:

cmake_minimum_required(VERSION 3.30)
project(MyGoogleTestProject)set(CMAKE_CXX_STANDARD 20)# 查找 Google Test
find_package(GTest REQUIRED)
include_directories(${GTEST_INCLUDE_DIRS})# 添加测试文件
add_executable(MyGoogleTestProject main.cpp)# 链接 Google Test 库
target_link_libraries(MyGoogleTestProject GTest::GTest GTest::Main pthread)# 启用测试
enable_testing()
add_test(NAME MyGoogleTestProject COMMAND MyGoogleTestProject)
方式 2:使用 Git 方式引入 Google Test
如果希望将 Google Test 作为项目的一部分,可以在 CMakeLists.txt 中手动拉取 Google Test:
cmake_minimum_required(VERSION 3.10)
project(MyGoogleTestProject)set(CMAKE_CXX_STANDARD 17)# 下载 Google Test(如果未安装)
include(FetchContent)
FetchContent_Declare(googletestURL https://github.com/google/googletest/archive/refs/heads/main.zip
)
FetchContent_MakeAvailable(googletest)# 添加测试源码文件
add_executable(my_test test.cpp)# 链接 Google Test
target_link_libraries(my_test gtest gtest_main)# 启用测试
enable_testing()
4. 编写测试代码
在项目根目录下创建 main.cpp 文件,并编写测试代码,例如:

#include <gtest/gtest.h>// 测试函数
int Add(int nA, int nB) {return nA + nB;
}// 测试用例
TEST(AddTest, HandlesPositiveNumbers) {EXPECT_EQ(Add(2, 3), 5);
}TEST(AddTest, HandlesNegativeNumbers) {EXPECT_EQ(Add(-2, -3), -5);
}// 主函数
int main(int argc, char **argv) {::testing::InitGoogleTest(&argc, argv);return RUN_ALL_TESTS();
}
如果需要测试类的成员函数如下:
- 创建 Calculator 类,该类提供加法和减法功能。
- 编写 Google Test 测试。
Calculator 类的头文件:
#ifndef CALCULATOR_H
#define CALCULATOR_Hclass Calculator {
public:int Add(int nA, int nB);int Subtract(int nA, int nB);
};#endif // CALCULATOR_H
Calculator 类的源文件:
#include "Calculator.h"int Calculator::Add(int nA, int nB) {return nA + nB;
}int Calculator::Subtract(int nA, int nB) {return nA - nB;
}
为 Calculator 编写测试,创建 calculator_test.cpp 文件:
#include <gtest/gtest.h>
#include "Calculator.h"// 测试 Add 方法
TEST(CalculatorTest, HandlesAddition) {Calculator calculator;EXPECT_EQ(calculator.Add(3, 4), 7);EXPECT_EQ(calculator.Add(-2, -5), -7);EXPECT_EQ(calculator.Add(10, -5), 5);
}// 测试 Subtract 方法
TEST(CalculatorTest, HandlesSubtraction) {Calculator calculator;EXPECT_EQ(calculator.Subtract(10, 3), 7);EXPECT_EQ(calculator.Subtract(5, 8), -3);EXPECT_EQ(calculator.Subtract(-5, -10), 5);
}
测试类的成员函数的结果:

5. 运行 Google Test
方法 1:手动运行
在 CLion 终端中执行:
cmake --build .
./MyGoogleTestProject
你应该会看到 Google Test 的输出结果。
方法 2:CLion 直接运行
-
在 CLion 运行

-
使用 Google Test 配置
- 点击 CLion 顶部菜单 “Run” > “Edit Configurations…”
- 点击 “+” 号,选择 Google Test
- 选择
Target,然后应用并运行
-
查看测试结果
在 CLion 底部的 “Test Runner” 窗口,你可以看到测试是否通过。

6. 添加更多测试
如果你有多个测试文件,比如 math_test.cpp 和 string_test.cpp,可以这样修改 CMakeLists.txt:
add_executable(math_test math_test.cpp)
add_executable(string_test string_test.cpp)target_link_libraries(math_test GTest::GTest GTest::Main)
target_link_libraries(string_test GTest::GTest GTest::Main)add_test(NAME MathTest COMMAND math_test)
add_test(NAME StringTest COMMAND string_test)
然后在终端运行:
ctest
这样可以一次性运行所有测试。
7. 处理 Google Test 断言
Google Test 断言分为 ASSERT_ 和 EXPECT_:
EXPECT_EQ(a, b): 继续运行,报告错误ASSERT_EQ(a, b): 立即终止当前测试
例如:
TEST(SampleTest, Example) {ASSERT_EQ(1, 1); // 通过EXPECT_EQ(1, 2); // 失败,但继续执行ASSERT_EQ(1, 2); // 失败,测试终止
}
8. 使用 Google Test Fixtures
Google Test 提供 Fixture(测试夹具),用于在多个测试用例间共享资源:
class MyTestFixture : public ::testing::Test {
protected:void SetUp() override { nValue = 5; } // 每个测试前执行void TearDown() override { } // 每个测试后执行int nValue;
};TEST_F(MyTestFixture, TestAddition) {EXPECT_EQ(nValue + 5, 10);
}
总结
- 安装 Google Test (
brew install googletest或 CMakeFetchContent) - 配置 CMakeLists.txt
- 编写 Google Test 代码
- 运行 Google Test
- 在 CLion 进行 Google Test 配置
- 使用 CTest 运行所有测试
- 使用断言
EXPECT_/ASSERT_ - 使用 Test Fixture 进行高级测试
这样,你就能在 macOS + CLion 环境下使用 Google Test 进行 C++ 单元测试了!🚀
相关文章:
在 macOS 上使用 CLion 进行 Google Test 单元测试
介绍 Google Test(GTest)是 Google 开源的 C 单元测试框架,它提供了简单易用的断言、测试夹具(Fixtures)和测试运行机制,使 C 开发者能够编写高效的单元测试。 本博客将介绍如何在 macOS 上使用 CLion 配…...
深度解码!清华大学第六弹《AIGC发展研究3.0版》
在Grok3与GPT-4.5相继发布之际,《AIGC发展研究3.0版》的重磅报告——这份长达200页的行业圣经,不仅预测了2025年AI技术爆发点,更将「天人合一」的东方智慧融入AI伦理建构,堪称数字时代的《道德经》。 文档:清华大学第…...
【论文笔记】Attentive Eraser
标题:Attentive Eraser: Unleashing Diffusion Model’s Object Removal Potential via Self-Attention Redirection Guidance Source:https://arxiv.org/pdf/2412.12974 收录:AAAI 25 作者单位:浙工商,字节&#…...
97k倍区间
97k倍区间 ⭐️难度:中等 🌟考点:暴力,2017省赛 📖 📚 import java.util.Scanner;public class Main {static int N 100010;public static void main(String[] args) {Scanner sc new Scanner(System.…...
cursor使用经验分享(java后端服务开发向)
前言 cursor是一款基于vscode,并集成AI能力的代码编辑器,其功能包括但不限于代码生成及补全、AI对话(能够直接将代码环境作为上下文)、即时应用建议等等,是一款面向未来的代码编辑器。 对于vscode,最先想…...
SpringBoot3—场景整合:AOT
一、AOT与JIT AOT:Ahead-of-Time(提前编译):程序执行前,全部被编译成机器码 JIT:Just in Time(即时编译): 程序边编译,边运行; 编译:源代码&am…...
蓝桥与力扣刷题(蓝桥 数字三角形)
题目: 上图给出了一个数字三角形。从三角形的顶部到底部有很多条不同的路径。对于每条路径,把路径上面的数加起来可以得到一个和,你的任务就是找到最大的和(路径上的每一步只可沿左斜线向下或右斜线向下走)。 输入描述…...
蓝桥试题:传球游戏(二维dp)
一、题目描述 上体育课的时候,小蛮的老师经常带着同学们一起做游戏。这次,老师带着同学们一起做传球游戏。 游戏规则是这样的:n 个同学站成一个圆圈,其中的一个同学手里拿着一个球,当老师吹哨子时开始传球࿰…...
游戏引擎学习第138天
仓库:https://gitee.com/mrxiao_com/2d_game_3 资产:game_hero_test_assets_003.zip 发布 我们的目标是展示游戏运行时的完整过程,从像素渲染到不使用GPU的方式,我们自己编写了渲染器并完成了所有的工作。今天我们开始了一些新的内容&#…...
Lab 3 Page Table
题目链接 我的问题: 1 每个进程的kernel stack是干啥的来着?在何时初始化的? 题目2:A kernel page table per process (hard) 1 一些题目要求 Your first job is to modify the kernel so that every process uses its own c…...
嵌入式学习L5D2-exec函数族和守护进程
exec函数族1 下面那个加了p环境变量就不用那个了。 输出的是系统 exec函数族2 后面不执行了 第二个参数瞎写也可以,但是要填 这里是说不想被替换,就在子进程里面执行这个。 守护进程概念 后台进程 守护进程是后台进程 一个fork了一个进程ÿ…...
洛谷P1091
题目如下 思路 谢谢观看...
行为模式---迭代器模式
概念 迭代器模式是设计模式的行为模式,它的主要设计思想是提供一个可以操作聚合对象(容器或者复杂数据类型)表示(迭代器类)。通过迭代器类去访问操作聚合对象可以隐藏内部表示,也可以使客户端可以统一处理…...
阿里云 DataWorks面试题集锦及参考答案
目录 简述阿里云 DataWorks 的核心功能模块及其在企业数据治理中的作用 简述 DataWorks 的核心功能模块及其应用场景 解释 DataWorks 中工作空间、项目、业务流程的三层逻辑关系 解释 DataWorks 中的 “节点”、“工作流” 和 “依赖关系” 设计 解释 DataWorks 中 “周期任…...
【五.LangChain技术与应用】【29.LangChain Agent小案例1:智能代理的实战应用】
“为什么我的Agent总是处理不好实时数据?”“如何让AI自己调用API查股票?” 这些困扰开发者的问题,今天咱们用一个真实案例来彻底解决。不聊虚的,直接上手教你怎么用LangChain Agent造一个会自己查股价、算指标、生成报告的股票分析助手。全程高能,代码可直接复制粘贴到项…...
TWind 的黑马点评随笔
TWind 的黑马点评随笔 目前是把黑马点评的技术部分完全做完了,不能说吃得饱饱,也算个半饱吧。 黑马点评严格来说不算项目,因为它给的前端过于垃圾,内容又重在Redis,所以称之为Redis练习貌似跟贴切。 尽管如…...
windows部署spleeter 版本2.4.0:分离音频的人声和背景音乐
windows部署spleeter 版本2.4.0:分离音频的人声和背景音乐 一、Spleeter 是什么? Spleeter 是由法国音乐流媒体公司 Deezer 开发并开源的一款基于深度学习的音频分离工具。它能够将音乐中的不同音轨(如人声、鼓、贝斯、钢琴等)分…...
dify + ollama + deepseek-r1+ stable-diffusion 构建绘画智能体
故事背景 stable-diffusion 集成进 dify 后,我们搭建一个小智能体,验证下文生图功能 业务流程 #mermaid-svg-6nSwwp69eMizP6bt {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-6nSwwp69eMiz…...
pytorch3d学习(二)——安装与纹理显示demo测试
文章目录 零、安装一、渲染0. 导入模块1. 加载网格和纹理文件零、安装 参考了这篇文章:Pytorch3D Linux环境下安装(踩坑)记录 经历了红框子里面的步骤,然后测试一下官方给的代码,尝试一些 3D 算子,例如计算两个网格之间的倒角损失: from pytorch3d.utils import ico_s…...
C语言基础之【指针】(下)
C语言基础之【指针】(下) 指针和字符串字符指针字符指针做函数参数const修饰的指针变量指针数组做为main函数的形参项目开发常用字符串应用模型while和do-while模型两头堵模型字符串反转模型 字符串处理函数strchr()strrchr()strstr()strtok()strcpy()st…...
Redis--Hash类型
目录 一、引言 二、介绍 三、操作 1.HSET,HGET,HEXISTS,HDEL 2.HKEYS,HVALS 3.HGETALL,HMGET,HSAN 4.HLEN,HSETNX,HINCRBY,HINCRBYFLOAT 四、编码方式 1.ziplist(压缩列表) 2.hashtable(哈希表&am…...
迷你世界脚本道具接口:Item
道具接口:Item 彼得兔 更新时间: 2023-04-26 10:26:18 继承自 Actor 具体函数名及描述如下: 序号 函数名 函数描述 1 getItemName(...) 获取道具名称 2 getItemId(...) 获取actor对应的道具ID,如球类等 3 getDropItemNum(...) …...
C++中的.h文件一般是干什么的?
在C中,.h 文件通常是 头文件(Header File),它们的主要作用是声明类、函数、常量、宏以及其他在多个源文件(.cpp文件)之间共享的元素。头文件提供了一个接口,使得不同的源文件能够访问这些共享的…...
大型语言模型训练的三个阶段:Pre-Train、Instruction Fine-tuning、RLHF (PPO / DPO / GRPO)
前言 如果你对这篇文章可感兴趣,可以点击「【访客必读 - 指引页】一文囊括主页内所有高质量博客」,查看完整博客分类与对应链接。 当前的大型语言模型训练大致可以分为如下三个阶段: Pre-train:根据大量可获得的文本资料&#…...
共享模型之管程(悲观锁)
共享模型之管程(悲观锁) 文章目录 共享模型之管程(悲观锁)一、常见线程安全的类二、对象头三、Monitor(监视器 / 管程)四、偏向锁偏向锁的实现原理撤销偏向锁 五、轻量级锁轻量级锁的释放 六、重量级锁七、…...
零基础C语言学习日志22(自定义类型:联合和枚举)
目录 联合体 联合体类型的声明 联合体的特点 相同成员联合体和结构体的对比 联合体大小的计算 例子 枚举类型 枚举类型的声明 枚举类型的优点 枚举类型的使用 联合体 联合体类型的声明 像结构体一样,联合体也是由一个或者多个成员构成,这些成…...
ROS2 Rviz 实战:给 panda 机械臂场景塞个圆柱体
视频讲解 ROS2 Rviz 实战:给 panda 机械臂场景塞个圆柱体 创建add_cylinder的package ros2 pkg create add_cylinder --build-type ament_cmake --dependencies rclcpp control_msgs moveit_ros_planning_interface 在src中添加add_cylinder.cpp,如下 #…...
DeepSeek+知识库+鸿蒙,助力鸿蒙高效开发
不知道你们发现没有,就是鸿蒙开发官网,文档也太多太多了,对于新手来说确实头疼,开发者大多是极客,程序的目的是让世界更高效!看文档,挺头疼的,毕竟都是理科生。 遇到问题不要慌&…...
从零开始在Windows使用VMware虚拟机安装黑群晖7.2系统并实现远程访问
文章目录 前言1.软件准备2. 安装VMware17虚拟机3.安装黑群晖4. 安装群晖搜索助手5. 配置黑群晖系统6. 安装内网穿透6.1 下载cpolar套件6.2 配置群辉虚拟机6.3 配置公网地址6.4 配置固定公网地址 总结 前言 本文主要介绍如何从零开始在Windows系统电脑使用VMware17虚拟机安装黑…...
爬虫逆向:脱壳工具 frida-dexdump 的使用详解
更多内容请见: 爬虫和逆向教程-专栏介绍和目录 文章目录 1. 工具简介1.1 frida-dexdump介绍1.2 frida-dexdump支持场景1.3 frida-dexdump优点1.4 frida-dexdump工具使用方法2. 环境准备3. 安装 frida-dexdump4. 使用步骤4.1 步骤一:连接 Android 设备4.1 步骤二:安装目标应用…...
