<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>Catch2 on AI</title>
        <link>https://ai.programnotes.cn/tags/catch2/</link>
        <description>Recent content in Catch2 on AI</description>
        <generator>Hugo -- gohugo.io</generator>
        <language>zh-CN</language>
        <lastBuildDate>Sun, 12 Jul 2026 00:00:00 +0000</lastBuildDate><atom:link href="https://ai.programnotes.cn/tags/catch2/index.xml" rel="self" type="application/rss+xml" /><item>
        <title>GitHub Trending 榜首：Catch2</title>
        <link>https://ai.programnotes.cn/p/github-trending-%E6%A6%9C%E9%A6%96catch2/</link>
        <pubDate>Sun, 12 Jul 2026 00:00:00 +0000</pubDate>
        
        <guid>https://ai.programnotes.cn/p/github-trending-%E6%A6%9C%E9%A6%96catch2/</guid>
        <description>&lt;img src="https://ai.programnotes.cn/img/ai/AI.png" alt="Featured image of post GitHub Trending 榜首：Catch2" /&gt;&lt;h2 id=&#34;项目概览&#34;&gt;项目概览
&lt;/h2&gt;&lt;p&gt;Catch2 是 C++ 社区最受欢迎的单元测试框架之一，在 GitHub 上拥有超过 &lt;strong&gt;21,000 Star&lt;/strong&gt; 和 3,400+ Fork。它由 catchorg 维护，采用 Boost Software License 1.0 开源协议，支持 C++14、C++17 及更新标准。&lt;/p&gt;
&lt;p&gt;Catch2 的核心理念是让测试编写变得&lt;strong&gt;简单而自然&lt;/strong&gt;。与其他 C++ 测试框架不同，Catch2 的测试名称不必是合法的 C++ 标识符，断言写法就像普通的布尔表达式一样直观，极大降低了学习和使用门槛。&lt;/p&gt;
&lt;h2 id=&#34;核心特性&#34;&gt;核心特性
&lt;/h2&gt;&lt;h3 id=&#34;1-自然的断言语法&#34;&gt;1. 自然的断言语法
&lt;/h3&gt;&lt;p&gt;Catch2 的断言直接使用 C++ 表达式，无需记忆复杂的断言宏：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;3
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;4
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;5
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;6
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-cpp&#34; data-lang=&#34;cpp&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;TEST_CASE&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;Factorials are computed&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;s&#34;&gt;&amp;#34;[factorial]&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;REQUIRE&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;factorial&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;1&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;==&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;1&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;REQUIRE&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;factorial&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;2&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;==&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;2&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;REQUIRE&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;factorial&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;3&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;==&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;6&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;REQUIRE&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;factorial&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;10&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;==&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;3&amp;#39;628&amp;#39;800&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;&lt;code&gt;REQUIRE&lt;/code&gt; 宏直接接受一个布尔表达式，失败时会自动展开左右值，打印出清晰的错误信息。&lt;/p&gt;
&lt;h3 id=&#34;2-内置微基准测试&#34;&gt;2. 内置微基准测试
&lt;/h3&gt;&lt;p&gt;除了单元测试，Catch2 还内置了轻量级基准测试功能：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;3
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;4
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;5
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;6
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;7
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;8
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-cpp&#34; data-lang=&#34;cpp&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;TEST_CASE&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;Benchmark Fibonacci&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;s&#34;&gt;&amp;#34;[!benchmark]&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;BENCHMARK&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;fibonacci 20&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;k&#34;&gt;return&lt;/span&gt; &lt;span class=&#34;nf&#34;&gt;fibonacci&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;20&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;p&#34;&gt;};&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;BENCHMARK&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;fibonacci 25&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;k&#34;&gt;return&lt;/span&gt; &lt;span class=&#34;nf&#34;&gt;fibonacci&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;25&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;p&#34;&gt;};&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;基准测试默认不执行，需要通过 &lt;code&gt;[!benchmark]&lt;/code&gt; 标签显式触发，避免影响常规测试速度。&lt;/p&gt;
&lt;h3 id=&#34;3-section-机制&#34;&gt;3. Section 机制
&lt;/h3&gt;&lt;p&gt;Catch2 的 Section 机制提供了一种优雅的方式在测试间共享 setup 和 teardown 代码，无需手写 fixture 类。&lt;/p&gt;
&lt;h3 id=&#34;4-零依赖&#34;&gt;4. 零依赖
&lt;/h3&gt;&lt;p&gt;Catch2 不依赖任何第三方库，只需引入头文件即可使用（v2 为单头文件，v3 变为多文件库结构）。&lt;/p&gt;
&lt;h2 id=&#34;catch2-v3-的变化&#34;&gt;Catch2 v3 的变化
&lt;/h2&gt;&lt;p&gt;Catch2 v3 是一个重大更新，最主要的改变是从&lt;strong&gt;单头文件库&lt;/strong&gt;转变为&lt;strong&gt;标准的多文件库&lt;/strong&gt;结构。这意味着：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;多个头文件 + 单独编译的实现文件&lt;/li&gt;
&lt;li&gt;更好的编译性能和模块化管理&lt;/li&gt;
&lt;li&gt;需要调整 CMake 集成方式&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;官方提供了详细的 v2 到 v3 迁移指南，覆盖了大部分常见的迁移问题。&lt;/p&gt;
&lt;h2 id=&#34;为什么-catch2-如此受欢迎&#34;&gt;为什么 Catch2 如此受欢迎？
&lt;/h2&gt;&lt;p&gt;在 C++ 测试框架领域，Catch2 凭借&lt;strong&gt;零学习曲线&lt;/strong&gt;的断言写法、&lt;strong&gt;无冗余代码&lt;/strong&gt;的测试结构、以及&lt;strong&gt;开箱即用&lt;/strong&gt;的体验，赢得了大量开发者的青睐。它既适合快速原型开发中的简单测试，也能胜任大型项目的完整测试套件。&lt;/p&gt;
&lt;p&gt;无论是 TDD（测试驱动开发）还是 BDD（行为驱动开发），Catch2 都提供了恰到好处的支持。&lt;/p&gt;
&lt;hr&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;GitHub 地址&lt;/strong&gt;：&lt;a class=&#34;link&#34; href=&#34;https://github.com/catchorg/Catch2&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;catchorg/Catch2&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Star 数&lt;/strong&gt;：21,226&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;主要语言&lt;/strong&gt;：C++&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;许可证&lt;/strong&gt;：Boost Software License 1.0&lt;/li&gt;
&lt;/ul&gt;
</description>
        </item>
        
    </channel>
</rss>
