还在用gtest?更好用的测试框架介绍

news2024/12/27 10:35:20

gtest需要安装有时候带来很多不方便。网络原因,下载安装gtest或者git上拉gtest都可能因为网络原因失败。除了gtest之外,还有很多轻量级易用的单元测试库,比如doctest。

现代C++ unit-test库


除了gtest之外,还有很多轻量级易用的单元测试库,比如doctest和catch。相比gtest需要编译/安装,他们都是header only的,直接包含到工程里就可以做单元测试了,portable又没有任何依赖,而且对编译器版本要求也不高,只需要C++11就行了,用了之后只有一个字:爽!

这里推荐使用doctest,原因是它的性能比catch更好,当然也比gtest好, 来看看doctest怎么用的吧。

doctest介绍


doctest的github地址:doctest/doctest: The fastest feature-rich C++11/14/17/20 single-header testing framework

The fastest feature-rich C++11/14/17/20 single-header testing framework

doctest 是一个新的 C++ 测试框架。与其他功能丰富的替代方案相比,编译时(by orders of magnitude)和运行时是最快的。它提供了编译语言(如 D/Rust/Nim)的能力,并通过提供一个快速,透明和灵活的测试运行器与简洁的界面,可直接在生产代码中编写测试。

doctest和其他测试框架之间的主要区别在于它很轻而且没有侵入性。

A complete example with a self-registering test that compiles to an executable looks like this:

相关特性


  1. 通过定义DOCTEST_CONFIG_DISABLE标识符可以从二进制执行文件中删除与测试相关的所有内容。
  2. 非常小巧易于集成——只是一个头文件。
  3. 非常低的编译时间——大约25ms的编译时间开销,用于展开头文件。
  4. 可能是最快的断言宏——50K个断言可以30秒内编译(甚至10秒)。
  5. 不移动任何头文件(库实现的翻译单位除外)。
  6. 一切都在doctest命名空间中(实现细节在一个嵌套的detail命名空间中)。
  7. 所有宏都有前缀——默认情况下有些不带前缀,但这是可选的——请参阅配置。
  8. 不会产生任何警告,即使是最严格的编译选项(在所有测试的编译器上)。
  9. Clang : -Weverything -pedantic
  10. GCC:-Wall -Wextra -pedantic 和 超过35个 其他警告,这些标志不覆盖GCC!——参考这里。
  11. MSVC:/W4 (/Wall太多了—— 如果使用该选项,甚至微软自己的头文件都会产生数千个警告)
  12. 命令行无法识别的选项,不会出现错误,并支持与客户机命令行解析进行互操作的前缀。
  13. 可以在程序中设置选项,而不是通过argc/ argv从命令行传入。
  14. 自己被禁用时不会产生警告。

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宏类似,这两个宏也是平时做单测时用得最多的两个宏了。

现代C++ benchmark库


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);
    });
}

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

最后感谢每一个认真阅读我文章的人,礼尚往来总是要有的,虽然不是什么很值钱的东西,如果你用得到的话可以直接拿走:

这些资料,对于【软件测试】的朋友来说应该是最全面最完整的备战仓库,这个仓库也陪伴上万个测试工程师们走过最艰难的路程,希望也能帮助到你!有需要的小伙伴可以点击下方小卡片领取 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/694999.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Vscode如何快速打开用户的 settings.json 文件

1、打开vscode编辑器&#xff0c;本文演示的vscode是中文版 2、点击右下角齿轮’设置’ 3、在弹出的设置菜单中选择: 设置 ’ 快捷键 cmd, &#xff08;macos&#xff09; ctrl,&#xff08;windows&#xff09; 4、 点击 设置 ’ 后, 弹出设置窗口 5、在设置窗口右上角点击…

一些性能优化思路与策略

