当前位置: 首页 > article >正文

010-Catch2

Catch2

一、框架简介

Catch2 是一个基于 C++ 的现代化单元测试框架,支持 TDD(测试驱动开发)和 BDD(行为驱动开发)模式。其核心优势在于:

  • 单头文件设计:v2.x 版本仅需包含 catch.hpp 即可使用
  • 自然语法:测试用例命名支持自由格式字符串,断言使用标准 C++ 运算符
  • 零外部依赖:仅需 C++11 及以上标准库支持
  • 多维度覆盖:支持异常测试、基准测试、Matchers 匹配器等高级功能

官方网站Catch2

二、环境配置

# CMake 集成示例(v2.x 版本)
cmake_minimum_required(VERSION 3.10)
project(Catch2_Demo)# 下载 Catch2 单头文件 
include(FetchContent)
FetchContent_Declare(Catch2URL https://github.com/catchorg/Catch2/releases/download/v3.8.0/catch_amalgamated.hpp  
)
FetchContent_MakeAvailable(Catch2)add_executable(tests src/main.cpp  src/tests.cpp  
)
target_include_directories(tests PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/include)

三、核心功能实现

  1. 基础测试结构
// tests.cpp  
#define CATCH_CONFIG_MAIN 
#include <catch.hpp> int factorial(int n) {if(n <= 0) return 1;return n * factorial(n - 1);
}TEST_CASE("阶乘基础测试", "[math][factorial]") {SECTION("正整数值验证") {REQUIRE(factorial(5) == 120);CHECK(factorial(6) == 720);  // 非致命断言 }SECTION("边界条件验证") {REQUIRE(factorial(0) == 1);REQUIRE(factorial(-1) == 1);}
}
  1. BDD 风格测试
SCENARIO("用户登录流程验证", "[auth][bdd]") {GIVEN("已注册用户凭证") {std::string username = "test_user";std::string password = "P@ssw0rd";WHEN("输入正确密码") {bool result = authenticate(username, password);THEN("应返回认证成功") {REQUIRE(result == true);}}WHEN("输入错误密码") {bool result = authenticate(username, "wrong_pass");THEN("应返回认证失败") {REQUIRE_FALSE(result);}}}
}
  1. 高级验证功能
// 异常测试 
TEST_CASE("异常处理验证", "[exceptions]") {REQUIRE_THROWS_AS(throw std::runtime_error("错误"), std::runtime_error);CHECK_THROWS_WITH(throw "Error!", Catch::Contains("Error"));
}// 浮点近似比较 
TEST_CASE("精度计算验证", "[math][approx]") {double pi = 3.14159265359;REQUIRE(pi == Approx(3.14159).epsilon(0.0001));
}// Matchers 匹配器
TEST_CASE("字符串验证", "[strings]") {using namespace Catch::Matchers;std::string url = "https://api.example.com/v1"; REQUIRE_THAT(url, StartsWith("https") && EndsWith("v1") && Contains("example"));
}
  1. 基准测试
TEST_CASE("性能基准测试", "[!benchmark]") {BENCHMARK("向量插入 1000 元素") {std::vector<int> v;for(int i = 0; i < 1000; ++i) {v.push_back(i); }};
}

四、进阶使用技巧

  • 测试过滤:通过标签执行特定测试
./tests "[math]"          # 执行所有数学测试 
./tests "~[slow]"         # 排除标记为 slow 的测试 
  • 自定义 Main 函数(需配置 CATCH_CONFIG_RUNNER):
int main(int argc, char* argv[]) {Catch::Session session;// 添加全局配置 session.configData().showDurations  = Catch::ShowDurations::Always;return session.run(argc,  argv);
}
  • 参数化测试:
TEST_CASE_METHOD(TestFixture, "参数化测试", "[params]") {auto [input, expected] = GENERATE(std::make_tuple(2, 4),std::make_tuple(3, 9),std::make_tuple(5, 25));REQUIRE(square(input) == expected);
}

五、最佳实践建议

  • 测试组织结构:
tests/
├── unit/        # 单元测试 
├── integration/ # 集成测试 
└── benchmark/   # 性能测试 
  • CI/CD 集成:
# GitHub Actions 示例 
jobs:test:runs-on: ubuntu-latest steps:- uses: actions/checkout@v2- run: |mkdir build cd build cmake ..make ./tests -r compact 

完整代码

Github

作者郑天佐
邮箱zhengtianzuo06@163.com
主页http://www.zhengtianzuo.com
githubhttps://github.com/zhengtianzuo

相关文章:

010-Catch2

Catch2 一、框架简介 Catch2 是一个基于 C 的现代化单元测试框架&#xff0c;支持 TDD&#xff08;测试驱动开发&#xff09;和 BDD&#xff08;行为驱动开发&#xff09;模式。其核心优势在于&#xff1a; 单头文件设计&#xff1a;v2.x 版本仅需包含 catch.hpp 即可使用自然…...

TypeScript类:面向对象编程的基石

一、从现实世界到代码世界 想象你要建造一栋房子&#xff0c;首先需要一张设计蓝图——它定义了房屋的结构&#xff08;几个房间&#xff09;、功能&#xff08;卧室/厨房&#xff09;和特性&#xff08;材料/颜色&#xff09;。在TypeScript中&#xff0c;class就是这个设计蓝…...

Bad owner or permissions on ssh/config - 解决方案

问题 在Windows系统通过ssh连接远程服务器时报错&#xff1a; ssh [ssh_user][ip] Bad owner or permissions on C:\\Users\\[win_user]/.ssh/config原因 这是因为.ssh文件夹或.ssh/config文件的权限异常&#xff0c;当前Windows账号没有读写权限导致的。 Windows系统重装&a…...

C++之序列容器(vector,list,dueqe)

1.大体对比 在软件开发的漫长历程中&#xff0c;数据结构与算法始终占据着核心地位&#xff0c;犹如大厦的基石&#xff0c;稳固支撑着整个程序的运行。在众多编程语言中&#xff0c;数据的存储与管理方式各有千秋&#xff0c;而 C 凭借其丰富且强大的工具集脱颖而出&#xff…...

安卓Android与iOS设备管理对比:企业选择指南

目录 一、管理方式差异 Android Enterprise方案包含三种典型模式&#xff1a; Apple MDM方案主要提供两种模式&#xff1a; 二、安全防护能力 Android系统特点&#xff1a; 三、应用管理方案 四、设备选择建议 五、典型场景推荐 需求场景 推荐方案 六、决策建议要点…...

git本地仓库链接远程仓库

重命名本地分支为main 如果你希望本地分支名称与远程分支名称保持一致&#xff0c;可以考虑将本地的master分支重命名为main。这可以通过以下命令完成&#xff1a; 在连接之前要先提交 git add . git commit -m "init" 强制推送到远程 git push -f origin main 首…...

版本控制器Git(1)

文章目录 前言一、初识Git问题引入解决方案注意事项 二、Git安装三、Git配置与基本操作Git创建Git配置用户名称和地址认识工作区、暂存区、版本库添加文件到仓库添加文件到暂存区提交暂存区内容到本地仓库 查看提交历史 四、Git 暂存区、HEAD、对象库及文件Git内部结构概览查看…...

推理模型对SQL理解能力的评测:DeepSeek r1、GPT-4o、Kimi k1.5和Claude 3.7 Sonnet

引言 随着大型语言模型&#xff08;LLMs&#xff09;在技术领域的应用日益广泛&#xff0c;评估这些模型在特定技术任务上的能力变得越来越重要。本研究聚焦于四款领先的推理模型——DeepSeek r1、GPT-4o、Kimi k1.5和Claude 3.7 Sonnet在SQL理解与分析方面的能力&#xff0c;…...

[动手学习深度学习]12.权重衰退

1.介绍 权重衰退是常见的处理过拟合的方法 控制模型容量方法 把模型控制的比较小&#xff0c;即里面参数比较少使参数选择范围小 约束就是正则项 每个特征的权重都大会导致模型复杂&#xff0c;从而导致过拟合。 控制权重矩阵范数可以使得减少一些特征的权重&#xff0c;甚至…...

JavaEE_多线程(二)

目录 1. 线程的状态2. 线程安全2.1 线程不安全问题的原因 3. 线程安全中的部分概念3.1 原子性3.2 可见性3.3 指令重排序 4. 解决线程安全问题4.1 synchronized关键字4.1.1 可重入4.1.2 synchronized使用 4.2 volatile关键字4.2.1 volatile使用 5. wait和notify5.1 wait()方法5.…...

【unity小技巧】分享vscode如何进行unity开发,且如何开启unity断点调试模式,并进行unity断点调试(2025年最新的方法,实测有效)

文章目录 前言一、前置条件1、已安装Visual Studio Code&#xff0c;并且unity首选项>外部工具>外部脚本编辑器选择为Visual Studio Code [版本号]&#xff0c;2、在Visual Studio Code扩展中搜索Unity&#xff0c;并安装3、同时注意这个插件下面的描述&#xff0c;需要根…...

【Hadoop】详解HDFS

Hadoop 分布式文件系统(HDFS)被设计成适合运行在通用硬件上的分布式文件系统&#xff0c;它是一个高度容错性的系统&#xff0c;适合部署在廉价的机器上&#xff0c;能够提供高吞吐量的数据访问&#xff0c;非常适合大规模数据集上的应用。为了做到可靠性&#xff0c;HDFS创建了…...

Spring(4)——响应相关

一、返回静态页面 1.1**RestController和Controller** 想返回如下页面&#xff1a; 如果我们依旧使用原来的**RestController** 可以看到的是仅仅返回了字符串。 此时将**RestController改为Controller** 可以看到这次返回的是html页面。 那么**RestController和Controller…...

axure11安装教程包含下载、安装、汉化、授权(附安装包)图文详细教程

文章目录 前言一、axure11安装包下载二、axure11安装教程1.启动安装程序2.安装向导界面3.安装协议协议页面2.选择安装位置3.开始安装4.完成安装 三、axure11汉化教程1.axure11汉化包2.axure11汉化设置 四、axure11授权教程1.打开axure112.设置使用方式3.输入许可证号4.axure11安…...

如何注册海外社媒平台账号

在数字贸易时代&#xff0c;社媒平台已成为外贸企业触达全球客户的战略要地。数据显示&#xff0c;2023年全球B2B采购决策者中&#xff0c;87%通过社媒渠道完成供应商初筛。本文深度解析主流平台的运营规则与技术方案&#xff0c;构建覆盖获客转化全链路的数字化营销体系。 一…...

Python IO编程-序列化

目录 JSON JSON进阶 练习 在程序运行的过程中&#xff0c;所有的变量都是在内存中&#xff0c;比如&#xff0c;定义一个dict&#xff1a; d dict(nameBob, age20, score88)可以随时修改变量&#xff0c;比如把name改成Bill&#xff0c;但是一旦程序结束&#xff0c;变量所…...

Redis-缓存穿透击穿雪崩

1. 穿透问题 缓存穿透问题就是查询不存在的数据。在缓存穿透中&#xff0c;先查缓存&#xff0c;缓存没有数据&#xff0c;就会请求到数据库上&#xff0c;导致数据库压力剧增。 解决方法&#xff1a; 给不存在的key加上空值&#xff0c;防止每次都会请求到数据库。布隆过滤器…...

Windows server网络安全

摘要 安全策略 IP安全策略&#xff0c;简单的来说就是可以通过做相应的策略来达到放行、阻止相关的端口&#xff1b;放行、阻止相关的IP&#xff0c;如何做安全策略&#xff0c;小编为大家详细的写了相关的步骤&#xff1a; 解说步骤&#xff1a; 阻止所有&#xff1a; 打…...

代理(Delegate)、闭包(Closure)、Notification(通知中心) 和 swift_event_bus适用场景和工作方式

在 Swift 开发中&#xff0c;在 Swift 开发中&#xff0c;代理&#xff08;Delegate&#xff09;、闭包&#xff08;Closure&#xff09;、Notification&#xff08;通知中心&#xff09; 和 swift_event_bus 主要用于 组件之间的通信&#xff0c;但它们的适用场景和工作方式有…...

Python从入门到精通1:FastAPI

引言 在现代 Web 开发中&#xff0c;API 是前后端分离架构的核心。FastAPI 凭借其高性能、简洁的语法和自动文档生成功能&#xff0c;成为 Python 开发者的首选框架。本文将从零开始&#xff0c;详细讲解 FastAPI 的核心概念、安装配置、路由设计、请求处理以及实际应用案例&a…...

使用 crontab 定时同步服务器文件到本地

https://www.dong-blog.fun/post/1987 1. 安装 sshpass sshpass 是一个可以自动输入密码的工具。如果未安装&#xff0c;运行以下命令安装&#xff1a; • 对于 Debian/Ubuntu 系统&#xff1a; apt update && apt install sshpass• 对于 CentOS/RHEL 系统&#xf…...

Leetcode做题记录----2

1、两数之和 思路&#xff1a; 1、不能使用相同元素&#xff0c;可以想到哈希表&#xff0c;&#xff0c;C#中可以通过字典建立当前值和下标的关系 2、显然&#xff0c;依次判断数组中的每个数即可 3、定义other target - num[ i ] 这个other就是我们用于在字典中进行寻找…...

批量合并 Word 文档,支持合并成一个 Word,也支持按文件夹合并

我们经常会碰到需要将多个 Word 文档批量合并成一个 Word 文档的场景&#xff0c;比如需要合并后打印、合并后方便整理存档等等。如果是人工的操作&#xff0c;会非常的麻烦。因此我们通常会借助一些批量处理脚本或者寻找批量处理的工具来帮我们实现批量合并 Word 文档的操作。…...

项目实操分享:一个基于 Flask 的音乐生成系统,能够根据用户指定的参数自动生成 MIDI 音乐并转换为音频文件

在线体验音乐创作&#xff1a;AI Music Creator - AI Music Creator 体验者账号密码admin/admin123 系统架构 1.1 核心组件 MusicGenerator 类 负责音乐生成的核心逻辑 包含 MIDI 生成和音频转换功能 管理音乐参数和音轨生成 FluidSynth 集成 用于 MIDI 到音频的转换 …...

神经网络为什么要用 ReLU 增加非线性?

在神经网络中使用 ReLU&#xff08;Rectified Linear Unit&#xff09; 作为激活函数的主要目的是引入非线性&#xff0c;这是神经网络能够学习复杂模式和解决非线性问题的关键。 1. 为什么需要非线性&#xff1f; 1.1 线性模型的局限性 如果神经网络只使用线性激活函数&…...

RK3568平台(音频篇)AD82584F功放

一.AD82584 功放芯片简介 AD82584 是 Analog Devices 公司推出的一款高性能、多通道音频功率放大器芯片。 它专为汽车音响系统、家庭影院和其他需要高质量音频放大的应用而设计。以下是关于 AD82584 的详细介绍。 Analog Devices 官方网站:https://www.analog.com AD82584…...

动态规划详解(二):从暴力递归到动态规划的完整优化之路

目录 一、什么是动态规划&#xff1f;—— 从人类直觉到算法思维 二、暴力递归&#xff1a;最直观的问题分解方式 1. 示例&#xff1a;斐波那契数列 2. 递归树分析&#xff08;以n5为例&#xff09; 3. 问题暴露 三、第一次优化&#xff1a;记忆化搜索&#xff08;Memoiza…...

ubuntu下在pycharm中配置已有的虚拟环境

作者使用的ubuntu系统位于PC机上的虚拟机。系统版本为&#xff1a; 在配置pycharm解释器之前你需要先创建虚拟环境以及安装pycharm。 作者创建的虚拟环境位于/home/topeet/miniconda3/envs/airproject/&#xff0c;如下图所示&#xff1a; 作者安装的pycharm版本为2023社区…...

虚幻基础:动画层接口

文章目录 动画层&#xff1a;动画图表中的函数接口&#xff1a;名字&#xff0c;没有实现。动画层接口&#xff1a;由动画蓝图实现1.动画层可直接调用实现功能2.动画层接口必须安装3.动画层默认使用本身实现4.动画层也可使用其他动画蓝图实现&#xff0c;但必须在角色蓝图中关联…...

deepseek R1提供的3d迷宫设计方案

一、技术选型方案 核心渲染技术 &#x1f3a8; 采用Raycasting算法模拟3D透视效果使用Canvas 2D上下文进行逐像素绘制材质贴图系统实现墙面差异化表现 迷宫数据结构 &#x1f5fa;️ 二维数组存储迷宫布局&#xff08;0:通路&#xff0c;1:墙体&#xff09;递归回溯算法生成随…...