当前位置: 首页 > news >正文

RabbitMQ的学习和模拟实现|GTest测试框架的介绍和简单使用

GTest

项目仓库:https://github.com/ffengc/HareMQ

  • GTest
    • GTest是什么
    • 我们需要学习的GTest功能
    • 宏断言
    • 事件机制
      • 全局测试套件
      • 独立测试套件

GTest是什么

GTest是一个跨平台的 C++单元测试框架,由google公司发布。gtest是为了在不同平台上为编写C++单元测试而生成的。它提供了丰富的断言、致命和非致命判断、参数化等等。

我们需要学习的GTest功能

  1. 简单的宏断言机制
  2. 事件机制(全局测试,单独用例测试)

宏断言

GTest中断言的宏可以分为两类:

  • ASSERT_系列:如果当前检测失败则推出当前函数
  • EXPECT_系列: 如果当前检测失败则继续向下执行
// bool值检查
ASSERT_TRUE(res)    // 期待res是true
ASSERT_FALSE(res)   // 期待res是false
//数值型数据检查
ASSERT_EQ(arg1, arg2) // arg1 == arg2 返回 true
ASSERT_NE(arg1, arg2) // arg1 != arg2 返回 true
ASSERT_LT(arg1, arg2) // arg1 < arg2  返回 true
ASSERT_GT(arg1, arg2) // arg1 > arg2  返回 true
ASSERT_LE(arg1, arg2) // arg1 <= arg2 返回 true
ASSERT_GE(arg1, arg2) // arg1 >= arg2 返回 true
TEST(test1, MYTEST) {}

所有的测试都要放在一个单元测试下才行的。宏的第一个参数表示“测试套件名称”,第二个参数表示“测试名称”。

testing::InitGoogleTest(&argc, argv);
RUN_ALL_TESTS();

通过这种方式来初始化和运行所有的测试。

事件机制

测试中,可以有多个测试套件(包含有一组单元测试)

测试套件: 可以理解成一个测试环境,可以在单元测试之前进行测试环境初始化,测试完毕后进行测试环境清理

  • 全局测试套件:在整体的测试中,只会初始化一次环境,在所有测试用例完毕后,才会清理环境
  • 用例测试套件:在每次的单元测试中,都会重新初始化测试环境,完毕后清理环境

全局测试套件

#include "../log.hpp"
#include <gtest/gtest.h>
#include <iostream>class MyEnv : public testing::Environment {
public:virtual void SetUp() override {LOG(INFO) << "before testing, init ..." << std::endl;}virtual void TearDown() override {LOG(INFO) << "after testing, clearing ..." << std::endl;}
};
TEST(MyEnv, test1) {LOG(INFO) << "unit test1" << std::endl;
}
TEST(MyEnv, test2) {LOG(INFO) << "unit test2" << std::endl;
}
int main(int argc, char** argv) {testing::AddGlobalTestEnvironment(new MyEnv);testing::InitGoogleTest(&argc, argv);auto res = RUN_ALL_TESTS();LOG(INFO) << "res: " << res << std::endl;return 0;
}

观察每条打印信息的位置,观察全局套件是何时初始化和何时清理的。

独立测试套件

  • 测试环境类中,可以定义成员变量,成员变量是独立的,是与当前测试套件相关的单元测试才能访问的。
  • 单元测试宏名称变成了TEST_F(),而且这个宏函数的第一个参数(总测试名称),一定要和套件环境类名一致。(在单元测试宏函数中,能够直接访问类成员变量)
#include "../log.hpp"
#include <gtest/gtest.h>
#include <iostream>
#include <unordered_map>class MyTest : public testing::Test {
public:static void SetUpTestCase() {LOG(INFO) << "before each suit test, init ..." << std::endl;}static void TearDownTestCase() {LOG(INFO) << "after each suit test, clearing ..." << std::endl;}virtual void SetUp() override { }virtual void TearDown() override { }
public:std::unordered_map<std::string, std::string> __map;
};TEST_F(MyTest, insert_test) {__map.insert({ "hello", "nihao" });__map.insert({ "bye", "zaijian" });
}
TEST_F(MyTest, size_test) {ASSERT_EQ(__map.size(), 2);
}int main(int argc, char** argv) {testing::InitGoogleTest(&argc, argv);auto res = RUN_ALL_TESTS();LOG(INFO) << "res: " << res << std::endl;return 0;
}

