news 2026/10/7 11:09:24

C++ GoogleTest 常用断言详解:从 EXPECT_EQ 到崩溃检测 EXPECT_DEATH

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
C++ GoogleTest 常用断言详解:从 EXPECT_EQ 到崩溃检测 EXPECT_DEATH

本文通过一个可直接编译运行的 C++17 工程,集中演示 GoogleTest 中常用的布尔、比较、字符串、浮点、异常、谓词、测试夹具和进程终止断言。工程已经在 Windows、Visual Studio 2022 和 GoogleTest 1.15.2 环境下验证,17 个测试全部通过。

一、为什么要分类学习 GoogleTest 断言

很多人第一次接触 GoogleTest,只会写:

EXPECT_EQ(actual,expected);

但真实项目中的故障不只有“两个值不相等”:

  • 一个布尔条件可能不成立。
    • 两个 C 风格字符串内容可能不同。
    • 浮点结果可能存在舍入误差。
    • 函数可能抛出错误类型的异常。
    • 被测代码可能异常终止或主动退出进程。
    • 前置条件失败后,继续执行测试可能导致二次崩溃。
      GoogleTest 为这些场景提供了不同的断言。选择正确的断言,不只是让测试通过或失败,还能让失败报告更准确,并控制失败之后是否继续执行当前测试。

二、工程结构

示例工程名为GTest_Assertions_Showcase,目录如下:

GTest_Assertions_Showcase/ ├── CMakeLists.txt ├── README.md ├── include/ │ └── sample_functions.h ├── src/ │ └── sample_functions.cpp └── tests/ ├── test_basic_assertions.cpp ├── test_death_and_exit.cpp ├── test_exception_assertions.cpp ├── test_fixture.cpp ├── test_floating_point_assertions.cpp ├── test_predicate_assertions.cpp └── test_string_assertions.cpp

测试按类别拆分,便于把每一种断言与适用场景对应起来。

三、断言速查表

类别常用接口
布尔判断EXPECT_TRUE、EXPECT_FALSE
相等与大小关系EXPECT_EQ、EXPECT_NE、EXPECT_LT、EXPECT_LE、EXPECT_GT、EXPECT_GE
C 风格字符串EXPECT_STREQ、EXPECT_STRNE、EXPECT_STRCASEEQ、EXPECT_STRCASENE
浮点数EXPECT_FLOAT_EQ、EXPECT_DOUBLE_EQ、EXPECT_NEAR
异常EXPECT_THROW、EXPECT_ANY_THROW、EXPECT_NO_THROW
自定义谓词EXPECT_PRED1、EXPECT_PRED2
进程终止EXPECT_DEATH、EXPECT_EXIT
测试夹具TEST_F、SetUp、TearDown
显式成功SUCCEED

大部分EXPECT_*都有对应的ASSERT_*版本。

四、EXPECT 与 ASSERT 的本质区别

EXPECT_*和ASSERT_*最重要的区别是失败之后的控制流。

EXPECT:记录失败后继续执行

EXPECT_EQ(actual,expected);// 即使上面的断言失败,当前测试仍会继续向下执行。

它适合相互独立的检查。一次测试可以收集多个失败信息,减少“修一个、跑一次、再发现下一个”的次数。

ASSERT:失败后立即结束当前测试

ASSERT_NE(pointer,nullptr);EXPECT_EQ(*pointer,42);

如果指针为空,第二行解引用就没有继续执行的意义。此时必须使用ASSERT_NE建立前置条件:

TEST(FatalAssertions,StopOnlyTheCurrentTestOnFailure){constintvalue=42;constint*pointer=&value;ASSERT_NE(pointer,nullptr);EXPECT_EQ(*pointer,42);}

需要注意,ASSERT_*只会终止当前测试函数,不会终止整个测试程序。

一个实用原则是:

  • 检查测试前置条件时使用ASSERT_*。
    • 检查可以相互独立报告的结果时使用EXPECT_*。

五、布尔和比较断言

1. 布尔断言

TEST(BooleanAssertions,CheckTrueAndFalse){EXPECT_TRUE(sample::is_even(4));EXPECT_FALSE(sample::is_even(5));}``` 这比写成下面的形式更能表达意图: ```cppEXPECT_EQ(sample::is_even(4),true);

2. 比较断言

TEST(ComparisonAssertions,CheckEqualityAndOrdering){EXPECT_EQ(sample::add(2,3)
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/10/7 11:08:59

switch里能塞表达式吗?全等比较与类型收窄详解

你是不是也曾经在代码里写过这样的逻辑:遇到多状态、多分支的业务场景,顺手就想用一个 switch 来搞定。结果要么是编译报错“表达式必须包含类类型”,要么是线上功能完全不生效,所有分支都静悄悄地走 default ,你翻…

作者头像 李华
网站建设 2026/10/7 11:06:46

Agent-Reach 实战:用 CLI 和 Python 让 AI Agent 触达外部世界

1. 从零认识 Agent-Reach:它到底解决什么问题第一次看到 Agent-Reach 这个名字,很多人会以为是某个新出的 AI 框架或者大模型工具。实际上,把它拆开来看就清楚了:Agent 指的是 AI 智能体,Reach 指的是触达、连接、延伸…

作者头像 李华
网站建设 2026/10/7 11:06:41

PyCharm安装配置避坑指南:从解释器到虚拟环境的完整实践

简介:PyCharm安装教程PDF面向刚接触Python或希望搭建专业IDE开发环境的初学者,系统梳理了PyCharm在Windows、macOS、Linux三大平台上的下载、安装、配置与基础使用流程。内容从官方下载入口入手,区分不同操作系统应选择的安装包类型&#xff…

作者头像 李华
网站建设 2026/10/7 11:06:40

agent-skills 技能库:用 TDD 驱动 AI 编码代理的工程化实践

1. 从"agent-skills"这个标题里能读出什么 第一次看到 agent-skills 这个仓库名,我的直觉是:这不是又一个"提示词大全",而是一套给 AI coding agent 用的 能力封装规范 。事实也确实如此——它把"让 AI 写代码&…

作者头像 李华
网站建设 2026/10/7 11:06:21

agent-skills:为AI Agent打造可插拔技能库的实战指南

agent-skills这个名字,乍一看像是个普通的工具函数集合,但实际上它是给AI Agent做“能力外挂”的脚手架。我在本地试跑了一周,把它接进了一个多工具调用的Demo里,最大的感受是:它把“给模型塞一堆工具JSON”变成了“给…

作者头像 李华
网站建设 2026/10/7 11:05:19

HDFS架构设计与实操:从NameNode到DataNode的分布式存储全解析

写这篇东西之前,先说个老实话:大数据面试也好,团队上手做数仓也好,几乎所有人第一次碰分布式存储,面对的都是同一张HDFS架构图。名字听着大,其实拆开看,它的设计思路非常"朴素"——存…

作者头像 李华