一些性能优化思路与策略 1. 前言2. 性能观察指标3.性能监控工具/途径 1. 前言 今天公司同事做技术分享&#xff0c;题目就是&#xff1a;一些性能优化思路与策略&#xff0c;我学习了一下然后做了如下总结。 2. 性能观察指标 响应时间:平均响应时间&#xff0c;TP95、TP99等等…

将字符串“01:03”转换成秒数

场景&#xff1a;我们经常遇到这种场景&#xff0c;用户使用前端的时间组件自定义时间长度&#xff0c;比如antd的timePicker&#xff0c;传递选中的时间给后端&#xff0c;但是在后端中我们一般会使用秒数或者分钟数去保存&#xff0c;而不会保存一个字符串。 这个时候我们需要…

探索OpenCV的AI实现视频超分

OpenCV除了使用光流算法与普通插值实现图像视频超分&#xff0c;还提供AI深度学习实现视频超分。算法模型包括&#xff1a;edsr、espcn、fsrcnn、lapsrn&#xff0c;实现超分的倍数有2、3、4、8。通过AI实现的视频超分比传统算法的效果更好&#xff0c;图像更清晰。 1、超分算…

大数据面试题之Mysql:每日三题(五)

大数据面试题之Mysql:每日三题 1.MySQL索引存储结构(六种)2.on和where的区别3.mysql是怎么查重的&#xff1f;(重点掌握3种&#xff0c;distinct&#xff0c;group by&#xff0c;row_number) 很开心写完上一篇&#xff0c;就立刻找到了我入职的第二家公司&#xff0c;所以我还…

Gitlab保护分支与合并请求

目录 引言 1、成员角色指定 1、保护分支设置 2、合并请求 引言 熟悉了Git工作流之后&#xff0c;有几个重要的分支&#xff0c;如Master(改名为Main)、Develop、Release分支等&#xff0c;是禁止开发成员随意合并和提交的&#xff0c;在此分支上的提交和推送权限仅限项目负责…

电商假货品牌如何应对

随着电商的逐步发展&#xff0c;不同渠道首的产品上架数量呈明显增长&#xff0c;这些链接里会有经销商店铺&#xff0c;或者是非授权店铺&#xff0c;同时伴随的还会有低价、窜货、假货产品。假货大多是低价链接&#xff0c;面对线上逐渐增多的假货链接&#xff0c;品牌又该如…

C++ / QT 旅游产品管理系统

一、项目介绍 旅游产品管理系统 你是一家旅行社的 IT 主管&#xff0c;现在需要你设计并实现一个旅游产品管理系统。 1 &#xff09; 基本功能要求 * 实现基础界面&#xff1a; 参照现有的旅游产品管理系统&#xff1a;查看产品、选择产品、使用说明等内容 * 支持旅游产品…

【每日一题】Leetcode - 283. 移动零

题目 Leetcode - 283. 移动零 解题思路 从右向左遍历&#xff0c;遇到0&#xff0c;就将后面所有元素前移&#xff0c;同时更新长度&#xff0c;使其减1&#xff0c;因为移动n次&#xff0c;倒数n位就被0占据&#xff0c;后续操作可忽略 class Solution {public void moveZ…

G1吊舱全面升级,新增软件驱动库,支持多平台使用

G1吊舱&#xff0c;是我们去年推出的一款自研的云台产品&#xff0c;体积小巧&#xff0c;功能强大&#xff0c;上市后得到了很多朋友的支持。在上市后的一年期间&#xff0c;我们多方收集用户反馈&#xff0c;并基于用户的宝贵建议对G1吊舱进行了软硬件上的升级。 ​ 一、软件…

【ubuntu】【vmware tools】解决重启后看不到共享目录的问题

1、现象 ubuntu 22 vmware 16&#xff0c;安装后会发现 “Reinstall VMware Tools…” 灰色不可用。如图&#xff1a; 2、原因分析 ubuntu 22 ISO 内不再提供 VMware Tools 的安装包&#xff0c;未检测到所以灰色不可用 在 Ubuntu 22 上挂载 Windows HGFS 共享目录&#xff…

