用Google Test写C++单元测试的核心是写可测代码、用断言验证行为、自动化执行;推荐FetchContent拉取源码编译,用TEST宏定义测试用例,EXPECT_EQ等断言验证结果。
用 Google Test(gtest)为 C++ 项目写单元测试,核心是:写可测代码 + 用断言验证行为 +
自动化执行。不需要宏大的测试架构,从一个 .cpp 文件开始就能跑起来。
推荐用 FetchContent 直接拉取 gtest 源码编译,避免系统级安装或版本冲突:
CMakeLists.txt 中加入:include(FetchContent) FetchContent_Declare( googletest URL https://github.com/google/googletest/archive/refs/tags/v1.14.0.zip ) FetchContent_MakeAvailable(googletest)链接测试可执行文件
add_executable(my_tests test_main.cpp my_class_test.cpp) target_link_libraries(my_tests gtest_main gtest)
注意:不用单独编译 gtest 库,FetchContent_MakeAvailable 会自动处理构建依赖;gtest_main 提供了默认的 main(),省去自己写入口函数。
假设有如下待测类:
// calculator.h #pragma once int add(int a, int b); int multiply(int a, int b);
对应测试文件 calculator_test.cpp:
#include "calculator.h" #includeTEST(CalculatorTest, AddPositiveNumbers) { EXPECT_EQ(add(2, 3), 5); }
TEST(CalculatorTest, MultiplyByZero) { EXPECT_EQ(multiply(7, 0), 0); EXPECT_EQ(multiply(0, -5), 0); }
TEST(测试套名, 测试名) 是最常用宏,自动生成函数并注册到测试框架EXPECT_EQ 是非致命断言:失败时打印信息但继续执行本测试函数当多个测试需要共用初始化/清理逻辑(如打开文件、构造对象),用测试类更清晰:
class StringHelperTest : public ::testing::Test {
protected:
void SetUp() override { // 每个 TEST 运行前调用
str_ = "hello";
}
void TearDown() override { } // 每个 TEST 运行后调用(可选)
std::string str_;
};
TEST_F(StringHelperTest, LengthIsFive) {
EXPECTEQ(str.length(), 5);
}
TEST_F(StringHelperTest, StartsWithHe) {
EXPECTTRUE(str.starts_with("he"));
}
::testing::Test,重写 SetUp/TearDown
TEST_F 替代 TEST,第一个参数必须是该类名./my_tests,默认输出简洁结果./my_tests --gtest_print_time --gtest_color=yes
./my_tests --gtest_filter=*Add* 或 ./my_tests --gtest_filter=CalculatorTest.*
gtest_main,且未重复定义 main()
不复杂但容易忽略:测试命名要有业务含义(比如 ParseJson_InvalidInput_ThrowsException),比 Test1 更易维护;每个 TEST 只验证一个关注点,避免堆砌多个断言掩盖真正问题。
# git
# go
# github
# ai
# c++
# google
# 架构
# 自动化
# 第一个
# 多个
# 可执行文件
# 单元测试
# 就能
# 不需要
# 要有
# 重写
# 可选
# 为例
相关栏目:
【
Google疑问12 】
【
Facebook疑问10 】
【
网络优化76771 】
【
技术知识130152 】
【
IDC云计算60162 】
【
营销推广131313 】
【
AI优化88182 】
【
百度推广37138 】
【
网站推荐60173 】
【
精选阅读31334 】
相关推荐:
Windows10无法识别USB设备描述符请求失败_通用串行总线控制器修复
如何关闭Win10自动更新更新_Win10系统自动更新双重关闭技巧
如何使用Golang包导出规则_控制函数和变量可见性
Windows10电脑怎么查看硬盘通电时间_Win10使用工具检测磁盘健康
如何在Golang中实现基础配置管理功能_Golang配置文件读取与更新示例
Win11声音忽大忽小怎么办 Win11音频增强功能关闭教程【修复】
Go 中 := 短变量声明的类型推导机制详解
Win11怎么关闭专注助手 Win11关闭免打扰模式设置【操作】
如何在Golang中写入XML文件_生成符合规范的XML数据
Windows任务计划服务异常原因_任务调度失败的处理方案
Win10如何设置双wan路由器 Win10双wan路由器设置方法【指南】
Win11怎么解压RAR文件 Win11自带解压功能使用方法
如何优化Golang程序CPU性能_Golang CPU密集型任务优化方法
php订单日志怎么按状态筛选_php筛选不同状态订单日志教程【教程】
php和redis连接超时怎么办_phpredis调试连接问题汇总【指南】
Windows 11无法安全删除U盘提示设备正在使用中怎么办_Windows 11找出占用设备进程
Win10如何关闭安全中心所有通知 Win10禁用Windows Defender提醒【设置】
c++怎么调用nana库开发GUI_c++ 现代风格窗口组件与事件处理【实战】
Win10电脑怎么设置休眠快捷键_Windows10电源按钮功能定义
如何用列表一次性对 DataFrame 的指定列应用字典映射
如何在 Go 中高效缓存与分发网络视频流
Windows10无法连接到Internet_Win10网络重置命令详解
零基础学会Python自动化办公_高效处理Excel与PDF文档
如何在 IIS 上为 ASP.NET 6 应用排除特定目录并交由 PHP 处理
Win10如何更改开机密码_Windows10登录选项更改密码
如何使用Golang log设置日志输出格式_Golang log日志格式示例
c++怎么实现大文件的分块读写_c++ 文件指针seekp与seekg偏移控制【方法】
Win11如何开启系统更新 Win11开启系统更新方法【步骤】
Win11键盘快捷键大全_Windows 11常用高效快捷键汇总【技巧】
如何使用Golang开发基础文件下载功能_Golang HTTP文件响应与缓存实现
php中self::能调用子类重写的方法吗_静态绑定与重写关系【介绍】
C++中的协变与逆变是什么?C++函数指针与返回类型详解【类型系统】
php控制舵机角度怎么调_php发送pwm信号控制舵机转动【解答】
PHP 中如何在函数内持久修改引用变量所指向的目标
Python装饰器设计思路_功能增强机制说明【指导】
MAC怎么使用表情符号面板_MAC Emoji快捷键调用与符号查找【方法】
XAMPP 启动失败(Apache 突然停止)的终极排查与修复指南
php中作用域操作符能访问私有静态属性吗_访问权限限制【指南】
Python代码测试策略_质量保障解析【教程】
Win11怎么更改管理员名字 Win11修改账户名称详细步骤【教程】
小程序里php怎么变mp4_小程序调用php生成mp4视频方法【教程】
如何在Golang中实现并发消息队列消费者_Golang channel消息消费实践
Python集合操作技巧_高效去重解析【教程】
如何在Golang中实现RPC异步返回_Golang RPC异步处理与回调方法
MAC怎么一键隐藏桌面所有图标_MAC极简模式切换与终端指令【方法】
Golang如何遍历目录文件_Golang filepath.Walk目录遍历操作方法
微信里的php文件怎么变mp4_微信接收php转mp4操作步骤【操作】
Win10怎样清理C盘浏览器缓存_Win10清理浏览器缓存步骤【步骤】
Python性能剖析高级教程_cProfileLineProfiler优化案例解析
Windows7如何安装系统镜像_Windows7系统安装教程【步骤】
2025-12-17
致胜网络推广营销网专注海外推广十年,是谷歌推广.Facebook广告全球合作伙伴,我们精英化的技术团队为企业提供谷歌海外推广+外贸网站建设+网站维护运营+Google SEO优化+社交营销为您提供一站式海外营销服务。