跳转到内容
主菜单
主菜单
移至侧栏
隐藏
导航
首页
最近更改
随机页面
MediaWiki帮助
代码酷
搜索
搜索
中文(中国大陆)
外观
创建账号
登录
个人工具
创建账号
登录
未登录编辑者的页面
了解详情
贡献
讨论
编辑“︁
C++ Catch2
”︁(章节)
页面
讨论
大陆简体
阅读
编辑
编辑源代码
查看历史
工具
工具
移至侧栏
隐藏
操作
阅读
编辑
编辑源代码
查看历史
常规
链入页面
相关更改
特殊页面
页面信息
外观
移至侧栏
隐藏
您的更改会在有权核准的用户核准后向读者展示。
警告:
您没有登录。如果您进行任何编辑,您的IP地址会公开展示。如果您
登录
或
创建账号
,您的编辑会以您的用户名署名,此外还有其他益处。
反垃圾检查。
不要
加入这个!
= C++ Catch2 单元测试框架 = == 简介 == '''Catch2''' 是一个现代、轻量级的 C++ 单元测试框架,以其简洁的语法和强大的功能著称。它采用纯头文件设计,无需预编译,支持 BDD(行为驱动开发)风格和传统单元测试风格,是 C++11 及以上版本项目的理想测试工具。 主要特点: * 零外部依赖,仅需单个头文件 * 测试用例自动注册 * 支持标签化测试组织和过滤 * 提供丰富的断言宏 * 可输出多种格式的测试报告 == 安装与配置 == === 获取 Catch2 === 从 [https://github.com/catchorg/Catch2 GitHub] 下载最新版本的 <code>catch.hpp</code>,或通过包管理器安装: <syntaxhighlight lang="bash"> # 使用 vcpkg vcpkg install catch2 # 使用 conan conan install catch2/2.13.7 </syntaxhighlight> === 基本项目集成 === 最简单的使用方式是将 <code>catch.hpp</code> 包含到测试文件中: <syntaxhighlight lang="cpp"> #define CATCH_CONFIG_MAIN // 生成 main() #include "catch.hpp" </syntaxhighlight> == 核心概念 == === 测试用例 === 基本测试用例结构: <syntaxhighlight lang="cpp"> TEST_CASE("测试描述", "[标签1][标签2]") { // 测试代码 REQUIRE(expression); // 断言 } </syntaxhighlight> === 断言宏 === Catch2 提供多种断言风格: {| class="wikitable" |+ 主要断言宏 ! 类型 !! 宏 !! 说明 | 要求断言 || <code>REQUIRE(expr)</code> || 失败时终止测试用例 | 检查断言 || <code>CHECK(expr)</code> || 失败时继续执行 | 浮点比较 || <code>REQUIRE(1.0 == Approx(0.999).epsilon(0.01))</code> || 带容差的浮点比较 | 异常检查 || <code>REQUIRE_THROWS(expr)</code> || 验证是否抛出异常 |} == 实际示例 == === 示例1:字符串处理测试 === 测试字符串反转函数: <syntaxhighlight lang="cpp"> #include <string> #include <algorithm> std::string reverse_string(const std::string& str) { std::string result(str); std::reverse(result.begin(), result.end()); return result; } TEST_CASE("字符串反转", "[string][algorithm]") { SECTION("基本反转") { REQUIRE(reverse_string("hello") == "olleh"); REQUIRE(reverse_string("") == ""); } SECTION("Unicode支持") { REQUIRE(reverse_string("こんにちは") == "はちにんこ"); } } </syntaxhighlight> 输出示例: <pre> All tests passed (4 assertions in 2 test cases) </pre> === 示例2:数学运算测试 === 测试阶乘函数: <syntaxhighlight lang="cpp"> unsigned int factorial(unsigned int n) { return n <= 1 ? 1 : n * factorial(n - 1); } TEST_CASE("阶乘计算", "[math][recursion]") { REQUIRE(factorial(0) == 1); REQUIRE(factorial(1) == 1); REQUIRE(factorial(5) == 120); REQUIRE(factorial(10) == 3628800); } </syntaxhighlight> == 高级特性 == === 参数化测试 === 使用 <code>GENERATE</code> 创建数据驱动测试: <syntaxhighlight lang="cpp"> TEST_CASE("参数化测试示例", "[generators]") { auto x = GENERATE(1, 2, 3, 5, 7); SECTION("测试素数") { REQUIRE(is_prime(x)); } } </syntaxhighlight> === BDD 风格 === 行为驱动开发风格: <syntaxhighlight lang="cpp"> SCENARIO("银行账户操作", "[account][bdd]") { GIVEN("一个新账户") { Account account(100); WHEN("存入50元") { account.deposit(50); THEN("余额正确") { REQUIRE(account.balance() == 150); } } } } </syntaxhighlight> === 测试夹具 === 共享测试设置: <syntaxhighlight lang="cpp"> class DatabaseFixture { protected: Database db; public: DatabaseFixture() : db("test.db") { db.connect(); } ~DatabaseFixture() { db.disconnect(); } }; TEST_CASE_METHOD(DatabaseFixture, "数据库查询", "[database]") { REQUIRE(db.query("SELECT * FROM users").size() > 0); } </syntaxhighlight> == 测试组织与执行 == === 标签系统 === Catch2 的标签可以用于过滤测试: <mermaid> graph TD A[所有测试] --> B[核心功能] A --> C[性能测试] A --> D[数据库测试] B --> E[字符串处理] B --> F[数学运算] </mermaid> 执行特定标签的测试: <pre> ./tests [math] # 只运行数学相关测试 ./tests ~[database] # 排除数据库测试 </pre> === 测试报告 === 支持多种格式输出: * 控制台 (默认) * JUnit 格式 (CI 集成) * XML 格式 * TAP 格式 == 最佳实践 == 1. 保持测试独立,不依赖执行顺序 2. 为每个测试用例使用描述性名称 3. 合理使用 SECTION 组织相关断言 4. 将慢速测试标记为 <code>[!slow]</code> 5. 定期运行测试,最好集成到构建流程中 == 常见问题 == === 测试未执行 === 可能原因: * 未定义 <code>CATCH_CONFIG_MAIN</code> * 测试被标签过滤排除 * 测试代码未被编译 === 浮点比较问题 === 正确方式: <syntaxhighlight lang="cpp"> REQUIRE(1.0/3.0 == Approx(0.333333).epsilon(0.0001)); </syntaxhighlight> == 性能考量 == Catch2 的编译时开销较大,建议: * 将测试实现与声明分离 * 使用预编译头 * 在大型项目中考虑拆分测试二进制文件 == 与其他框架比较 == {| class="wikitable" |+ 测试框架对比 ! 特性 !! Catch2 !! Google Test !! Boost.Test | 头文件方式 || ✔️ || ❌ || ❌ | BDD 支持 || ✔️ || ❌ || ✔️ | 标签系统 || ✔️ || ❌ || ✔️ | 断言数量 || 中等 || 多 || 多 | 学习曲线 || 低 || 中 || 高 |} == 延伸学习 == * 测试驱动开发(TDD)方法论 * 模拟对象(Mock)技术 * 代码覆盖率工具 * 持续集成中的测试集成 [[Category:编程语言]] [[Category:C++]] [[Category:C++ 调试与测试]]
摘要:
请注意,所有对代码酷的贡献均被视为依照知识共享署名-非商业性使用-相同方式共享发表(详情请见
代码酷:著作权
)。如果您不希望您的文字作品被随意编辑和分发传播,请不要在此提交。
您同时也向我们承诺,您提交的内容为您自己所创作,或是复制自公共领域或类似自由来源。
未经许可,请勿提交受著作权保护的作品!
取消
编辑帮助
(在新窗口中打开)