如何使用gtest为c++代码编写单元测试 Google Test框架入门【工程实践】


用Google Test写C++单元测试的核心是写可测代码、用断言验证行为、自动化执行;推荐FetchContent拉取源码编译,用TEST宏定义测试用例,EXPECT_EQ等断言验证结果。

用 Google Test(gtest)为 C++ 项目写单元测试,核心是:写可测代码 + 用断言验证行为 + 自动化执行。不需要宏大的测试架构,从一个 .cpp 文件开始就能跑起来。

一、快速搭建 gtest 环境(以 CMake 项目为例)

推荐用 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(),省去自己写入口函数。

二、写第一个测试用例(TestCase + TEST 宏)

假设有如下待测类:

// calculator.h
#pragma once
int add(int a, int b);
int multiply(int a, int b);

对应测试文件 calculator_test.cpp

#include "calculator.h"
#include 

TEST(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 是非致命断言:失败时打印信息但继续执行本测试函数
  • ASSERT_EQ

三、测试类(Test Fixture)管理共享资源

当多个测试需要共用初始化/清理逻辑(如打开文件、构造对象),用测试类更清晰:

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.*
  • 在 IDE(如 CLion / VS Code)中配置运行目标,点击 ▶️ 即可单步调试测试函数
  • 遇到 “undefined reference to testing::InitGoogleTest”?检查是否链接了 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

了解您产品搜索量及市场趋势,制定营销计划

同行竞争及网站分析保障您的广告效果

点击免费数据支持

提交您的需求,1小时内享受我们的专业解答。

致胜网络推广营销网


致胜网络推广营销网

致胜网络推广营销网专注海外推广十年,是谷歌推广.Facebook广告全球合作伙伴,我们精英化的技术团队为企业提供谷歌海外推广+外贸网站建设+网站维护运营+Google SEO优化+社交营销为您提供一站式海外营销服务。

 915688610

 17370845950

 915688610@qq.com

Notice

We and selected third parties use cookies or similar technologies for technical purposes and, with your consent, for other purposes as specified in the cookie policy.
You can consent to the use of such technologies by closing this notice, by interacting with any link or button outside of this notice or by continuing to browse otherwise.