仿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之后执行。

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Spring Boot 3.x Filter实战:记录请求日志

上一篇&#xff1a;Spring Boot 3.x Web单元测试最佳实践 下一篇&#xff1a;Spring Boot 3.x Web MVC实战&#xff1a;实现流缓存的request 前面我们在《Spring Boot 3.x Rest API最佳实践之统一响应结构》中学习响应的统一拦截处理&#xff0c;顺带完成了响应结果的记录&am…

06:【stm32】OLED模块的简单使用

OLED模块的简单使用 OLED简单的使用 OLED简单的使用 OLED驱动函数是使用B站UP江科大的。我们直接调用即可&#xff0c;是使用软件模拟I2C协议进行通信的。具体的I2C协议可查看上官嵌入式开发中的C51单片机开发。 驱动函数文件&#xff1a;通过百度网盘分享的文件&#xff1a;…

2024 年的 Node.js 生态系统

数据来源于 Node.js Toolbox&#xff0c;网站展示了 Node.js 生态系统中积极维护且流行的库。

【Linux】lvm被删除或者lvm丢失了怎么办

模拟案例 接下来模拟lvm误删除如何恢复的案例&#xff1a; 模拟删除&#xff1a; 查看vg名&#xff1a; vgdisplayvgcfgrestore --list uniontechos #查看之前的操作 例如我删除的&#xff0c;现场没有删除就用最近的操作文件&#xff1a; 还原&#xff1a; vgcfgrestore…

Java实战一 手动创建springboot3+mybatis+mysql工程

idea手动创建sb工程&#xff0c;选择好配置&#xff0c;使用jdk17 main下补全目录resource resource下补全application.yml 引入依赖 &#xff0c;写入父工程 刷新maven 补全配置 创建所需目录 创建User实体类 创建启动类BootDemoApplication 运行启动类成功看到运行在8080端…

#include “ascii_font.c“ 引入源文件,Keil5为什么没有提示重复定义错误,详解!!!

目录 相关原理 Keil编译器规则 重点知识.c文件和.h文件的处理方式和用途 为什么在 example.c文件中需要这条指令#include "example.h" 没有包含会怎么样 配置前提 首先没有提示重复定义.c文件进行报错的前提是&#xff0c;Keil5中没有添加这源文件&#xff…

Linux服务管理(五)Apache服务优化

CustomLog "|/bin/rotatelogs -l /wwwlogs/access_%Y%m%d.log 86400" combined日志旋转可参考这篇文章&#xff1a; https://blog.csdn.net/weixin_43576565/article/details/139989701 要优化首先你得有Apache yum -y install httpd启动 service httpd start写入…

yolov8人脸识别案例

GitHub - wangWEI201901/YOLOv8-Detection-Project: &#x1f6e3;️基于YOLOv8的智慧校园人脸识别和公路汽车检测

5、关于kali搭建vulhub

Vulhub是一个基于Docker和Docker-compose的漏洞靶场环境&#xff0c;所以搭建vulhub分三步&#xff1a; 1、安装docker 2、安装docker-compose 3、安装vulhub 一、安装步骤 1、安装docker 因为kali太久没用&#xff0c;所以需要先更新软件列表最新源 apt-get update 安装do…

DC-DC高压输入30V/10W全桥拓扑结构隔离开关电源专用芯片

概述&#xff1a; PC6703 是一款专门为小体积、低待机功耗的微功率隔离电源而设计的变压器驱动器&#xff0c;其外围只需匹配简单的输入输出滤波电容、隔离变压器和整流电路&#xff0c;即可实现 6~30V 输入电压、多种输出电压、输出功率1 ~10W 的隔离电源。 PC6703 内部集成…

C++11新特性总结

相比于C98/03&#xff0c;C11是C程序设计语言标准的一个新的版本&#xff0c;在2011年由ISO批准并发布。C11新标准从而代替了原来的C98和C03。C11标准是对C的一次巨大的改进和扩充。在核心语法&#xff0c;STL标准模板等方面增加众多新功能&#xff0c;新亮点。C11能够更好地用…

