Doctest
Doctest 是一个单头文件框架,具有自注册测试功能。 如其 文档中所述,Doctest 是在 Catch 的基础上设计的,并共享了部分 Catch 的代码——请参阅 Doctest 与 Catch 的区别。
Doctest 不支持模拟 ,但您可以将其与第三方模拟库集成,例如 trompeloeil、 googlemock 或 FakeIt。
Doctest 基础
如果您不熟悉 Doctest,您可以在下方找到其主要概念的描述:
示例测试
使用 Doctest 编写的简单测试如下所示:
在上面的示例中, 测试阶乘函数 是一个自由格式的测试名称,不需要是唯一的。 CHECK 是 Doctest 的 断言宏 之一。
测试用例、子测试和套件
Doctest 提供了子用例机制,用于创建具有共享公共设置和清理的嵌套测试(不过,基于类的夹具也 支持)。
在上面的代码中, TEST_CASE() 会为每个 SUBCASE() 从头开始执行。 两个 REQUIRE 语句保证 size 为 5,且 capacity 在每个子用例的入口处至少为 5。 如果其中一个 CHECK() 失败,这意味着测试失败,但执行会继续。 在每次运行 TEST_CASE() 时,Doctest 执行一个子用例并跳过其他子用例。 下一次运行时,第二个子用例会被执行,依此类推。
类似于 Catch 的部分,子用例可以嵌套以创建检查操作的序列。 每个叶子子用例(内部没有嵌套子用例的子用例)只会执行一次。 当父子用例失败时,会阻止子子用例运行。
您可以使用 TEST_SUITE() 或 TEST_SUITE_BEGIN()/TEST_SUITE_END() 宏将测试用例分组到套件中:
Doctest 还支持 BDD 风格语法。
在 CLion 中使用 Doctest
将 Doctest 添加到您的项目中
运行/调试自动创建的 Doctest 配置
CLion 会检测您项目中的 Doctest 测试并为其创建运行/调试配置。
您可以立即使用此配置运行或调试项目中的所有 Doctest 测试:

添加新的 Doctest 运行/调试配置
转到 运行 | 编辑配置。
点击
并从模板列表中选择 Doctest。


在 名称 字段中设置配置名称。 此名称将显示在可用运行/调试配置的列表中。
选择此选项以运行特定测试或套件。
在 套件 字段中指定套件名称。 开始输入时,自动补全将建议可用的套件:

在 测试 字段中选择所需的测试。 将此字段留空以运行整个套件。

选择此选项以指定单个测试或定义一组测试:
[#*filename.cpp]运行 filename.cpp 中的所有测试,[suite_name]运行具有相应名称的套件,[suite_name][test_name]或[suite_name][test_name][subtest_name]运行给定套件中的特定测试,使用
[]([][]) 引用匿名套件,但请确保添加测试名称。
您可以在以逗号分隔的列表中指定多个模式,例如:

或者,您可以将 套件 和 测试 字段留空,并通过 程序参数 提供 Doctest 的 命令行标志。
在 目标 字段中,从列表中选择所需的目标。
点击 Apply 以保存配置。
在切换器中选择新创建的配置并运行
或调试
。

运行测试
在 CLion 中运行或调试测试的最快方法是使用边栏图标:

边栏图标还会显示测试结果(如果已可用):成功
或失败
。
当您使用边栏图标运行测试/套件/夹具时,CLion 会创建一个 临时 Doctest 配置,该配置在配置列表中显示为灰色。 要保存临时配置,请在 对话框中选择它并点击
:

查看测试结果
当您运行测试时,CLion 会在内置的 测试运行窗口 中显示结果和过程。 测试树会显示所有测试,并逐一执行。 测试运行器窗口包括:
带有已执行测试百分比的 进度条,
显示所有正在运行测试的状态和持续时间的 树视图,
测试的输出流,
工具栏 ,提供重新运行失败的
测试、导入/导出或打开自动保存的先前结果
的选项,按字母顺序排序测试以便轻松找到特定测试,或按持续时间排序
以了解哪些测试运行时间比其他测试更长。