此时运行可以发现,是通过不了测试的,因为 __map 是每个测试单元独立的。所以insert_test里添加的数据不会出现在size_test中。

如果想让一开始就有两个数据,可以在:

    virtual void SetUp() override { }virtual void TearDown() override { }

进行全部的初始化,就是公共的初始化。

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 数据结构代码
  • Git基本使用
  • 3D建模软件--犀牛Rhino for Mac
  • Python应用—浅谈利用opencv去除水印
  • 创建最佳实践创建 XML 站点地图--SEO
  • 谷粒商城实战笔记-42-前端基础-Vue-生命周期和钩子函数
  • 深入浅出WebRTC—ULPFEC
  • 挖掘基于边缘无线协同感知的低功耗物联网 (LPIOT) 的巨大潜力
  • 《梦醒蝶飞:释放Excel函数与公式的力量》18.2 数据可视化技术
  • Lianwei 安全周报|2024.07.22
  • go语言UTC时间转换为中国时间
  • 技术文档总结----思维导图
  • C#基础:数据库分表的好处和实现方式
  • gradle 构建项目添加版本信息
  • npm create-react-app 项目名报错
  • .pyc 想到的一些问题
  • Apache Pulsar 2.1 重磅发布
  • C++回声服务器_9-epoll边缘触发模式版本服务器
  • Cookie 在前端中的实践
  • jQuery(一)
  • LeetCode29.两数相除 JavaScript
  • leetcode讲解--894. All Possible Full Binary Trees
  • miaov-React 最佳入门
  • React-生命周期杂记
  • Solarized Scheme
  • 协程
  • raise 与 raise ... from 的区别
  • ###项目技术发展史
  • #Datawhale AI夏令营第4期#AIGC方向 文生图 Task2
  • #基础#使用Jupyter进行Notebook的转换 .ipynb文件导出为.md文件
  • (12)目标检测_SSD基于pytorch搭建代码
  • (2)(2.4) TerraRanger Tower/Tower EVO(360度)
  • (3)Dubbo启动时qos-server can not bind localhost22222错误解决
  • (3)选择元素——(14)接触DOM元素(Accessing DOM elements)
  • (9)YOLO-Pose:使用对象关键点相似性损失增强多人姿态估计的增强版YOLO
  • (day 12)JavaScript学习笔记(数组3)
  • (二)换源+apt-get基础配置+搜狗拼音
  • (附源码)spring boot智能服药提醒app 毕业设计 102151
  • (更新)A股上市公司华证ESG评级得分稳健性校验ESG得分年均值中位数(2009-2023年.12)
  • (论文阅读32/100)Flowing convnets for human pose estimation in videos
  • (牛客腾讯思维编程题)编码编码分组打印下标题目分析
  • (未解决)macOS matplotlib 中文是方框
  • (原创)可支持最大高度的NestedScrollView
  • (转)IIS6 ASP 0251超过响应缓冲区限制错误的解决方法
  • **Java有哪些悲观锁的实现_乐观锁、悲观锁、Redis分布式锁和Zookeeper分布式锁的实现以及流程原理...
  • .bat批处理(三):变量声明、设置、拼接、截取
  • .FileZilla的使用和主动模式被动模式介绍
  • .NET Compact Framework 多线程环境下的UI异步刷新
  • .net 逐行读取大文本文件_如何使用 Java 灵活读取 Excel 内容 ?
  • .NET编程C#线程之旅:十种开启线程的方式以及各自使用场景和优缺点
  • .NET企业级应用架构设计系列之应用服务器
  • .NET实现之(自动更新)
  • []C/C++读取串口接收到的数据程序
  • [000-01-022].第03节:RabbitMQ环境搭建
  • [023-2].第2节:SpringBoot中接收参数相关注解