讲师中心 微信公众号
AI工具推荐 视频效率加速

C++怎么做单元测试 C++中Catch2框架快速入门【技巧】

雨涛吖_9719

雨涛吖_9719

发布时间:2026-03-11 17:12:10

|

718人浏览过

|

来源于php中文网

原创

Catch2 是头文件库,下载 catch2/catch_all.hpp 并 #include;多测试文件时仅一个定义 CATCH_CONFIG_MAIN;TEST_CASE 为宏不可嵌套;REQUIRE 失败终止,CHECK 继续执行;CI 需 --no-color、--reporter junit 等参数;断言宏单次求值防副作用。

c++怎么做单元测试 c++中catch2框架快速入门【技巧】

怎么在 C++ 项目里加 Catch2 测试

直接把 Catch2 加进项目,不是装个库就完事——它没编译期依赖,也不需要链接静态库,本质是个「头文件即库」的方案。最轻量的做法是下载单头文件 catch2/catch_all.hpp 放进项目目录(比如 test/include/),然后写测试文件 #include 它就行。

常见错误现象:编译报 undefined reference to 'main'——因为 Catch2 默认自己提供 main(),但你如果已有 main(),就得关掉它:

  • 定义宏 CATCH_CONFIG_RUNNER 再 #include,自己写 main() 并调用 Catch::Session().run(argc, argv)
  • 或者更简单:只在**唯一一个测试文件**里定义 CATCH_CONFIG_MAIN,其他测试文件只 #include 不定义宏
  • 别在多个 .cpp 里都定义 CATCH_CONFIG_MAIN,否则链接重复 main

Catch2 的 TEST_CASE 怎么写才不踩坑

TEST_CASE 是最常用入口,但它不是函数,而是宏展开成匿名 lambda + 注册逻辑。这意味着:

  • 不能在函数内嵌套写 TEST_CASE;也不能把它当普通作用域用——变量不自动销毁,多次运行时状态可能残留
  • 想隔离状态?用 SECTION 或拆成多个 TEST_CASE,别靠缩进或花括号“假装”作用域
  • 参数化测试别硬写循环,用 TEMPLATE_TEST_CASE 或 TEST_CASE_METHOD 配合 fixture,否则断言失败时堆栈难定位
  • REQUIRE 和 CHECK 区别很关键:REQUIRE 失败直接跳出当前测试用例;CHECK 记录失败继续跑,适合检查多个不强相关的点

示例(正确用法):

C++ 算法竞赛自动化测试数据生成与校验框架
C++ 算法竞赛自动化测试数据生成与校验框架

根据原题生成新题面、验证器及完整测试数据,自动套用 testlib 模板,用于用户要求生成测试数据时。

下载

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

TEST_CASE("vector size after push") {
    std::vector<int> v;
    v.push_back(42);
    REQUIRE(v.size() == 1); // 推荐:核心前提必须成立
    CHECK(v[0] == 42);      // 补充检查,不影响后续断言
}

CI 里跑 Catch2 测试总失败?看这几个配置点

Catch2 默认输出是彩色控制台文本,CI 环境常禁用颜色、限制超时、要求 XML 报告——这些全靠命令行参数控制,不是改代码。

  • 关颜色:--no-color,否则某些 CI 日志解析器会把 ANSI 转义符当乱码报错
  • 生成 JUnit 兼容 XML:--reporter junit --out test-report.xml,注意 --out 必须紧跟 --reporter 后面,顺序错就无效
  • 避免卡死:加 --timeout 30(单位秒),Catch2 会为每个 TEST_CASE 单独设超时
  • 过滤运行:用 -t "network" 只跑打了 [network] 标签的用例,配合 TEST_CASE("http client", "[network]")

为什么 assert 里用 REQUIRE 而不是 if + std::abort

因为 REQUIRE 不只是终止,它会捕获表达式字符串、文件名、行号、实际值和期望值——这些信息在调试时比 std::abort() 强太多。

  • 写 if (!ptr) std::abort();:崩溃了,但不知道 ptr 是啥、哪一行、为什么空
  • 写 REQUIRE(ptr != nullptr);:输出类似 FAILED: ptr != nullptr,附带文件、行号、ptr 的实际地址
  • 自定义类型要支持打印?重载 operator<< 到 std::ostream&,Catch2 会自动用它格式化值
  • 性能影响极小:宏在编译期展开,失败时才有额外字符串拼接开销,日常开发完全可忽略

