0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

现代C++ unit test库之doctest基本用法

Linux爱好者 来源:Linux爱好者 作者:Linux爱好者 2022-10-09 16:38 次阅读

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基本用法

#defineDOCTEST_CONFIG_IMPLEMENT_WITH_MAIN
#include"doctest.h"

TEST_CASE("vectorscanbesizedandresized"){
std::vectorv(5);

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

SUBCASE("addingtothevectorincreasesit'ssize"){
v.push_back(1);

CHECK(v.size()==6);
CHECK(v.capacity()>=6);
}
SUBCASE("reservingincreasesjustthecapacity"){
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宏类似,这两个宏也是平时做单测时用得最多的两个宏了。除此之外,还有更丰富的宏。比如:

isoneof3possible:REQUIRE/CHECK/WARN.

_EQ(left,right)-sameas(left==right)
_NE(left,right)-sameas(left!=right)
_GT(left,right)-sameas(left>right)
_LT(left,right)-sameas(left< right)
_GE(left,right)-sameas(left>=right)
_LE(left,right)-sameas(left<= right)
_UNARY(expr)-sameas(expr)
_UNARY_FALSE(expr)-sameas_FALSE(expr)

判断异常的宏

CHECK_THROWS_AS(func(),conststd::exception&);
CHECK_THROWS_AS(func(),std::exception);//sameasabove

CHECK_THROWS_WITH(func(),"invalidoperation!");

CHECK_THROWS_WITH_AS(func(),"invalidoperation!",std::runtime_error);

_NOTHROW(expression)

doctest异常的宏非常有特色,比gtest的异常断言更强大,可以同时比较异常类型和异常信息

也许有人会说gtest除了这些基本的测试断言之外还有gmock呀,doctest没有gmock这样的mock库。是的,doctest确实没有mock库,但是doctest很容易和其它现代C++的mock库结合起来使用,比如FakeIt。

现代C++ mock库

FakeIt(https://github.com/eranpeer/FakeIt)是C++11写的header only的mock库,用起来也很方便:

structSomeInterface{
virtualintfoo(int)=0;
virtualintbar(string)=0;
};

Mockmock;

When(Method(mock,foo)).Return(0);

SomeInterface&i=mock.get();

//Productioncode
i.foo(1);

//Verifymethodmock.foowasinvoked.
Verify(Method(mock,foo));

//Verifymethodmock.foowasinvokedwithspecificarguments.
Verify(Method(mock,foo).Using(1));

用doctest+FakeIt两个header only的库就可以完美替代gtest了。那么还有一个就是benchmark了,google有一个benchmark库也是需要编译/安装的,有没有什么现代C++的benchmark库来替代google 的benchmark库呢?当然有,比如nanobench。

现代C++ benchmark库

nanobench(https://github.com/martinus/nanobench)也是C++11写的header only的库,使用起来也很简单,包含头文件即可。

#defineANKERL_NANOBENCH_IMPLEMENT
#include

intmain(){
doubled=1.0;
ankerl::Bench().run("somedoubleops",[&]{
d+=1.0/d;
if(d>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|`somedoubleops`

总结

用现代C++测试工具链:doctest+FakeIt+nanobench, 可以完美地替代gtest/gmock和google bench,没有任何依赖,无需安装,直接包含头文件就可以用,非常容易集成和使用,是时候抛弃google test和google bench了!

审核编辑:彭静
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 文件
    +关注

    关注

    1

    文章

    567

    浏览量

    24762
  • C++
    C++
    +关注

    关注

    22

    文章

    2110

    浏览量

    73687
  • 编译器
    +关注

    关注

    1

    文章

    1634

    浏览量

    49153

原文标题:现代 C++ 测试工具链(是时候抛弃 gtest/google bench 了)

文章出处:【微信号:LinuxHub,微信公众号:Linux爱好者】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    现代C++项目的最佳实践

    本系列是开源书C++ Best Practises[1]的中文版,全书从工具、代码风格、安全性、可维护性、可移植性、多线程、性能、正确性等角度全面介绍了现代C++项目的最佳实践。本文是该系列的第三篇。
    发表于 09-29 11:32 1161次阅读

    C++STL算法(二)

    C++STL算法(二)
    的头像 发表于 07-18 14:49 1065次阅读
    <b class='flag-5'>C++</b><b class='flag-5'>之</b>STL算法(二)

    c++STL算法(三)

    c++STL算法(三)
    的头像 发表于 07-18 15:00 1306次阅读
    <b class='flag-5'>c++</b><b class='flag-5'>之</b>STL算法(三)

    C++文件操作

    C++文件操作
    的头像 发表于 07-21 10:52 1120次阅读
    <b class='flag-5'>C++</b><b class='flag-5'>之</b>文件操作

    用Visual C++做数据开发

    实验 用Visual C++做数据开发 一、实验目的1、了解数据的访问方式,掌握ADO 方式访问数据2、用 Visual C++制作
    发表于 05-10 10:54 2444次阅读

    c++标准手册

    C++的标准手册,新手学习的好资料,同时也是开发人员的必备手册。里面涵盖了标准C++的所有的库函数。
    发表于 11-03 14:05 43次下载

    The C++ Standard Library

    C++标准英文版。 C++强大的功能来源于其丰富的类及库函数资源。
    发表于 05-13 14:41 0次下载

    Linux下C/C++编译器gcc使用指南

    1.gcc包含的c/c++编译器 gcc,cc与c++,g++ gcc和cc是一样的,c++和g++是一样的。一般c程序就用gcc编译,
    发表于 11-02 10:59 0次下载

    C语言和C++的特点与用法详细说明

    本文档的主要内容详细介绍的是C语言和C++的特点与用法详细说明。
    的头像 发表于 12-26 10:58 4428次阅读

    doctest基本用法

    现代C++测试工具链:doctest+FakeIt+nanobench, 可以完美地替代gtest/gmock和google bench,没有任何依赖,无需安装,直接包含头文件就可以用,非常容易集成和使用,是时候抛弃googl
    发表于 08-05 10:43 1302次阅读

    C++设计新思维-泛型编程与设计应用

    C++设计新思维-泛型编程与设计应用
    发表于 11-16 15:59 3次下载

    C++学习笔记c++的基本认识

    自这篇文章我们即将开始C++的奇幻之旅,其内容主要是读C++ Primer的总结和笔记,有兴趣可以找原版书看看,对于学习C++还是有很大帮助的。这篇文章将从一个经典的程序开始介绍C++
    的头像 发表于 03-17 13:57 744次阅读

    C++学习笔记顺序容器

    C++中的顺序容器是一种用于存储和管理元素序列的数据结构。它们提供了一组有序的元素,并支持在序列的任意位置插入和删除元素。C++标准中提供了多种顺序容器,包括vector、deque、list、forward_list和arr
    的头像 发表于 05-11 17:05 604次阅读

    CC++编写环境下LabVIEW如何调用动态

    C语言编写的动态链接相比,不同的地方在于extern int “C” __declspec(dllexport) add(int x,int y) 这一导出语句,在C代码中没有”
    发表于 06-11 09:15 7801次阅读
    <b class='flag-5'>C</b>和<b class='flag-5'>C++</b>编写环境下LabVIEW如何调用动态<b class='flag-5'>库</b>?

    C++之父新作带你勾勒现代C++地图

    为了帮助大家解决这些痛点问题,让大家领略现代C++美,掌握其中的精髓,更好地使用C++C++之父Bjarne Stroustrup坐不住
    的头像 发表于 10-30 16:35 865次阅读
    <b class='flag-5'>C++</b>之父新作带你勾勒<b class='flag-5'>现代</b><b class='flag-5'>C++</b>地图