CLion 2025.2 Help

Catch

Catch2 是一个轻量级的测试框架。 该名称代表 C++ Automated Test Cases in Headers (version two)。 CLion 支持 Catch 版本 1.7.2 及更高版本。

Boost.Test 一样,Catch2 不提供模拟功能。 但是,您可以将其与独立的模拟框架结合使用,例如 HippomocksFakeItTrompeloeil

Catch2 基础

如果您不熟悉 Catch/Catch2,您可以在下方找到其主要概念的描述:

示例测试

以下示例展示了一个使用 Catch2 编写的简单测试:

#define CATCH_CONFIG_MAIN // provides main(); this line is required in only one .cpp file #include "catch_amalgamated.hpp" int theAnswer() { return 6*9; } // function to be tested TEST_CASE( "Life, the universe and everything", "[42][theAnswer]" ) { REQUIRE(theAnswer() == 42); }

在上述示例中, Life, the universe and everything 是一个自由格式的测试名称,必须是唯一的。 TEST_CASE 宏的第二个参数是两个标签的组合, [42][theAnswer]。 测试名称和标签都是常规字符串,不限于有效的 C++ 标识符。 您可以通过指定带通配符的测试名称或标签表达式来运行测试集合。

注意断言行 REQUIRE(theAnswer() == 42)。 与其他框架不同,Catch2 没有用于捕获各种条件形式的断言集合。 相反,它解析条件表达式的实际 C/C++ 代码,并使用它来描述结果:

...Failure: REQUIRE(theAnswer() == 42) with expansion: 54 == 42

REQUIRE 宏在失败时中止测试,而替代的 CHECK 宏仅报告失败并让测试继续。 在这两个宏中,您可以使用所有 C++ 比较运算符,并以任意顺序传递参数。

部分

Catch2 的另一个重要功能是组织测试的方法:在 用例和部分 中(同时也 支持 基于类的固定机制)。 请看文档中的这个示例:

