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

GTest

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

GTest是什么

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

我们需要学习的GTest功能

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

宏断言

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

  • ASSERT_系列:如果当前检测失败则推出当前函数
  • EXPECT_系列: 如果当前检测失败则继续向下执行
cpp 复制代码
// 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
cpp 复制代码
TEST(test1, MYTEST) {

}

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

cpp 复制代码
testing::InitGoogleTest(&argc, argv);
RUN_ALL_TESTS();

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

事件机制

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

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

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

全局测试套件

cpp 复制代码
#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(),而且这个宏函数的第一个参数(总测试名称),一定要和套件环境类名一致。(在单元测试宏函数中,能够直接访问类成员变量)
cpp 复制代码
#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中。

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

cpp 复制代码
    virtual void SetUp() override { }
    virtual void TearDown() override { }

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

相关推荐
Dream-Y.ocean1 小时前
鸿蒙平台 Apache Tomcat 管理控制台适配实战:基于 Electron 壳方案的真实 HTTP 服务器实现
tomcat·apache·harmonyos
betazhou2 小时前
Apache seatunel常用配置参数解析说明
apache·seatunnel
凤山老林1 天前
Spring Boot 集成 Apache Kafka Streams 构建流处理应用:状态存储、窗口聚合与
spring boot·kafka·apache
DolphinScheduler社区2 天前
Apache DolphinScheduler 8 月报:权限安全加固,调度补火上线,性能与稳定性持续提升
大数据·安全·开源·apache·任务调度·海豚调度
sbjdhjd2 天前
从 7 字符文件名拼接到二维数组取值:PHP 无参函数限制下的受控靶场复盘 | (7字符绕过)
网络·nginx·安全·网络安全·云计算·php·apache
Jackyzhe3 天前
Apache Iceberg Variant 类型:v3 半结构化数据不再「二选一」
apache
Yeniden3 天前
Java 后端从零到企业级:第1篇 Java 基础语法——变量、数据类型与运算符
java·开发语言·apache
盟道科技5 天前
电商小程序SKU数据模型设计:SPU、规格组合、库存与价格的工程实践
服务器·小程序·apache
A-刘晨阳5 天前
时序数据基础设施选型手册:Apache IoTDB 技术深度解析与性能实战
apache·iotdb
吴声子夜歌6 天前
ApacheCommons——commons-exec(外部进程与系统命令安全执行)
java·安全·apache