Pinterest:从 Druid 到 StarRocks,实现 6 倍成本效益比提升

导读&#xff1a; 开源无国界&#xff0c;StarRocks 自开源以来&#xff0c;近3年的时间里已在全球数据技术领域崭露头角。我们欣喜地发现&#xff0c;越来越多的海外用户正在使用并积极推广着 StarRocks。为了促进知识共享&#xff0c;StarRocks中文社区将精选优秀文章与大家共…

【知识专栏丨python数分实战】天猫订单数据分析及可视化|taobao天猫订单接口

今天这篇文章将给大家介绍天猫订单数据分析及可视化案例。 import pandas as pdimport numpy as npfrom pyecharts.charts import Pie,Bar,Line,Map,Map3D,Funnelfrom pyecharts import options as optsimport matplotlib.pyplot as pltimport warningsimport seaborn as snsfr…

线性表——数据结构

线性表 文章目录 线性表线性表的定义和基本操作线性表的定义线性表的基本操作 线性表的顺序表示顺序表的定义顺序表的实现——静态分配顺序表的实现——动态分配顺序表的特点 线性表的定义和基本操作 线性表的定义 线性表&#xff08;Linear List&#xff09;的定义 ​ 线性…

LabVIEW电机测试系统

LabVIEW电机测试系统采用共直流母线架构&#xff0c;优化能量循环方式&#xff0c;实现内部能量循环。系统利用高精度仪器与先进软件技术&#xff0c;提供了一个高效、可靠的测试平台&#xff0c;适用于200 kW以下的交流异步电机和永磁同步电机的性能及耐久性测试。 项目背景 …

回归预测|基于麻雀优化深度神经网络的数据回归预测Matlab程序SSA-DNN 多特征输入单输出 含基础深度神经网络DNN

回归预测|基于麻雀优化深度神经网络的数据回归预测Matlab程序SSA-DNN 多特征输入单输出 含基础深度神经网络DNN 文章目录 前言回归预测|基于麻雀优化深度神经网络的数据回归预测Matlab程序SSA-DNN 多特征输入单输出 含基础深度神经网络DNN 一、SSA-DNN模型1. 麻雀优化算法&…

【LVS】部署NAT模式集群

一、实验环境 每台主机的防火墙和SELinux都要关掉 systemctl stop firewalld setenforce 0 client&#xff08;测试机&#xff09;&#xff1a; ip 172.25.254.50 lvs&#xff08;调度器&#xff09;&#xff1a; vip 172.25.254.100 dip 192.168.0.100 RS1&#xff08;真实服…

【Linux】【网络】进程间关系与守护进程

进程间关系与守护进程 文章目录 1.进程组1.1什么是进程组1.2组长进程 2.会话2.1什么是会话2.2如何创建会话 3.作业3.1什么是作业、作业控制&#xff1f;3.2作业号3.3常见作业状态3.4作业的切换 4.守护进程4.1什么是守护进程&#xff1f;4.2如何创建守护进程4.3模拟实现daemon …

单片机GPIO模式和应用

Push pull 推挽输出 定义&#xff1a;推挽输出是一种输出模式&#xff0c;其中引脚可以输出高电平或低电平&#xff0c;且两种电平状态下都具有较强的驱动能力。 特点&#xff1a; 无论输出高电平还是低电平&#xff0c;都有较强的电流驱动能力。 适用于驱动外部数字电路…

抖店飞鸽客服自动回复软件开发教程与下载体验(.NET版)

转载请注明出处&#xff01; 原文链接&#xff1a;https://blog.csdn.net/zgyulongfei/article/details/140960430 本文适合的读者为&#xff1a; 抖店&#xff08;抖音小店&#xff09;个体商家&#xff1b;抖店店群商家&#xff08;店群商家&#xff1a;指的是开了几十个抖…