新闻中心

C++怎么使用Google Test编写单元测试_C++项目自动化测试框架GTest入门

2025-11-28
浏览次数:
返回列表
GTest是C++中流行的单元测试框架,由Google开发,支持跨平台。可通过vcpkg或CMake FetchContent集成。编写测试使用TEST宏定义用例,EXPECT_EQ等断言验证结果。配合CMake配置enable_testing、add_test等指令构建测试套件,支持命令行过滤与重复执行。推荐结合CTest运行,适用于从小型到大型项目的测试组织与管理。

c++怎么使用google test编写单元测试_c++项目自动化测试框架gtest入门

Google Test(简称 GTest)是 C++ 中最流行的单元测试框架之一,由 Google 开发并开源,支持跨平台使用。它能帮助开发者编写和运行 C++ 的自动化测试用例,验证函数、类和模块的正确性。下面介绍如何在 C++ 项目中集成并使用 GTest 编写基本的单元测试。

1. 安装与配置 GTest

有多种方式引入 GTest 到你的项目中,常用方法包括通过包管理器安装或使用 CMake 拉取源码编译。

方法一:使用 vcpkg(推荐)

如果你使用 vcpkg 管理依赖:

  • vcpkg install gtest
  • CMake 会自动找到 GTest,无需手动配置路径

方法二:使用 CMake FetchContent(适合小型项目)

在项目的 CMakeLists.txt 中添加:

include(FetchContent)
FetchContent_Declare(
  googletest
  URL https://github.com/google/googletest/archive/refs/tags/v1.14.0.zip
)
FetchContent_MakeAvailable(googletest)

这样会自动下载并编译 GTest,无需系统级安装。

2. 编写第一个测试用例

假设你有一个简单的加法函数:

// math.h
#pragma once
int add(int a, int b);
// math.cpp
#include "math.h"
int add(int a, int b) {
    return a + b;
}

现在为它写一个测试文件:

// test_math.cpp
#include <gtest/gtest.h>
#include "math.h"
<p>TEST(MathTest, AddPositiveNumbers) {
EXPECT_EQ(add(2, 3), 5);
}</p><p>TEST(MathTest, AddNegativeNumbers) {
EXPECT_EQ(add(-1, -1), -2);
}</p><p>TEST(MathTest, AddMixedNumbers) {
EXPECT_EQ(add(-1, 1), 0);
}

说明:

  • TEST(测试套件名, 测试用例名) 定义一个测试用例
  • EXPECT_EQ 验证两个值是否相等,不相等也不会立即终止测试
  • 若希望出错即停止,可使用 ASSERT_EQ

3. 配置 CMake 构建测试

在项目根目录的 CMakeLists.txt 中添加:

N世界 N世界

一分钟搭建会展元宇宙

N世界 138 查看详情 N世界
cmake_minimum_required(VERSION 3.14)
project(my_project)
<h1>添加源文件</h1><p>add_library(math math.cpp)</p><h1>启用测试</h1><p>enable_testing()</p><h1>添加测试可执行文件</h1><p>add_executable(test_math test_math.cpp)
target_link_libraries(test_math gtest_main math)</p><h1>注册测试到 CTest</h1><p>add_test(NAME MathTestSuite COMMAND test_math)

然后构建并运行:

mkdir build && cd build
cmake .. && make
./test_math                  # 直接运行测试
ctest                        # 使用 CTest 运行(推荐)

4. 常用断言宏

GTest 提供丰富的断言方式:

  • EXPECT_EQ(a, b):a == b
  • EXPECT_NE(a, b):a != b
  • EXPECT_LT(a, b):a
  • EXPECT_GT(a, b):a > b
  • EXPECT_TRUE(condition):条件为真
  • EXPECT_FALSE(condition):条件为假
  • EXPECT_DOUBLE_EQ(a, b):浮点数近似相等
  • EXPECT_STREQ(s1, s2):字符串相等

失败时会输出具体值和位置,便于调试。

5. 组织多个测试文件

大型项目可以拆分多个测试文件,例如:

  • test_math.cpp
  • test_string_utils.cpp
  • test_container.cpp

每个文件生成一个可执行文件或统一链接到一个测试主程序中。也可以使用 gtest_main 提供默认 main 函数,省去手写入口。

6. 运行选项与过滤

运行测试时可通过命令行参数控制行为:

  • --gtest_list_tests:列出所有测试用例
  • --gtest_filter=MathTest.*:只运行 MathTest 套件下的测试
  • --gtest_repeat=5:重复执行 5 次
  • --gtest_break_on_failure:失败时中断(用于调试)

例如:

./test_math --gtest_filter=MathTest.AddPositive*

