0

0

C++单元测试异常 预期异常测试技巧

P粉602998670

P粉602998670

发布时间:2025-08-28 11:26:01

|

978人浏览过

|

来源于php中文网

原创

答案:使用Google Test框架可通过EXPECT_THROW、EXPECT_NO_THROW和EXPECT_ANY_THROW宏测试C++异常,确保代码在错误条件下正确抛出指定异常,结合try-catch可验证异常消息内容,提升程序健壮性。

c++单元测试异常 预期异常测试技巧

在C++单元测试中,验证代码是否正确抛出异常是确保程序健壮性的重要环节。很多开发者在写测试时只关注正常流程,忽略了对异常路径的覆盖。合理的异常测试不仅能发现潜在的逻辑错误,还能防止程序在异常情况下崩溃。

使用Google Test测试预期异常

Google Test(gtest)是C++中广泛使用的测试框架,虽然它本身不直接支持“期望抛出异常”的断言,但可以通过宏来实现:

  • EXPECT_THROW(statement, exception_type):验证某语句是否抛出指定类型的异常
  • EXPECT_NO_THROW(statement):验证某语句不抛出任何异常
  • EXPECT_ANY_THROW(statement):验证某语句抛出任意异常

例如,假设有一个函数在输入负数时会抛出 std::invalid_argument

EXPECT_THROW(divide(10, 0), std::invalid_argument);
EXPECT_NO_THROW(divide(10, 2));

这样可以确保边界条件被正确处理。

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

自定义异常类型与层级匹配

如果使用自定义异常类,建议继承标准异常类型,便于测试和统一管理:

class negative_input_error : public std::runtime_error {
public:
  explicit negative_input_error(const std::string& msg)
    : std::runtime_error(msg) {}
};

测试时,要确保异常类型精确匹配:

Copilot
Copilot

Copilot是由微软公司开发的一款AI生产力工具,旨在通过先进的人工智能技术,帮助用户快速完成各种任务,提升工作效率。

下载
EXPECT_THROW(process_value(-5), negative_input_error);

注意:基类无法捕获派生类异常的测试断言,除非你明确希望测试基类行为。

测试异常消息内容

有时不仅要验证异常类型,还要检查错误消息是否清晰。Google Test不提供直接断言异常消息的宏,但可以用 ASSERT_THROW 结合 try-catch 实现:

try {
  some_function(-1);
  FAIL() } catch (const std::invalid_argument& e) {
  EXPECT_STREQ(e.what(), "Input must be positive");
}

这种方式更灵活,适合需要验证异常细节的场景。

避免常见陷阱

异常测试容易出错,注意以下几点:

  • 确保被测函数确实会抛异常,不要测试“可能抛”的语句
  • 避免在异常测试中包含多余操作,以免干扰断言结果
  • 使用 ASSERT_NO_FATAL_FAILURE 控制测试流程
  • 在多线程环境中,异常可能无法被捕获,需格外小心

基本上就这些。异常测试虽小,但能显著提升代码可靠性。写测试时多考虑“出错时怎么办”,比只测“一切顺利”更有价值。

相关专题

更多
string转int
string转int

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

312

2023.08.02

c语言const用法
c语言const用法

const是关键字,可以用于声明常量、函数参数中的const修饰符、const修饰函数返回值、const修饰指针。详细介绍:1、声明常量,const关键字可用于声明常量,常量的值在程序运行期间不可修改,常量可以是基本数据类型,如整数、浮点数、字符等,也可是自定义的数据类型;2、函数参数中的const修饰符,const关键字可用于函数的参数中,表示该参数在函数内部不可修改等等。

519

2023.09.20

class在c语言中的意思
class在c语言中的意思

在C语言中,"class" 是一个关键字,用于定义一个类。想了解更多class的相关内容,可以阅读本专题下面的文章。

455

2024.01.03

python中class的含义
python中class的含义

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

6

2025.12.06

线程和进程的区别
线程和进程的区别

线程和进程的区别:线程是进程的一部分,用于实现并发和并行操作,而线程共享进程的资源,通信更方便快捷,切换开销较小。本专题为大家提供线程和进程区别相关的各种文章、以及下载和课程。

467

2023.08.10

Python 多线程与异步编程实战
Python 多线程与异步编程实战

本专题系统讲解 Python 多线程与异步编程的核心概念与实战技巧,包括 threading 模块基础、线程同步机制、GIL 原理、asyncio 异步任务管理、协程与事件循环、任务调度与异常处理。通过实战示例,帮助学习者掌握 如何构建高性能、多任务并发的 Python 应用。

84

2025.12.24

点击input框没有光标怎么办
点击input框没有光标怎么办

点击input框没有光标的解决办法:1、确认输入框焦点;2、清除浏览器缓存;3、更新浏览器;4、使用JavaScript;5、检查硬件设备;6、检查输入框属性;7、调试JavaScript代码;8、检查页面其他元素;9、考虑浏览器兼容性。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

180

2023.11.24

excel制作动态图表教程
excel制作动态图表教程

本专题整合了excel制作动态图表相关教程,阅读专题下面的文章了解更多详细教程。

24

2025.12.29

freeok看剧入口合集
freeok看剧入口合集

本专题整合了freeok看剧入口网址,阅读下面的文章了解更多网址。

74

2025.12.29

热门下载

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

精品课程

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

共32课时 | 3.1万人学习

Go语言实战之 GraphQL
Go语言实战之 GraphQL

共10课时 | 0.8万人学习

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

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