仿RabbiteMq简易消息队列基础篇(gtest的使用)
@TOC
gtest介绍
gtest是google的一个开源框架,它主要用于写单元测试,检查自己的程序是否符合预期行为。可在多个平台上使用(包含Linux,MAC OC,Windows等)。它提供了丰富的断言,致命和非致命失败判断,能进行值参数化测试,类型参数化测试,“死亡测试”。
断言
一般的要测试一个方法(函数)是否是正常执行的,可以提供一些输入数据,在调用这个函数后,会得到输出结果,然后检查输出的数据是否与我们期望的结果是一致的,若一致则说明这个方法的逻辑是正确的,否则就有问题。
在对输出结果进行检查的时候,gtest为我们提供了一系列的断言进行代码测试,这些宏有点类似于函数调用。当断言失败时gtest将会打印出assertion时的源文件和出错行的位置以及附加的失败信息。这些输出的附加信息用户可以直接通过operator << 在这些断言宏后面。
gtest中,断言的宏可以分为两种,一类是ASSERT系列,一类是EXPECT类。
区别:ASSERT不通过的时候会认为是一个指明的错误,退出当前函数(只是函数)。而EXPECT失败之后会继续运行当前函数,所以对于函数内的几个失败可以同时报告出来,通常用我们EXPECT级别的断言即可,除非你认为当前检查点失败后函数的后续检查没有意义。
布尔类型检查
| 致命断言 | 非致命断言 | 验证 |
| ASSERT_TRUE(状态) | EXPECT_TRUE(状态) | 条件为真 |
| ASSERT_FALSE(状态) | EXPECT_FALSE(状态) | 条件为假 |
二值检查
| 致命断言 | 非致命断言 | 验证 |
| ASSERT_EQ(期望值, 实际值) | EXPERT_EQ(期望值, 实际值) | 期望值 == 实际值 |
| ASSERT_NE(值1, 值2) | EXPERT_NE(值1, 值2) | 值1 != 值2 |
| ASSERT_LT(值1, 值2) | EXPERT_LT(值1, 值2) | 值1 < 值2 |
| ASSERT_LE(值1,值2) | EXPERT_LE(值1, 值2) | 值1 <= 值2 |
| ASSERT_GT(值1, 值2) | EXPERT_GT(值1, 值2) | 值1 > 值2 |
| ASSERT_GE(值1,值2) | EXPERT_GE(值1, 值2) | 值1 >= 值2 |
字符串检查
| 致命断言 | 非致命断言 | 验证 |
| ASSERT_STREQ(字符串1, 字符串2) | EXPECT_STREQ(字符串1, 字符串2) | 两个C字符串具有相同的内容 |
| ASSERT_STRNE(字符串1, 字符串2) | EXPECT_STRNE(字符串1, 字符串2) | 两个C字符串有不同的内容 |
| ASSERT_STRCASEEQ(字符串1, 字符串2) | EXPERT_STRCASEEQ(字符串1, 字符串2) | 两个C字符串具有相同的内容(忽略大小写) |
| ASSERT_STRCASENE(字符串1, 字符串2) | EXPECT_STRCASENE(字符串1, 字符串2) | 两个C字符串的内容不同(忽略大小写) |
宏测试
TEST宏
TEST宏的第一个参数是test_case_name(测试套件名),第二个参数是test_name(测试特例名)
测试套件(Test Case)是为某个特殊目标而编制的一组测试输入,执行条件以及预期结果,以便测试某个程序路径或核实是否满足某个特定需求。
测试特例名是测试套件下的一个测试
举例:
#include <iostream>
#include <gtest/gtest.h>using namespace std;TEST(MATHTEST, test1)
{ASSERT_EQ(10, 10); // 成功EXPECT_NE(10, 10); // 失败,但是会继续执行ASSERT_TRUE(10 > 0); // 成功EXPECT_FALSE(10 < 1); // 成功
}int main(int argc, char* argv[])
{testing::InitGoogleTest(&argc, argv);return RUN_ALL_TESTS();
}
TEST_F宏
使用TEST_F前需要创建一个固定类,继承testing::Test类
在类内部使用public或者protected描述其成员,为了保证实际执行的测试子类可以使用其成员变量。在构造函数或者继承于::testing::Test类中的SetUp方法中可以实现我们需要构造的数据。在析构函数或者继承于::testing::Test类中的TearDown方法中可以实现一些资源释放的代码。
这里需要注意四个函数
//测试环境测试夹具类中可以实现四个函数static void SetUpTestCase() //在测试某个测试套件时,在执行第一个测试用例前执行static void TearDownTestCase() //在测试某个测试套件时,在执行完最后一个测试用例后执行virtual void SetUp() override //在测试某个测试套件时,在执行每一个测试用例前执行virtual void TearDown() override //在测试某个测试套件前,在执行完每一个测试用例后执行
第一个参数为测试套件名(必须与创建的固件类名一致),第二个为测试名,可任意取。
TEST_F宏和TEST宏的实现接近,只是TEST_F宏的封装更加开放一些,对TEST宏的功能多了一些扩展。
TEST_F与TEST的区别,TEST_F提供了一个初始化函数(SetUp)和一个清理函数(TearDown)。在TEST_F中使用的变量可以在初始化函数SetUp中初始化,在TearDown中销毁。所有的TEST_F是互相独立的,都是在初始化以后的状态开始运行。一个TEST_F不会影响另一个TEST_F所使用的数据,多个测试场景需要相同数据配置的情况用TEST_F。
举例:
#include <iostream>
#include <gtest/gtest.h>
#include <vector>
#include <algorithm>using namespace std;vector<int> global_vector;class VectorTest : public testing::Test
{
public:static void SetUpTestCase(){cout << " VectorTest测试套件开始测试" << endl;global_vector = {9, 5, 6, 2, 8, 7, 1, 3, 4};}static void TearDownTestCase(){cout << "VectorTest测试套件结束测试,清理数据" << endl;global_vector.clear();}void SetUp() override{cout << "VectorTest测试套件中新的一场测试开始测试" << endl;global_vector = {9, 5, 6, 2, 8, 7, 1, 3, 4};}void TearDown() override{cout << "VectorTest测试套件中旧的一场测试结束测试,清理数据" << endl;global_vector.clear();}
};TEST_F(VectorTest, sortVector)
{sort(global_vector.begin(), global_vector.end());for(int i = 0; i < global_vector.size(); i++){cout << global_vector[i] << " ";}cout << endl;
}TEST_F(VectorTest, reductVector)
{for(int i = 0; i < global_vector.size(); i++){cout << global_vector[i] << " ";}cout << endl;
}TEST(MYTEST, test1)
{if(global_vector.empty()){cout << "数组已经清空" << endl;}else{cout << "数组没有清空" << endl;}
}int main(int argc, char* argv[])
{testing::InitGoogleTest(&argc, argv);return RUN_ALL_TESTS();
}
TEST_P宏
在设计测试案例时,经常需要考虑给被测函数传入不同的值的情况。我们之前的做法通常是写一个通用方法然后编写在测试案例调用它。即使使用了通用方法,这样的工作也是有很多重复性的。
用TEST这个宏,需要编写如下的测试案例,每输入一个值就需要写一个测试点,这还只是在一个测试中,如果把每个测试点单独创建一个测试,工作量就更大。使用TEST_P这个宏,对输入进行参数化,就简单很多
举例:
#include <iostream>
#include <gtest/gtest.h>
#include <vector>
#include <algorithm>using namespace std;class positiveTest : public testing::TestWithParam<int>
{
public:static void SetUpTestCase(){cout << " VectorTest测试套件开始测试" << endl;}static void TearDownTestCase(){cout << "VectorTest测试套件结束测试,清理数据" << endl;}void SetUp() override{cout << "VectorTest测试套件中新的一场测试开始测试" << endl;}void TearDown() override{cout << "VectorTest测试套件中旧的一场测试结束测试,清理数据" << endl;}
};class negativeTest : public testing::TestWithParam<int>
{
public:static void SetUpTestCase(){cout << " VectorTest测试套件开始测试" << endl;}static void TearDownTestCase(){cout << "VectorTest测试套件结束测试,清理数据" << endl;}void SetUp() override{cout << "VectorTest测试套件中新的一场测试开始测试" << endl;}void TearDown() override{cout << "VectorTest测试套件中旧的一场测试结束测试,清理数据" << endl;}
};INSTANTIATE_TEST_SUITE_P
(positiveValues,positiveTest,testing::Values(9, 5, 6, 2, 8, 7, 1, 3, 4)
);INSTANTIATE_TEST_SUITE_P
(negativeValues,negativeTest,testing::Values(-9, -5, -6, -2, -8, -7, -1, -3, -4)
);TEST_P(positiveTest, Test1)
{int param = GetParam();EXPECT_GT(param, 0);}TEST_P(negativeTest, Test1)
{int param = GetParam();EXPECT_LT(param, 0);}int main(int argc, char* argv[])
{testing::InitGoogleTest(&argc, argv);return RUN_ALL_TESTS();
}