真正容易被忽略的是:Catch2 的断言宏对表达式求值**仅一次**,而手写 if (exp) abort() 如果 exp 有副作用(比如 func()),重复求值会导致行为不一致——这点连老手都偶尔翻车。

热门AI工具

更多
讯飞绘文

讯飞绘文是一款由科大讯飞推出的一站式 AIGC 内容运营平台。

讯飞智作

讯飞智作是一款AI视频创作工具,AI文本配音工具,数字人课程、营销视频制作。

火山引擎

火山引擎是一款面向企业的云计算与AI服务平台。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

Seko
Seko Hot

一款AI视频创作工具,主要用于商汤科技推出的创编一体的AI短视频创作Agent,适合需要提升相关任务效率的用户。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

SkildArt
SkildArt Hot

SkildArt是一款AI文本写作工具,一站式 AI 视觉创作平台。

VibeKnow
VibeKnow Hot

一款AI视频创作工具,主要用于全球首个AI知识视频创作平台,文档、文章、网页,一键生成视频,适合需要提升相关任务效率的用户。

相关专题

更多
软件测试常用工具
软件测试常用工具

软件测试常用工具有Selenium、JUnit、Appium、JMeter、LoadRunner、Postman、TestNG、LoadUI、SoapUI、Cucumber和Robot Framework等等。测试人员可以根据具体的测试需求和技术栈选择适合的工具,提高测试效率和准确性 。

4030

2023.10.13

java测试工具有哪些
java测试工具有哪些

java测试工具有JUnit、TestNG、Mockito、Selenium、Apache JMeter和Cucumber。php还给大家带来了java有关的教程,欢迎大家前来学习阅读,希望对大家能有所帮助。

2481

2023.10.23

Java 单元测试
Java 单元测试

本专题聚焦 Java 在软件测试与持续集成流程中的实战应用,系统讲解 JUnit 单元测试框架、Mock 数据、集成测试、代码覆盖率分析、Maven 测试配置、CI/CD 流水线搭建(Jenkins、GitHub Actions)等关键内容。通过实战案例(如企业级项目自动化测试、持续交付流程搭建),帮助学习者掌握 Java 项目质量保障与自动化交付的完整体系。

946

2025.10.24

require的用法
require的用法

require的用法有引入模块、导入类或方法、执行特定任务。想了解更多require的相关内容,可以阅读本专题下面的文章。

1935

2023.11.27

session失效的原因
session失效的原因

session失效的原因有会话超时、会话数量限制、会话完整性检查、服务器重启、浏览器或设备问题等等。详细介绍:1、会话超时:服务器为Session设置了一个默认的超时时间,当用户在一段时间内没有与服务器交互时,Session将自动失效;2、会话数量限制:服务器为每个用户的Session数量设置了一个限制,当用户创建的Session数量超过这个限制时,最新的会覆盖最早的等等。

580

2023.10.17

session失效解决方法
session失效解决方法

session失效通常是由于 session 的生存时间过期或者服务器关闭导致的。其解决办法:1、延长session的生存时间;2、使用持久化存储;3、使用cookie;4、异步更新session;5、使用会话管理中间件。

856

2023.10.18

cookie与session的区别
cookie与session的区别

本专题整合了cookie与session的区别和使用方法等相关内容,阅读专题下面的文章了解更详细的内容。

1766

2025.08.19

pdf怎么转换成xml格式
pdf怎么转换成xml格式

将 pdf 转换为 xml 的方法:1. 使用在线转换器;2. 使用桌面软件(如 adobe acrobat、itext);3. 使用命令行工具(如 pdftoxml)。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

3984

2024.04.01

Buffalo框架数据库开发全教程
Buffalo框架数据库开发全教程

本专题围绕Buffalo框架数据库开发,讲解database.yml多环境配置、soda与fizz迁移生成回滚、模型结构体标签、增删改查与条件查询、一对多与多对多关联、数据校验、回调钩子、事务处理及原生SQL执行能力。

60

2026.09.23

热门下载

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

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Conan 2 Essentials 免费课程
Conan 2 Essentials 免费课程

共0课时 | 0人学习

CMake 与 Conan 集成实践
CMake 与 Conan 集成实践

共0课时 | 0人学习

Conan 2 高级依赖模型介绍
Conan 2 高级依赖模型介绍

共0课时 | 0人学习

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

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn