新闻中心
c++怎么用Google Test(gtest)进行单元测试_c++单元测试框架gtest使用指南
首先安装配置gtest,再编写测试用例并使用TEST宏定义测试,通过EXPECT_EQ等断言验证结果,最后结合CMake编译运行,实现对C++代码的单元测试覆盖。

在C++项目中使用Google Test(简称gtest)进行单元测试,是提升代码质量、确保模块正确性的有效方式。gtest是一个由Google开发的开源C++测试框架,功能强大、易于上手,支持断言、参数化测试、死亡测试等多种测试类型。
1. 安装与配置gtest
要使用gtest,首先需要将其集成到你的项目中。常见方法有通过包管理器安装或从源码编译:
-
Linux(以Ubuntu为例): 使用apt安装:
sudo apt-get install libgtest-dev cmake
然后进入目录编译gtest源码(因为libgtest-dev不直接提供库文件)。 -
macOS: 使用Homebrew:
brew install googletest -
Windows + vcpkg:
vcpkg install gtest -
源码编译(通用方法):
从GitHub克隆并构建:git clone https://github.com/google/googletest.git cd googletest mkdir build && cd build cmake .. make -j sudo make install
2. 编写第一个测试用例
假设你有一个简单的加法函数,想对它进行测试。
示例代码(add.h):
#ifndef ADD_H #define ADD_H int add(int a, int b); #endif
add.cpp:
#include "add.h"
int add(int a, int b) {
return a + b;
}
test_add.cpp(测试文件):
#include <gtest/gtest.h>
#include "add.h"
<p>// 测试用例:测试add函数
TEST(TestAdd, HandlesPositiveNumbers) {
EXPECT_EQ(add(2, 3), 5);
}</p><p>TEST(TestAdd, HandlesNegativeNumbers) {
EXPECT_EQ(add(-1, -1), -2);
}</p><p>TEST(TestAdd, HandlesZero) {
EXPECT_EQ(add(0, 0), 0);
}</p><p>// 主函数,运行所有测试
int main(int argc, char **argv) {
::testing::InitGoogleTest(&argc, argv);
return RUN_ALL_TESTS();
}</p>这里使用了TEST宏定义测试用例,格式为 TEST(测试套件名, 测试名)。EXPECT_EQ用于判断两个值是否相等。
3. 编译和运行测试
将源文件和测试文件一起编译,链接gtest和pthread库。
例如使用g++编译:
g++ -std=c++11 add.cpp test_add.cpp -lgtest -lgtest_main -lpthread -o test_add运行:
./test_add输出类似:
[==========] Running 3 tests from 1 test suite. [----------] Global test environment set-up. [----------] 3 tests from TestAdd [ RUN ] TestAdd.HandlesPositiveNumbers [ OK ] TestAdd.HandlesPositiveNumbers (0 ms) [ RUN ] TestAdd.HandlesNegativeNumbers [ OK ] TestAdd.HandlesNegativeNumbers (0 ms) [ RUN ] TestAdd.HandlesZero [ OK ] TestAdd.HandlesZero (0 ms) [----------] 3 tests from TestAdd (0 ms total) [==========] 3 tests passed.
4. 常用断言与高级特性
gtest提供了丰富的断言宏,帮助你验证各种条件。
常用断言:
Musho
AI网页设计Figma插件
76
查看详情
-
EXPECT_EQ(a, b)/ASSERT_EQ(a, b):判断相等(EXPECT失败继续执行,ASSERT则中断当前测试) -
EXPECT_TRUE(condition):判断条件为真 -
EXPECT_NE(a, b):不相等 -
EXPECT_LT(a, b):a 小于 b -
EXPECT_STRNE(str1, str2):字符串不相等
参数化测试(Parametrized Tests): 当你想用多组数据测试同一逻辑时,可以使用参数化测试。
示例:
class AddTest : public ::testing::TestWithParam<std::tuple<int, int, int>> {};
<p>TEST_P(AddTest, TestAdd) {
auto [a, b, expected] = GetParam();
EXPECT_EQ(add(a, b), expected);
}</p><p>INSTANTIATE_TEST_SUITE_P(
PositiveAndNegative,
AddTest,
::testing::Values(
std::make_tuple(2, 3, 5),
std::make_tuple(-1, -1, -2),
std::make_tuple(0, 0, 0)
)
);</p>这样会为每组参数生成一个测试实例,提高覆盖率。
5. 与CMake集成(推荐)
现代C++项目通常使用CMake管理构建,集成gtest更方便。
CMakeLists.txt 示例:
cmake_minimum_required(VERSION 3.14) project(MyProject) <p>set(CMAKE_CXX_STANDARD 11)</p><然后执行:;h1>添加源文件</h1><p>add_library(mylib add.cpp)</p><h1>查找gtest</h1><p>find_package(GTest REQUIRED)</p><h1>添加测试可执行文件</h1><p>add_executable(test_add test_add.cpp) target_link_libraries(test_add mylib GTest::GTest GTest::Main)</p><h1>启用测试</h1><p>enable_testing() add_test(NAME run_test_add COMMAND test_add)</p>
mkdir build && cd build cmake .. && make ctest
基本上就这些。掌握这些内容后,你已经可以在C++项目中高效使用gtest进行单元测试了。关键是坚持“先写测试,再写实现”的TDD思路,逐步提升代码健壮性。
以上就是c++++怎么用Google Test(gtest)进行单元测试_c++单元测试框架gtest使用指南的详细内容,更多请关注其它相关文章!
# c++
# linux
# git
# go
# windows
# 单元测试
# 当你
# 魏都网站优化咨询中心
# 将其
# 河源公司网站建设制作
# 抖音关键词排名搜索推广
# 项城网站优化联系方式
# 辽阳建设网站公司报价
# 巴彦淖尔市营销推广
# 台州温岭网站推广营销
# 高安整合营销推广
# 整合营销推广策划公司
# 邢台正规seo推广公司
# 不相等
# 第一个
# 迭代
# 头文件
# 是一个
# 客户端
# 如何使用
# win
# macos
# ai
# mac
# ubuntu
# github
相关栏目:
【
科技资讯46185 】
【
网络学院92790 】
相关推荐:
uc浏览器网页版极速入口 uc网页浏览器网页版流畅体验
响应式CSS Grid布局:优化网格项在小屏幕下的堆叠与宽度适配
漫蛙2(台版)官方入口地址 漫蛙2(台版)正版漫画网页端
Golang如何使用context实现超时取消_Golang context超时取消模式实践
邮政快递单号查询入口 邮政快递物流信息在线查询入口
JUnit5/Mockito:优雅测试内部依赖与异常处理的实践
c++中的std::basic_string的SSO优化_c++短字符串优化深度解析
妖精漫画网页版登录入口免费_妖精漫画官网主页直接阅读漫画
12306选座怎么选到临时改签座_12306改签选座策略与步骤
抖音隐秘迷城小游戏入口_ 抖音冒险解谜小游戏秒玩
CSS Box Model与弹性按钮:维持布局稳定的动画实践
vivo手机参数配置怎么增强信号_vivo手机参数配置信号增强方法
Windows 11怎么彻底关闭定位_Windows 11服务中禁用Geolocation
荒野行动PC版怎么注册_荒野行动PC版账号注册详细流程图文教程
DLsite中文平台入口 DLsite官网内容在线查看
抖音创作助手登录入口_抖音创作辅助工具官网直达
哔哩哔哩忘记密码了怎么找回_哔哩哔哩密码找回方法
拼多多视频播放卡顿如何处理 拼多多视频播放优化技巧
Python vgamepad库按键模拟:正确使用XUSB_BUTTON常量
Golang如何实现简单的Web表单_Golang表单提交与验证处理方法
必由学官方网站入口 必由学学生教师共用登录通道
抓大鹅无需下载版 抓大鹅秒玩版入口
如何在更新Composer依赖后自动运行测试_使用post-update-cmd钩子触发PHPUnit
J*a如何使用AtomicInteger控制计数_J*a无锁计数器性能分析
支付宝如何管理隐私设置_支付宝隐私保护的配置技巧
Adobe PDF表单中利用J*aScript解析与格式化日期组件的教程
Typer应用中灵活处理命令行参数的令牌化与解析
Lar*el DB::listen 事件中的查询执行时间单位解析
狙击外星人小游戏开始_狙击外星人小游戏立即开始
J*aScript异步迭代器_j*ascript异步遍历
拼多多购物车商品数量无法修改如何处理 拼多多购物车操作优化方法
QQ邮箱登录官网首页 腾讯QQ邮箱网页入口
css滚动区域卡顿如何改善_css滚动问题用will-change优化渲染
顺丰快递查询系统 官方正版查询入口
现代化 SciPy 一维插值:interp1d 的替代方案与最佳实践
优化 Python 函数中的条件逻辑:解决 if-else 嵌套与参数选择问题
企业名称高精度匹配:N-gram方法在结构相似性分析中的应用
2306选座时如何选靠窗位置_12306选座靠窗座位查看方法解析
React/Next.js中实现列表项的动态移动与状态管理:兼论唯一键的重要性
c++如何实现一个简单的软件渲染器_c++从零开始的3D图形学
电脑屏幕颜色不舒服怎么办_Windows夜间模式与色彩校准教程【护眼技巧】
LINQ to XML为何解析失败? 深入理解C# XDocument的异常处理
打开就能玩的植物大战僵尸 植物大战僵尸网页版传送门
Win11 USB传输速度慢怎么解决 Win11 USB驱动更新与设置
Archive of Our Own官网直达 AO3最新可用地址一览
QQ邮箱官网登录入口 QQ邮箱网页版邮箱快速登录
Golang切片为何属于引用类型_Golang slice底层结构与引用语义说明
Win10文件资源管理器“此电脑”分组怎么关 Win10恢复经典视图【技巧】
Django表单提交验证失败后保持字段值不刷新
wps文字怎么插入目录并自动更新_wps文字如何插入目录并自动更新方法


2025-10-31
浏览次数:次
返回列表
;h1>添加源文件</h1><p>add_library(mylib add.cpp)</p><h1>查找gtest</h1><p>find_package(GTest REQUIRED)</p><h1>添加测试可执行文件</h1><p>add_executable(test_add test_add.cpp)
target_link_libraries(test_add mylib GTest::GTest GTest::Main)</p><h1>启用测试</h1><p>enable_testing()
add_test(NAME run_test_add COMMAND test_add)</p>