最近在编写一个飞行力学的类库,随着类数量的增加,代码越来越复杂,质量越来越难以控制,因此引入单元测试,通过自动化测试以保障代码质量,防止因代码修改引入新的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 | TEST_CASE( "vectors can be sized and resized", "[vector]" ) { |
上述示例中,对于每个SECTION,TEST_CASE都是从头开始执行的,因此,当我们进入每个部分时,我们知道vector的大小为5,容量至少为5。通过REQUIRE宏在顶层确保vector大小和容量的正确性。这是可行的,因为SECTION宏包含一个if语句,该语句回调Catch来查看是否应执行该节。 通过TEST_CASE,每次运行都会执行一个叶子部分。 其他部分将被跳过。 下次执行下一个部分,依此类推,直到没有新的部分为止。
参考链接
- Writing Unit Tests with Catch and CMake,by filebox.
- Integrating catch2 with CMake and Jenkins,by mariuselvert.
- Catch2,by catchorg.
- C++单元测试入门,by pezy.
- Catch2 - 用于 test 的轻量级库,by Bluemultipl.