现代 C++ 编程实战
吴咏炜
前 Intel 资深软件架构师
34196 人已学习
新⼈⾸单¥59
登录后,你可以任选4讲全文学习
课程目录
已完结/共 51 讲
加餐 (1讲)
现代 C++ 编程实战
15
15
1.0x
00:00/00:00
登录|注册

25 | 两个单元测试库:C++里如何进行单元测试?

支持BDD风格的测试结构
使用CHECK和REQUIRE进行断言
使用TEST_CASE定义测试用例
定义测试用例
测试失败可选直接进入调试器
支持BDD风格的测试
单个头文件即可使用
控制输出详细程度的命令行选项
使用BOOST_CHECK和BOOST_TEST进行断言
使用BOOST_AUTO_TEST_CASE定义测试用例
定义测试用例
输出详尽的测试结果
支持多种命令行参数
提供丰富功能
Wikipedia, “Behavior-driven development”. https://en.wikipedia.org/wiki/Behavior-driven_development
Two Blue Cubes Ltd., Catch2. https://github.com/catchorg/Catch2
Gennadiy Rozental and Raffi Enficiaud, Boost.Test. https://www.boost.org/doc/libs/release/libs/test/doc/html/index.html
可根据需求选择合适的库
两个库都是优秀的单元测试框架
使用方法
优点
使用方法
优点
Behavior-driven development
Catch2
Boost.Test
总结
Catch2
Boost.Test
参考资料
C++单元测试库

该思维导图由 AI 生成,仅供参考

你好,我是吴咏炜。
单元测试已经越来越成为程序员工作密不可分的一部分了。在 C++ 里,我们当然也是可以很方便地进行单元测试的。今天,我就来介绍两个单元测试库:一个是 Boost.Test [1],一个是 Catch2 [2]

Boost.Test

单元测试库有很多,我选择 Boost 的原因我在上一讲已经说过:“如果我需要某个功能,在标准库里没有,在 Boost 里有,我会很乐意直接使用 Boost 里的方案,而非另外去查找。”再说,Boost.Test 提供的功能还挺齐全的,我需要的都有了。作为开胃小菜,我们先看一个单元测试的小例子:
#define BOOST_TEST_MAIN
#include <boost/test/unit_test.hpp>
#include <stdexcept>
void test(int n)
{
if (n == 42) {
return;
}
throw std::runtime_error(
"Not the answer");
}
BOOST_AUTO_TEST_CASE(my_test)
{
BOOST_TEST_MESSAGE("Testing");
BOOST_TEST(1 + 1 == 2);
BOOST_CHECK_THROW(
test(41), std::runtime_error);
BOOST_CHECK_NO_THROW(test(42));
int expected = 5;
BOOST_TEST(2 + 2 == expected);
BOOST_CHECK(2 + 2 == expected);
}
BOOST_AUTO_TEST_CASE(null_test)
{
}
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

C++单元测试是程序员工作中不可或缺的一部分。本文介绍了两个C++单元测试库:Boost.Test和Catch2。Boost.Test提供了丰富的功能和灵活的命令行参数,可以满足不同的测试需求。而Catch2则具有简单方便的特点,只需要单个头文件即可使用,且支持BDD风格的分节形式。两者在测试结果输出格式方面都具有灵活性,但在终端色彩友好度上有所差异。此外,文章还提到了Catch2的编译速度较慢,但在实际项目中并不构成问题。总的来说,这两个单元测试库都是优秀的框架,可以满足日常开发的需要。读者可以根据自己的需求和实际情况选择适合的测试框架。文章通过实际例子展示了两个库的使用方法,读者可以通过实验来确定哪一个更适合自己的需求。整体而言,Catch2是一个现代、好用的测试框架,对于新项目来说更简单、更容易上手。文章还提到了Boost.Test和Catch2的参考资料,方便读者深入学习。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《现代 C++ 编程实战》
新⼈⾸单¥59
立即购买
登录 后留言

全部留言(7)

  • 最新
  • 精选
  • 承君此诺
    我用的是cmake ctest,个人观点,它很适合测试整个程序,不适合细分到测试某个功能函数。所以,我在看google的gtest。这2个测试框架,您怎么看

    作者回复: 这两个都没有实际使用经验。如果你需要的功能都有,那就没有切换的理由吧。如果不足,就试试其他的。鉴于选择实在太多,重点试几个,满足需求就行了。我一直用 Boost.Test 的理由就是没找到换门的理由,而不是它有多好。当然,至少它是不差的。从下面这个列表里看(几十个 C++ 单元测试框架的概要对比),看起来没有严重缺的东西: https://en.wikipedia.org/wiki/List_of_unit_testing_frameworks#C++

    2020-01-22
    9
  • 杨超然
    老师,有什么工具可以自动分析代码,展示变量之间的调用关系呢?我遇到的代码还牵涉到数组,数组的每个字段都有特定的含义,而代码直接用下标读写和修改数组的字段,且没有标字段的名称。因此,有代码分析工具可以精确到数组里的某一字段,展示它跟其它变量的关系吗?

    作者回复: 恐怕没有——至少我不知道。数组尤其复杂,因为你还可以用指针加偏移量访问,静态分析理论上就不可能能完整分析出来。

    2021-10-16
    1
  • Geek_227a72
    BDD有完整运行代码吗?

    作者回复: 你是说这种? https://github.com/adah1972/geek_time_cpp/tree/master/25/catch2

    2021-04-07
    1
  • 易轻尘
    很有用的一节 不过Boost.Test也可以使用header-only的方式,使用<boost/test/included/unit_test.hpp>头文件就可以了

    作者回复: 嗯。我介绍的是最常用/推荐的方式。Header-only上手快,看起来很美;但实际工程中出于编译速度等各方面考量通常不用。Catch2比较异类的地方是一共只有一个文件,所以上手就更快了。即便如此,实际用起来也是不用header-only更好。

    2020-06-17
  • 晚风·和煦
    老师,map里面插入成万条数据,如何释放内存呢

    作者回复: 全部清空吗?用clear()有问题?

    2020-01-23
    5
  • EricHu
    老师,我想请教一下C++的友元类,它会破坏类的封装性,实际在开发中建议使用吗?要怎么做到类似JAVA反射的效果,访问修改内部静态变量

    作者回复: 尽量不用,但有时候必须用啊。比如我在智能指针的实现里就用了。 跟Java的比较,你说的情况我不熟。泛泛而言,不要在C++里模拟其他语言的做法。退一步,看你要达到的目的是什么,再看语言有什么机制可以满足目标。C++里目前没反射机制,可预见的将来也大概只会有供编译期使用的静态反射。

    2020-01-22
  • fl260919784
    gtest有人有吗😂
    2020-02-18
    1
    15
收起评论
显示
设置
留言
7
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部