0

0

c++怎么进行单元测试_c++ Google Test框架搭建与断言使用【方法】

裘德小鎮的故事

裘德小鎮的故事

发布时间:2025-12-29 20:21:09

|

876人浏览过

|

来源于php中文网

原创

google test 是主流c++单元测试框架,推荐以子模块方式集成;test宏定义测试用例,expect_eq用于值比较,浮点数需用expect_float_eq;assert_*失败立即返回,运行时可用--gtest_filter等参数控制。

c++怎么进行单元测试_c++ google test框架搭建与断言使用【方法】

Google Test 是 C++ 项目中最主流、最稳定的单元测试框架,它不依赖 STL 的特定实现,支持 Windows/Linux/macOS,且与 CMake 集成顺畅。只要你的编译器支持 C++11(GCC 4.8+ / Clang 3.3+ / MSVC 2015+),就能直接用。

怎么把 Google Test 编译进你的项目

最稳妥的方式是作为子模块引入并由 CMake 构建,避免二进制兼容性问题。不要用系统包管理器(如 apt install libgtest-dev)安装,那些头文件和库常不匹配,undefined reference to testing::UnitTest::GetInstance() 就是典型症状。

  • 在项目根目录执行:
    git submodule add https://github.com/google/googletest.git third_party/googletest
  • 确保 CMakeLists.txt 中启用测试并包含子模块:
    enable_testing()
    add_subdirectory(third_party/googletest)
    # 然后链接到你的测试可执行文件
    target_link_libraries(your_test_executable gtest gtest_main)
  • 禁止定义 GTEST_LINKED_AS_SHARED_LIBRARY —— 默认静态链接更安全,否则容易遇到 GLIBCXX_3.4.26 not found 这类符号版本错误

如何写第一个 TEST 宏和 EXPECT_EQ 断言

TEST 是宏,不是函数,它会自动生成测试用例类和注册逻辑。所有断言都以 EXPECT_*ASSERT_* 开头,前者失败继续执行,后者失败立即返回(适合前置条件检查)。

  • EXPECT_EQ 比较两个值,底层调用 operator==,对 std::stringintdouble 都适用;但对自定义类型需重载 operator==,否则编译报错 no match for 'operator=='
  • 浮点数必须用 EXPECT_FLOAT_EQEXPECT_NEAR(val, expected, abs_error),直接用 EXPECT_EQ 会因精度丢失恒失败
  • 示例:
    TEST(MathTest, SumReturnsCorrectValue) {
      EXPECT_EQ(Add(2, 3), 5);
      EXPECT_FLOAT_EQ(Sqrt(4.0f), 2.0f);
      EXPECT_NEAR(0.1f + 0.2f, 0.3f, 1e-6f);
    }

为什么 ASSERT_TRUE(ptr) 后面的代码没运行

ASSERT_TRUE 是“硬断言”,内部使用 return 跳出当前测试函数。如果你看到后续断言完全没输出,大概率是因为前面的 ASSERT_* 已经退出了。

Stable Diffusion Online
Stable Diffusion Online

基于Stable Diffusion搭建的AI绘图工具

下载

立即学习C++免费学习笔记(深入)”;

  • 常见误用场景:检查指针非空后立刻解引用 —— 应该用 ASSERT_TRUE(ptr != nullptr),而不是 EXPECT_TRUE(ptr)(因为 bool(ptr) 在指针为 nullptr 时为 false,但语义不清)
  • 若需同时验证多个条件且允许部分失败,全部改用 EXPECT_*;若某条件不满足则整个测试无意义(比如 fixture 初始化失败),才用 ASSERT_*
  • 注意:没有 ASSERT_NOTNULL,得写成 ASSERT_TRUE(ptr != nullptr) 或用 ASSERT_THAT(ptr, NotNull())(需含 gmock/gmock.h

怎么运行测试并看失败堆

默认运行所有测试,但实际开发中几乎总是需要过滤或调试单个用例。Google Test 自带命令行参数,无需额外工具链。

  • 列出所有测试名:
    ./your_test_executable --gtest_list_tests
  • 只运行匹配 MathTest 的测试:
    ./your_test_executable --gtest_filter=*.MathTest*
  • 启用颜色和详细输出(失败时自动打印源码行号):
    ./your_test_executable --gtest_color=yes --gtest_print_time
  • 崩溃时看不到堆栈?加 --gtest_catch_exceptions=0 并配合 gdb ./your_test_executable,否则异常被框架吞掉

真正麻烦的从来不是写断言,而是让测试可重复、不依赖全局状态。每个 TEST 用例默认独立运行,但如果你在 SetUpTestCase 里 malloc 了一块内存又忘了 free,或者用了 static 变量缓存结果,后续测试就可能偶然失败——这种问题不会报错,只会让你花半天怀疑人生。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
string转int
string转int

在编程中,我们经常会遇到需要将字符串(str)转换为整数(int)的情况。这可能是因为我们需要对字符串进行数值计算,或者需要将用户输入的字符串转换为整数进行处理。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

990

2023.08.02

string转int
string转int

在编程中,我们经常会遇到需要将字符串(str)转换为整数(int)的情况。这可能是因为我们需要对字符串进行数值计算,或者需要将用户输入的字符串转换为整数进行处理。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

990

2023.08.02

int占多少字节
int占多少字节

int占4个字节,意味着一个int变量可以存储范围在-2,147,483,648到2,147,483,647之间的整数值,在某些情况下也可能是2个字节或8个字节,int是一种常用的数据类型,用于表示整数,需要根据具体情况选择合适的数据类型,以确保程序的正确性和性能。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

607

2024.08.29

c++怎么把double转成int
c++怎么把double转成int

本专题整合了 c++ double相关教程,阅读专题下面的文章了解更多详细内容。

314

2025.08.29

C++中int的含义
C++中int的含义

本专题整合了C++中int相关内容,阅读专题下面的文章了解更多详细内容。

235

2025.08.29

c++怎么把double转成int
c++怎么把double转成int

本专题整合了 c++ double相关教程,阅读专题下面的文章了解更多详细内容。

314

2025.08.29

C++中int、float和double的区别
C++中int、float和double的区别

本专题整合了c++中int和double的区别,阅读专题下面的文章了解更多详细内容。

105

2025.10.23

堆和栈的区别
堆和栈的区别

堆和栈的区别:1、内存分配方式不同;2、大小不同;3、数据访问方式不同;4、数据的生命周期。本专题为大家提供堆和栈的区别的相关的文章、下载、课程内容,供大家免费下载体验。

438

2023.07.18

JavaScript浏览器渲染机制与前端性能优化实践
JavaScript浏览器渲染机制与前端性能优化实践

本专题围绕 JavaScript 在浏览器中的执行与渲染机制展开,系统讲解 DOM 构建、CSSOM 解析、重排与重绘原理,以及关键渲染路径优化方法。内容涵盖事件循环机制、异步任务调度、资源加载优化、代码拆分与懒加载等性能优化策略。通过真实前端项目案例,帮助开发者理解浏览器底层工作原理,并掌握提升网页加载速度与交互体验的实用技巧。

59

2026.03.06

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
PostgreSQL 教程
PostgreSQL 教程

共48课时 | 10.4万人学习

Git 教程
Git 教程

共21课时 | 4.1万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号