TEST_CASE( "vectors can be sized and resized", "[vector]" ) { // initialization block executed for each section std::vector<int> v( 5 ); REQUIRE( v.size() == 5 ); REQUIRE( v.capacity() >= 5 ); // end of initialization block SECTION( "resizing bigger changes size and capacity" ) { v.resize( 10 ); REQUIRE( v.size() == 10 ); REQUIRE( v.capacity() >= 10 ); } SECTION( "resizing smaller changes size but not capacity" ) { v.resize( 0 ); REQUIRE( v.size() == 0 ); REQUIRE( v.capacity() >= 5 ); } }

在上述代码片段中, TEST_CASE 在每个 SECTION 开始时执行。 在 TEST_CASE 顶部的两个 REQUIRE 语句强制 size 为 5, capacity 在每个部分的入口处至少为 5。 通过这种方式,共享对象分配在堆栈上,无需为其创建固定类。 在每次通过 TEST_CASE 时,Catch2 执行一个部分并跳过其他部分。 下一次,它执行第二个部分,依此类推。

部分可以嵌套以创建检查操作的序列。 每个叶子部分(内部没有嵌套部分的部分)只执行一次。 当父部分失败时,它会阻止子部分运行。 例如:

SECTION( "reserving bigger changes capacity but not size" ) { v.reserve( 10 ); REQUIRE( v.size() == 5 ); REQUIRE( v.capacity() >= 10 ); // verify that attempting to reserve a smaller capacity changes nothing SECTION( "reserving smaller again does not change capacity" ) { v.reserve( 7 ); REQUIRE( v.capacity() >= 10 ); } }

Catch2 还支持用于测试用例和部分的替代 BDD 风格语法

模板测试

Catch2 支持以下宏形式的类型参数化测试用例:

  • TEMPLATE_TEST_CASE( test name , tags, type1, type2, ..., typen )

  • TEMPLATE_PRODUCT_TEST_CASE( test name , tags, (template-type1, template-type2, ..., template-typen), (template-arg1, template-arg2, ..., template-argm) )

  • TEMPLATE_LIST_TEST_CASE( test name, tags, type list )

这些宏的行为与常规 TEST_CASE 相同,但会针对每种类型或类型组合运行。 有关更多信息,请参阅 类型参数化测试用例

除了类型参数化测试用例,Catch2 还提供 TEMPLATE_TEST_CASE_SIGTEMPLATE_PRODUCT_TEST_CASE_SIG 用于创建基于签名的参数化测试用例,其语法类似,但增加了 签名 参数:

TEMPLATE_TEST_CASE_SIG( test name , tags, signature, type1, type2, ..., typen )

有关更多信息,请参阅 基于签名的参数化测试用例

在 CLion 中使用 Catch2

将 Catch2 添加到您的项目中

  1. 按照 本指南 中的说明,使用 CMake 集成开始使用 Catch。

运行/调试自动创建的 Catch 配置

CLion 会检测您项目中的 Catch 测试并为其创建运行/调试配置。

  1. 您可以立即使用此配置运行或调试项目中的所有 Catch 测试:

    自动创建的 Catch 配置

添加新的 Catch 运行/调试配置

  1. 转到 运行 | 编辑配置

  2. 点击 并从模板列表中选择 Catch

    添加 Catch 配置
  3. Catch 运行/调试配置
    • 名称 字段中设置配置名称。 此名称将显示在可用运行/调试配置的列表中。

    • 选择 标签/测试 选项以运行特定标签或所有标签的测试。 选择 模式 选项以运行特定模式的所有测试。

    • 标记 字段中指定标签。 此字段仅在选择了 标签/测试 选项时可用。

    • 测试 列表中选择所需的测试。 此选项仅在提供了一个或多个标签时可用。

    • 模式 字段中指定模式名称。 此字段仅在选择了 模式 选项时可用。

    • 目标 字段中,从可用目标列表中选择所需的目标。

  4. 点击 Apply 以保存配置。

  5. 在切换器中选择新创建的配置并运行 或调试

    运行/调试 Catch 配置

运行测试

  • 运行或调试单个测试或整个套件/固定装置的最快方法是使用边栏图标:

    测试的侧边栏图标

    侧边栏图标还显示测试结果(如果已可用):成功 或失败

  • 当您使用边栏图标运行测试/套件/固定装置时,CLion 会创建一个 临时 Catch 配置,该配置在配置列表中显示为灰色。 要保存临时配置,请在 编辑配置 对话框中选择它并点击

    保存临时测试配置

查看测试结果

当您运行测试时,CLion 会在内置的 测试运行窗口 中显示结果和过程。 测试树会显示所有测试,并逐一执行。 测试运行器窗口包括:

  • 进度条 ,显示到目前为止已执行测试的百分比,

  • 树视图 ,显示所有正在运行的测试及其状态和持续时间,

  • 测试的输出流,

  • 工具栏 ,提供重新运行失败的 测试、导入/导出或打开自动保存的先前结果 的选项,按字母顺序排序测试以便轻松找到特定测试,或按持续时间排序 以了解哪些测试运行时间比其他测试更长。

测试运行窗口

指定随机种子

如果您在 Catch 测试中使用了随机化,您可以通过指定 --rng-seed='time'|'random-device'|'number' 参数来设置初始种子。 请参阅 Catch 文档中的 本节 了解详细信息。

  1. 在主菜单中,转到 运行 | 编辑配置 并选择任何 Catch 配置。 种子参数将用于整个测试运行。

  2. 程序参数 字段中,设置 --rng-seed 标志:

    指定 rng-seed
  3. 运行配置,您将在测试树中看到固定种子:

    具有固定 rng-seed 的测试结果
  4. 使用上下文菜单以相同的固定种子重新运行测试:

    使用固定种子重新运行测试

故障排除:测试名称过长会导致列表错误并终止测试运行

如果您的项目中有较长的测试名称,这可能会破坏列表并终止整个测试运行(请参阅 Catch 问题)。 尝试以下解决方案之一:

  • 打开 catch_user_config.hpp 文件并将 #define CATCH_CONFIG_CONSOLE_WIDTH 参数从 80 更改为 800

  • 打开 CatchConfigOptions.cmake 文件并将配置生成器从

    set(CATCH_CONFIG_CONSOLE_WIDTH "80" ...)

    结束值

    set(CATCH_CONFIG_CONSOLE_WIDTH "800" ...)
  • (最不推荐)在 CLion 中禁用测试列表提取:清除 cidr.test.prepare.test.list 注册表项。 使用 帮助 | 查找操作 Ctrl+Shift+A 打开注册表对话框。

最后修改日期: 2025年 9月 26日