CPlusPlus单元测试框架Catch入门

最近在编写一个飞行力学的类库,随着类数量的增加,代码越来越复杂,质量越来越难以控制,因此引入单元测试,通过自动化测试以保障代码质量,防止因代码修改引入新的Bug。C++已经有一些成熟的代码测试框架,例如:Google Test, Boost.Test, CppUnit, Cute,等等。通过综合分析和比较,最终选择Catch2测试框架。选择该测试框架的原因是其够轻量级,够简单。

Catch2简介

Catch2是轻量级的C++的多范式测试框架。 它也支持Objective-C(也许还有C)。 它主要作为单个头文件分发,尽管某些扩展可能需要其他头文件。

关键特征

  • 快速且非常容易上手。 只需下载catch.hpp,#include它就可以了。
  • 没有外部依赖性。 只要您可以编译C ++ 11并拥有C ++标准库即可。
  • 将测试用例编写为自注册函数(或方法,如果您愿意的话)。
  • 将测试用例划分为几个部分,每个部分都是独立运行的(消除了对夹具的需求)。
  • 使用BDD样式的“时准时限”部分以及传统的单元测试用例。
  • 仅一个核心声明宏可以进行比较。 使用标准C / C ++运算符进行比较-但是完整的表达式已分解,并且记录了lhs和rhs值。
  • 测试使用自由格式的字符串命名-合法标识符中没有其他名称。

核心特征

  • 可以对测试进行标记,以方便地运行临时的测试组。
  • 故障可能(可选)进入Windows和Mac上的调试器。
  • 输出通过模块化报告器对象。 包括基本的文本和XML报告程序。 自定义记者可以轻松添加。
  • 支持JUnit xml输出以与第三方工具(例如CI服务器)集成。
  • 提供了默认的main()函数,但您可以提供自己的控件来进行完全控制(例如,集成到自己的测试运行器GUI中)。
  • 提供了命令行解析器,如果您选择提供自己的main()函数,该解析器仍可以使用。
  • Catch可以测试自己。
  • 替代性断言宏报告失败,但不中止测试用例
  • 浮点公差比较是使用表达性的Approx()语法构建的。
  • 内部和友好的宏是隔离的,因此可以管理名称冲突
  • 匹配器

Catch示例

使用Catch进行单元测试,只需简单掌握TEST_CASE、REQUIRE、SECTION三个宏即可编写绝大部分的测试用例。简单示例如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
TEST_CASE( "vectors can be sized and resized", "[vector]" ) {

std::vector<int> v( 5 );

REQUIRE( v.size() == 5 );
REQUIRE( v.capacity() >= 5 );

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 );
}
SECTION( "reserving bigger changes capacity but not size" ) {
v.reserve( 10 );

REQUIRE( v.size() == 5 );
REQUIRE( v.capacity() >= 10 );
}
SECTION( "reserving smaller does not change size or capacity" ) {
v.reserve( 0 );

REQUIRE( v.size() == 5 );
REQUIRE( v.capacity() >= 5 );
}
}

上述示例中,对于每个SECTION,TEST_CASE都是从头开始执行的,因此,当我们进入每个部分时,我们知道vector的大小为5,容量至少为5。通过REQUIRE宏在顶层确保vector大小和容量的正确性。这是可行的,因为SECTION宏包含一个if语句,该语句回调Catch来查看是否应执行该节。 通过TEST_CASE,每次运行都会执行一个叶子部分。 其他部分将被跳过。 下次执行下一个部分,依此类推,直到没有新的部分为止。

参考链接

  1. Writing Unit Tests with Catch and CMake,by filebox.
  2. Integrating catch2 with CMake and Jenkins,by mariuselvert.
  3. Catch2,by catchorg.
  4. C++单元测试入门,by pezy.
  5. Catch2 - 用于 test 的轻量级库,by Bluemultipl.