基本上就这些。掌握这些内容后,你就可以在 C++ 项目中使用 GTest 实现基础的单元测试了。随着项目变大,还可以引入参数化测试、死亡测试等功能,进一步提升测试覆盖率。

以上就是C++怎么使用Google Test编写单元测试_C++项目自动化测试框架GTest入门的详细内容,更多请关注其它相关文章!


# 可执行文件  # 南平搜狗问答推广营销  # 有利于seo的网站源码  # 出境游同业营销推广技巧  # seo技术培训广告  # 成都兴隆推广营销广告  # 济南商品推广网站优化  # 推广网站哪个空间好  # seo免费留痕外推  # 百度关键词排名变动  # 东莞软文网络营销推广  # 第一个  # 还可以  # 如果你  # git  # 可通过  # 多个  # 套件  # 命令行  # 第三方  # 单元测试  # red  # google  # c++  # ai  # ppt  # github  # go 


相关栏目: 【 科技资讯46185 】 【 网络学院92790


相关推荐: 钉钉视频会议声音异常如何处理 钉钉会议音频修复技巧  Pandas DataFrame 多条件优先级排序与排名  提升屏幕阅读器对“m”时间单位的播报准确性:HTML与CSS组合解决方案  J*aScript中高效清空DOM列表元素:解决for循环中断与任务管理问题  铃兰之剑为这和平的世界希里技能组及加点推荐  Sublime Text怎么设置垂直标尺_Sublime配置Rulers规范代码长度  顺丰国际快递查询 国际件官方查询入口  微信网页版官方入口教程 微信网页版网页版快速登录步骤  QQ邮箱网页版登录入口 QQ邮箱官方在线使用平台  Pandas DataFrame 高效批量赋值:告别循环与笛卡尔积误区  Go语言中对Map值调用带指针接收者方法:原理与最佳实践  网易大神账号申诉需要多久_网易大神账号申诉流程说明  2025-2030年全球乘用车销量预测:新能源成增长主力  TikTok国际版网页端快速入口 TikTok全球版短视频浏览教程  C++ typeid如何获取类型信息_C++ RTTI运行时类型识别用法  如何在Promise链中有效终止错误处理后的执行  Lar*el Excel导入时生成自定义递增ID的策略与实践  Yandex官网搜索引擎免登录_俄罗斯Yandex一键直达入口  使用Python高效删除Word宏并转换DOCM为DOCX格式  苹果手机指南针不准怎么校准 传感器校准方法详解【建议收藏】  sublime怎么覆盖插件的默认快捷键_sublime快捷键优先级与设置  c++项目目录结构应该如何组织_c++工程化项目结构规范  漫蛙2(台版)官方入口地址 漫蛙2(台版)正版漫画网页端  新手怎么开始学化妆 零基础化妆入门教程  在Go语言中利用后缀数组处理多字符串:实现高效文本匹配与自动补全  React/Next.js中实现列表项的动态选择与移动  c++如何使用TBB库进行任务并行_c++ Intel线程构建模块  Win10快速启动功能利弊分析 Win10开启或关闭快速启动教程【技巧】  Python字典中优雅地迭代剩余元素的方法  使用J*aScript检测输入元素是否包含在特定类中  c++中的std::forward_list和std::list有什么不同_c++ forward_list与list区别分析  Python getattr() 异常处理深度解析:避免程序意外退出  Python异步编程实践:使用Binance API构建实时交易数据流  C++ vector二维数组定义_C++ vector of vector用法  小米汽车11月交付量突破40000台!雷军:将继续努力  C++如何比较两个字符串_C++ string compare函数与操作符对比  免费抖音短视频入口_抖音网页版短视频免费通道  AngularJS $http POST请求数据传递与Go后端接收实践  Yandex搜索引擎官网入口_俄罗斯Yandex免登录一键直达  如何创建没有密码的Windows本地账户_跳过微软账户登录的技巧【教程】  yy漫画网页版官方入口_yy漫画官网登录页面链接  三星GalaxyZFold5怎样在相册制作折叠屏分镜_iPhone三星GalaxyZFold5相册制作折叠屏分镜【创意编辑】  神庙逃亡小游戏在线玩 神庙逃亡小游戏入口  在Go Martini框架中高效服务动态生成图像的实践指南  php源码怎么看淘宝客系统_看php源码淘宝客系统技巧  R星幕后开发视频泄露 包含《GTA6》等多款大作  J*aScriptWebpack优化_J*aScript构建工具实战  双系统安装时,如何设置默认启动系统? msconfig命令了解一下!  C++20的source_location是什么_C++在编译期获取源码位置信息用于日志和断言  Spring Boot内嵌服务器与J*a EE全栈特性:选择与部署策略 

搜索