预处理事件机制
gtest 提供了多种预处理事件机制,方便我们在测试之前或之后做一些操作。
1. 全局的,所有测试执行前后。
2. TestSuite级别的,在某测试套件中第一个测试前,最后一个测试执行后。
3. TestCase级别的,每个测试前后。
1.全局事件
要实现全局事件,必须写一个类继承testing::Environment类,实现里面的SetUp和TearDown方法。
1. SetUp()方法在所有案例执行前执行。
2. TearDown()方法在所有案例执行后执行。
还需要在main函数中通过调用testing::AddGlobalTestEnvironment这个函数将事件挂进来,也就是说,我们可以写很多个这样的类,然后将他们的事件都挂上去,AddGlobalTestEnvironment这个函数要放在RUN_ALL_TEST之前。
int main()
{testing::AddGlobalTestEnvironment(new FooEnvir);testing::InitGoogleTest();RUN_ALL_TESTS();return 0;
}
2.TestSuites事件
需要写一个类,继承testing::Test,然后实现两个静态方法
1. SetUpTestCase() 方法在第一个TestCase之前执行。
2. TearDownTestCase() 方法在最后一个TestCase之后执行。
3.TestCase事件
TestCase事件是挂在每个案例执行前后的,实现方式和Test'Suites的几乎一样,不过需要实现的是SetUp方法和TearDown方法:
1. SetUp()方法在每个TestCase之前执行。
2. TearDown()方法在每个TestCase之后执行。
相关文章:
仿RabbiteMq简易消息队列基础篇(gtest的使用)
TOC gtest介绍 gtest是google的一个开源框架,它主要用于写单元测试,检查自己的程序是否符合预期行为。可在多个平台上使用(包含Linux,MAC OC,Windows等)。它提供了丰富的断言,致命和非致命失败…...
图像处理中的图像梯度和幅值是什么???(通俗讲解)
在边缘检测和特征提取等任务中,图像的梯度和幅值是图像处理中非常重要的概念。 目录 一、图像的梯度1.1 专业解释1.2 通俗理解1.3 计算方式 二、梯度的幅值2.1 专业解释2.2 通俗理解2.3 计算方式 一、图像的梯度 1.1 专业解释 图像的梯度可以看作是图像中亮度或颜…...
01.计算机网络导论
引言 协议分层 协议分层使我们可以将大任务化简成几个更小、更简单的任务。模块化指的是独立的协议层。一个协议层(模块)可以定义为一个具有输入和输出而不需要考虑输入是如何变成输出的黑匣子。当向两台机器提供相同输入得到相同输出时,它…...
API网关:SpringCloud GateWay
一. 网关的作用及背景 1.API网关的作用 请求路由 在我们的系统中由于同一个接口新老两套系统都在使用,我们需要根据请求上下文将请求路由到对应的接口。 统一鉴权 对于鉴权操作不涉及到业务逻辑,那么可以在网关层进行处理,不用下层到业务…...
【Leetcode 383】赎金信 —— 哈希表 有注解
给你两个字符串:ransomNote 和 magazine ,判断 ransomNote 能不能由 magazine 里面的字符构成。 如果可以,返回 true ;否则返回 false 。 magazine 中的每个字符只能在 ransomNote 中使用一次。 示例 1: 输入&#…...
Linux 常见的冷知识集锦
一、前言 本文旨在记录那些常见的Linux概念和名词,但这些又没经常直接使用到,更多在底层运行,见过却又不是特别清楚的碎片知识,以温故知新。 二、知识点和概念说明 2.1、POSIX标准/协议 POSIX(Portable Operating S…...
【喜报】科大睿智祝贺青岛海信网络科技通过CMMI5级评估
青岛海信网络科技股份有限公司成立于1998年,是海信集团B2B产业的核心力量。其主要从事城市交通、公共交通、智慧公路、交通枢纽、智慧停车、智能网联、大数据管理、城市治理、应急管理、轨道交通智能化和医院、校园、园区等智能化建设领域的产品和解决方案开发、…...
2024全国大学生电子设计大赛全国初赛 E题 三子棋游戏装置 一等奖满分最简方案
感想:电赛初赛控制类题还是蛮简单的,别被五花八门的硬件搞懵了(决赛当我没说)。抓住核心,理念都是通用的。我是计科专业的,因此选择的控制类E题,相对来说背的知识要少很多,更考验智商…...
尚品汇-ES(三十一)
目录: (1)封装搜索相关实体对象 (2)搜索接口封装 (3)在service-list-client模块添加远程接口 (1)封装搜索相关实体对象 搜索参数实体:SearchParam 搜索参…...
NC 跳台阶
系列文章目录 文章目录 系列文章目录前言 前言 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站,这篇文章男女通用,看懂了就去分享给你的码吧。 描述 一只青蛙一次…...
linux 文件编程
1. 标准IO 也称为标准输入输出(Standard Input/Output),是计算机编程中一种常见的IO操作方式,特别是在C语言及其衍生语言中广泛使用。它主要通过标准C库中的函数来实现,提供了丰富的接口用于数据的输入和输出。 文本文…...
【后端速成 Vue】实现动态表白墙
前言: 通过前面几篇的文章的讲解,已经学习到了很多的 Vue 指令了,那么现在就将学习到的指令利用起来,做一个小的 demo。 最终效果图: 通过效果图可以发现,一共有这几个功能: ● 渲染列表&…...
【日常开发】 java返回ECharts数据结构封装
java返回ECharts数据结构封装 一、前端页面示例图如下: 二、准备测试数据: 三、后端 格式封装代码: 四、最终结果: 🎈边走、边悟🎈迟早会好 一、前端页面示例图如下: 二、准备测试数据&am…...
Table表格控件实现单选功能
Table表格控件实现单选功能 <el-tableref"tableRef"height"385"style"--el-table-border-color: none"row-key"contractId"highlight-current-rowsingle-selectselect"handleSelect":data"contractInfo">&l…...
AI技术加速落地 港科广联手思谋打开智能缺陷检测新纪元
AI 技术应用落地的元年,工业是主战场,尤其是工业缺陷检测。 在“生产制造-缺陷检测-工艺优化-生产制造”的智能制造闭环链条中,基于AI的智能缺陷检测扮演着“把关者”的角色。但这个把关者长期以来却缺少一个称手的工具——样本量大、精度高…...
Python爬虫开发:BeautifulSoup、Scrapy入门
在现代网络开发中,网络爬虫是一个非常重要的工具。它可以自动化地从网页中提取数据,并且可以用于各种用途,如数据收集、信息聚合和内容监控等。在Python中,有多个库可以用于爬虫开发,其中BeautifulSoup和Scrapy是两个非…...
数据科学、数据分析、人工智能必备知识汇总-----常用数据分析方法-----持续更新
数据科学、数据分析、人工智能必备知识汇总-----主目录-----持续更新(进不去说明我没写完):https://blog.csdn.net/grd_java/article/details/140174015 文章目录 一、对比分析法1. 按时间和地区2. 同比和环比 二、分组分析法三、结构分析法四、交叉分析法五、矩阵分…...
学习vue Router 一 起步,编程式导航,历史记录,路由传参
目录 起步,安装 1. 安装 2. 使用 命名路由 编程式导航 1. 字符串模式 2. 对象模式 3. 命名路由模式 历史记录 replace的使用 横跨历史 路由传参 1. query路由传参 2. 动态路由传参 3. 二者的区别 起步,安装 router 路由 因为vue是单页应用…...
Qt/C++最新地图组件发布/历时半年重构/同时支持各种地图内核/包括百度高德腾讯天地图
一、前言说明 最近花了半年时间,专门重构了整个地图组件,之前写的比较粗糙,有点为了完成功能而做的,没有考虑太多拓展性和易用性。这套地图自检这几年大量的实际项目和用户使用下来,反馈了不少很好的建议和意见&#…...
Laravel + Thinkphp 生成二维码
安装依赖 composer require endroid/qr-code 编写ThinkPhP代码 public function index() {// 创建二维码内容$qrCode new QrCode(Hello World);// 设置二维码的配置$qrCode->setSize(300);$qrCode->setMargin(10);// 获取二维码图像$writer new PngWriter();$result…...
Oracle查询表空间大小
1 查询数据库中所有的表空间以及表空间所占空间的大小 SELECTtablespace_name,sum( bytes ) / 1024 / 1024 FROMdba_data_files GROUP BYtablespace_name; 2 Oracle查询表空间大小及每个表所占空间的大小 SELECTtablespace_name,file_id,file_name,round( bytes / ( 1024 …...
Robots.txt 文件
什么是robots.txt? robots.txt 是一个位于网站根目录下的文本文件(如:https://example.com/robots.txt),它用于指导网络爬虫(如搜索引擎的蜘蛛程序)如何抓取该网站的内容。这个文件遵循 Robots…...
BCS 2025|百度副总裁陈洋:智能体在安全领域的应用实践
6月5日,2025全球数字经济大会数字安全主论坛暨北京网络安全大会在国家会议中心隆重开幕。百度副总裁陈洋受邀出席,并作《智能体在安全领域的应用实践》主题演讲,分享了在智能体在安全领域的突破性实践。他指出,百度通过将安全能力…...
深入解析C++中的extern关键字:跨文件共享变量与函数的终极指南
🚀 C extern 关键字深度解析:跨文件编程的终极指南 📅 更新时间:2025年6月5日 🏷️ 标签:C | extern关键字 | 多文件编程 | 链接与声明 | 现代C 文章目录 前言🔥一、extern 是什么?&…...
Angular微前端架构:Module Federation + ngx-build-plus (Webpack)
以下是一个完整的 Angular 微前端示例,其中使用的是 Module Federation 和 npx-build-plus 实现了主应用(Shell)与子应用(Remote)的集成。 🛠️ 项目结构 angular-mf/ ├── shell-app/ # 主应用&…...
GruntJS-前端自动化任务运行器从入门到实战
Grunt 完全指南:从入门到实战 一、Grunt 是什么? Grunt是一个基于 Node.js 的前端自动化任务运行器,主要用于自动化执行项目开发中重复性高的任务,例如文件压缩、代码编译、语法检查、单元测试、文件合并等。通过配置简洁的任务…...
Java数值运算常见陷阱与规避方法
整数除法中的舍入问题 问题现象 当开发者预期进行浮点除法却误用整数除法时,会出现小数部分被截断的情况。典型错误模式如下: void process(int value) {double half = value / 2; // 整数除法导致截断// 使用half变量 }此时...
群晖NAS如何在虚拟机创建飞牛NAS
套件中心下载安装Virtual Machine Manager 创建虚拟机 配置虚拟机 飞牛官网下载 https://iso.liveupdate.fnnas.com/x86_64/trim/fnos-0.9.2-863.iso 群晖NAS如何在虚拟机创建飞牛NAS - 个人信息分享...
CVPR2025重磅突破:AnomalyAny框架实现单样本生成逼真异常数据,破解视觉检测瓶颈!
本文介绍了一种名为AnomalyAny的创新框架,该方法利用Stable Diffusion的强大生成能力,仅需单个正常样本和文本描述,即可生成逼真且多样化的异常样本,有效解决了视觉异常检测中异常样本稀缺的难题,为工业质检、医疗影像…...
uni-app学习笔记三十五--扩展组件的安装和使用
由于内置组件不能满足日常开发需要,uniapp官方也提供了众多的扩展组件供我们使用。由于不是内置组件,需要安装才能使用。 一、安装扩展插件 安装方法: 1.访问uniapp官方文档组件部分:组件使用的入门教程 | uni-app官网 点击左侧…...


