gtest的问题
gtest需要安装有时候带来很多不方便,比如需要经常切换gcc和clang的时候就比较麻烦,安装的gtest可能在另一个编译器下编译不过, 编写跨平台程序的时候需要多次安装gtest,非常不便。另外一个问题是网络原因,下载安装gtest或者git上拉gtest都可能因为网络原因失败。
现代c++ unit test库
除了gtest之外,还有很多轻量级易用的单元测试库,比如doctest和catch,相比gtest需要编译/安装,他们都是header only的,直接包含到工程里就可以做单元测试了,portable又没有任何依赖,而且对编译器版本要求也不高,只需要c++11就行了,用了之后只有一个字:爽!
这里推荐使用doctest(https://github.com/doctest/doctest),原因是它的性能比catch更好(https://github.com/doctest/doctest/blob/master/doc/markdown/benchmarks.md),当然也比gtest好, 来看看doctest怎么用的吧。
doctest基本用法
#define doctest_config_implement_with_main#include doctest.htest_case(vectors can be sized and resized) { std::vector v(5); require(v.size() == 5); require(v.capacity() >= 5); subcase(adding to the vector increases it's size) { v.push_back(1); check(v.size() == 6); check(v.capacity() >= 6); } subcase(reserving increases just the capacity) { v.reserve(6); check(v.size() == 5); check(v.capacity() >= 6); }}
这里使用check做断言和gtest的expect_xx是类似的,我觉得doctest更酷更实用的一个特性是subcase, 允许在当前case下增加更多的子case去测试一些special一些的东西,非常实用,这也是相比gtest更好的一个地方。
doctest提供了很多丰富的宏,完全可以满足我们的测试需要。
doctest的断言宏
check宏是只检查并不会终止测试,require宏则会终止测试和gtest里面的asset_xx宏类似,这两个宏也是平时做单测时用得最多的两个宏了。除此之外,还有更丰富的宏。比如:
is one of 3 possible: require/check/warn._eq(left, right) - same as (left == right)_ne(left, right) - same as (left != right)_gt(left, right) - same as (left > right)_lt(left, right) - same as (left = right)_le(left, right) - same as (left 5.0) { d -= 5.0; } ankerl::donotoptimizeaway(d); });}
测试结果:
| ns/op | op/s | err% | ins/op | cyc/op | ipc | bra/op | miss% | total | benchmark|--------------------:|--------------------:|--------:|----------------:|----------------:|-------:|---------------:|--------:|----------:|:----------| 7.52 | 132,948,239.79 | 1.1% | 6.65 | 24.07 | 0.276 | 1.00 | 8.9% | 0.00 | `some double ops`
总结
用现代c++测试工具链:doctest+fakeit+nanobench, 可以完美地替代gtest/gmock和google bench,没有任何依赖,无需安装,直接包含头文件就可以用,非常容易集成和使用,是时候抛弃google test和google bench了!
平价时代渐行渐近,中国风电来到了“凌云渡口”
KUKA机器人对于涂胶设备的清胶控制
2020高工LED年会第三批名单来了!
百度致力成为交通强国的AI引领者
纯电动汽车的典型整车控制系统及芯片方案解析
现代C++ unit test库之doctest基本用法
区块链和云计算的长期发展目标不谋而合_为什么能相互融合
T-Box安全连接整体解决方案
关于工艺节点的分析和介绍以及发展
奋斗!再出发 | 团队篇:坚持奋斗与奔跑,只为我们共同的梦想
交流电路中的电容简析
中兴通讯正式发布了搭载5G承载技术的ZXCTN 9000-E系列产品
老工程师谈经验之—— 开关电源电磁兼容设计
三星联手SK电讯推出世界上首款量子通信智能手机
什么是CSP封装,CSP封装量产测试的问题及解决方案研究
新型消弧线圈的故障与维修方法
健身房中的智能魔镜,让健身运动根本停不下来
车辆中部署的AI技术的类型
HUAWEI CONNECT 2020可以精炼成一个字 共
晶圆价格放缓,产能利用率将上升