010-Catch2

news2025/3/13 3:31:32

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(
  Catch2
  URL 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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2314058.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

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

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

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

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

版本控制器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安…

Redis-缓存穿透击穿雪崩

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

Windows server网络安全

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

Python从入门到精通1:FastAPI

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

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 线性模型的局限性 如果神经网络只使用线性激活函数&…

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

目录 一、什么是动态规划&#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社区…

爬虫中一些有用的用法

文本和标签在一个级别下 如果文本和a标签在一个级别下 比如&#xff1a; # 获取a标签后的第一个文本节点text_node a.xpath(following-sibling::text()[1])[0].strip() 将xpath的html代码转换成字符串 etree.tostring(root, pretty_printTrue, encoding"utf-8")…