点成分享丨实验室磁力搅拌器的原理及应用

磁力搅拌器概述 磁力搅拌器是一种广泛应用于化学实验室、生物技术、制药和其他研究领域的实验室设备。在实验中&#xff0c;溶液需要混合均匀才能进行下一步的反应或测量。传统的方法是通过手动搅拌或机械搅拌来实现&#xff0c;但这些方法都有一定的缺陷&#xff0c;如不均匀、…

图解平衡二叉搜索树

gitee仓库&#xff1a;https://gitee.com/WangZihao64/data-structure-and-algorithm/tree/master/avl 有如下一棵树(采用加入左结点平衡因子-1&#xff0c;加入右结点平衡因子1的方式)&#xff1a; 插入有以下几种情况&#xff1a; 1.平衡因子变为2 2.平衡因子变为0 3.平衡因…

一个基于 SpringCloud 微服务架构的前后端分离博客系统

项目介绍 蘑菇博客( MoguBlog )&#xff0c;一个基于微服务架构的前后端分离博客系统。Web 端使用 Vue ElementUi , 移动端使用 uniapp 和 ColorUI。 后端使用 SpringCloud SpringBoot Mybatis-plus进行开发&#xff0c;使用 Jwt SpringSecurity 做登录验证和权限校验&am…

统计机器学习第十三章极大似然估计的性质——图解MLE的渐进正态性

n10; t10000; s1/12/n; xlinspace(-0.4,0.4,100); y1/sqrt(2*pi*s)*exp(-x.^2/(2*s)); zmean(rand(t,n)-0.5,2);figure(1); clf; hold on b20; hist(z,b); hplot(x,y*t/b*(max(z)-min(z)),r-);这段代码的功能是生成随机数并进行直方图和曲线的可视化。下面是每行代码的解释&…

[算法前沿]--028-基于Hugging Face -Transformers的预训练模型微调

1. 简介 本章节将使用 Hugging Face 生态系统中的库——🤗 Transformers来进行自然语言处理工作(NLP)。 Transformers的历史 以下是 Transformer 模型(简短)历史中的一些参考点: Transformer 架构于 2017 年 6 月推出。原始研究的重点是翻译任务。随后推出了几个有影响…

Chrome/Edge 浏览器多账号登录,测试同一业务系统的不同账号角色

文章目录 如何使用多账户&#xff1f;ChromeEdge 虽然说用不同浏览器测试也比较方便、还能顺带测试多浏览器兼容问题…… 但我是开发呀&#xff0c;我只想用我最习惯的谷歌浏览器完成快速开发&#xff0c;把功能铺上&#xff0c;专注于业务逻辑的开发 这些浏览器差异等只会给我…

RTSP/Onvif协议视频平台EasyNVR硬件无法进入服务器该如何解决?

EasyNVR是基于RTSP/Onvif协议的视频接入、处理及分发的安防视频云平台&#xff0c;可提供的视频能力包括&#xff1a;设备接入、实时视频直播、录像、云存储、录像回放与检索、告警、级联等&#xff0c;平台可支持将接入的视频流进行全平台、全终端的分发&#xff0c;分发的视频…

占空比任意方波的傅里叶级数展开

目录 傅里叶级数的复数形式占空比任意方波的傅里叶级数展开 常见的方波信号傅里叶级数展开都是占空比为50%&#xff0c;如方波信号傅里叶级数展开&#xff0c;但有的时候信号的占空比不一定是50%的信号&#xff0c;这时我们要对其进行傅里叶变换或者频谱推导的时候&#xff0c;…

Android应用权限请求步骤

1.在AndroidManifest.xml中配置请求权限 <uses-permission android:name"android.permission.READ_EXTERNAL_STORAGE"/><uses-permission android:name"android.permission.WRITE_EXTERNAL_STORAGE"/> 2.在onCreate(Bundle savedInstanceStat…