【现代 C++ 测试工具链(是时候抛弃 gtest/google bench 了)】【转载】

这篇具有很好参考价值的文章主要介绍了【现代 C++ 测试工具链(是时候抛弃 gtest/google bench 了)】【转载】。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

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.h"

TEST_CASE("vectors can be sized and resized") {
    std::vector<int> 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宏类似,这两个宏也是平时做单测时用得最多的两个宏了。除此之外,还有更丰富的宏。比如:

<LEVEL> is one of 3 possible: REQUIRE/CHECK/WARN.

<LEVEL>_EQ(left, right) - same as <LEVEL>(left == right)
<LEVEL>_NE(left, right) - same as <LEVEL>(left != right)
<LEVEL>_GT(left, right) - same as <LEVEL>(left > right)
<LEVEL>_LT(left, right) - same as <LEVEL>(left < right)
<LEVEL>_GE(left, right) - same as <LEVEL>(left >= right)
<LEVEL>_LE(left, right) - same as <LEVEL>(left <= right)
<LEVEL>_UNARY(expr) - same as <LEVEL>(expr)
<LEVEL>_UNARY_FALSE(expr) - same as <LEVEL>_FALSE(expr)
判断异常的宏
CHECK_THROWS_AS(func(), const std::exception&);
CHECK_THROWS_AS(func(), std::exception); // same as above

CHECK_THROWS_WITH(func(), "invalid operation!");

CHECK_THROWS_WITH_AS(func(), "invalid operation!", std::runtime_error);

<LEVEL>_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库,用起来也很方便:

struct SomeInterface {
    virtual int foo(int) = 0;
    virtual int bar(string) = 0;
};

Mock<SomeInterface> mock;

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

SomeInterface &i = mock.get();

// Production code
i.foo(1);

// Verify method mock.foo was invoked.
Verify(Method(mock,foo));

// Verify method mock.foo was invoked with specific arguments.
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的库,使用起来也很简单,包含头文件即可。

#define ANKERL_NANOBENCH_IMPLEMENT
#include <nanobench.h>

int main() {
    double d = 1.0;
    ankerl::nanobench::Bench().run("some double ops", [&] {
        d += 1.0 / d;
        if (d > 5.0) {
            d -= 5.0;
        }
        ankerl::nanobench::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了!

来源:www.purecpp.org

原文链接:

现代 C++ 测试工具链(是时候抛弃 gtest/google bench 了) 文章来源地址https://www.toymoban.com/news/detail-837463.html

到了这里,关于【现代 C++ 测试工具链(是时候抛弃 gtest/google bench 了)】【转载】的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • C++开发测试工具gmock的安装与使用超详解

    gmock是google公司推出的一款开源的白盒测试工具。gmock是个很强大的东西,测试一个模块的时候,可能涉及到和其他模块交互,可以将模块之间的接口mock起来,模拟交互过程。其作用就类似白盒测试中的打桩的概念。google 开源的跨平台C++单元测试框架,是为在不同平台上为编

    2024年02月06日
    浏览(52)
  • c++ http服务器之Apache工具ab压力测试(nginx与brpc)

    ab全称为:apache bench,官方注释为: Apache超文本传输协议(HTTP)的性能测试工具。其设计意图是描绘当前所安装的Apache的执行性能,主要是显示你安装的Apache每秒可以处理多少个请求。apache自带的压力测试工具。ab非常实用,它不仅可以对apache服务器进行网站访问压力测试,也

    2024年02月07日
    浏览(52)
  • C++单元测试Gtest+Stub攻略

    笔者环境为linux环境(deepin),以下均在此环境进行 Gtest源码链接 Stub源码链接 StubExt源码链接 Stub的使用方法在cpp-stub/README_zh.md中有讲解 StubExt的使用方法在 cpp-stub-ext/ README.md中有讲解 StubExt可支持Lambda表达式进行打桩写Gtest时如果想获取一个固定的返回值或者出参十分好用 搭建环

    2024年02月10日
    浏览(57)
  • C++中的断言机制与gtest单元测试

       这部分内容网上已经有很多人讲了,我就不做重复性工作,制造垃圾了,大家看看下面两个链接就可以了,因为我的专栏除了分享自己学习的知识,主要想为大家提供完整学习路线,让大家的知识体系更加完善! (1)参考:https://www.cnblogs.com/lvchaoshun/p/7816288.html (1)参考:

    2023年04月08日
    浏览(101)
  • google gtest框架入门使用案例

    通过本文可以收获: google gtest 急速入门、 google gtest 资源网站。 google gtest是谷歌开源的c++单元测试框架,非常的好用。 起码个人感觉和spring boot自带的测试框架功能差不太多。 略过,请参考:GitHub - google/googletest: GoogleTest - Google Testing and Mocking Framework或网上资料 本文重点。

    2024年02月08日
    浏览(31)
  • C++单元测试GoogleTest和GoogleMock十分钟快速上手(gtest&gmock)

    下载 安装 重要文件 googletest gtest/gtest.h libgtest.a libgtest_main.a 当不想写 main 函数的时候,可以直接引入 libgtest_main.a; 否则 googlemock gmock/gmock.h libgmock.a libgmock_main.a 一 .断言 gtest 中的断言分成两大类: ASSERT_* 系列:如果检测失败就直接退出 当前函数 EXPECT_* 系列:如果检测失败

    2024年02月06日
    浏览(41)
  • cmake + gtest安装使用 C++单元测试 gcov locv代码覆盖率

    CMakeLists.txt速查简单编写 打开–g3 选项,去掉-O2以上级别的代码优化选项;否则编译器会对代码做一些优化,例如行合并,从而影响行覆盖率结果; 这里我比较懒就没有加 加到test目录下的CMakeLists.txt即可 , 其中代码编译完之后会在test/CMakeFiles/test.dir/ 生成test.cpp.gcno文件, 在运

    2024年02月05日
    浏览(42)
  • 接口测试工具——Postman测试工具 & Swagger接口测试+SpringBoot整合 & JMeter高并发测试工具

    头部携带token 类型选择JSON https://apifox.com/ swagger2,较多 swagger3, Knife4j的前身是swagger-bootstrap=ui,前身swagger–bootstrap-ui是一个纯swagger–ui的ui皮肤项目 https://doc.xiaominfo.com/docs/quick-start 底层就是swagger 序号 注解 作用 1 @Api(tags = “图书的api接口类”) 左侧名字 2 @ApiOperation(“findPa

    2024年02月12日
    浏览(63)
  • 海康直连工具 海康测试工具,工程宝测试软件等

    海康直连工具 海康测试工具,工程宝测试软件等,监控工程调试软件,海康/大华,摄像头IP批量修改,摄像头密码重置,恢复出厂等各种工程测试软件,所有软件为app格式, 都是原厂最新版软件,别再问可不可以装在手机/平板/电脑上能不能用,这是工程宝专业测试软件用在

    2024年02月12日
    浏览(139)
  • 【测试工具】UnixBench 测试

    UnixBench 原本叫做 BYTE UNIX benchmark suite。软件为 Unix 类的系统提供了一些基本的性能指标。通过不同的测试来测试系统不同方面的性能(2D,3D,CPU,内存等等)。这些测试的结果将和一些标准的系统来做比较,从而得出一些性能指数,比原始 的测试数据容容易理解。 UnixBench一

    2024年01月16日
    浏览(44)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包