【消息队列开发】 实现MemoryDataCenterTests类——测试管理内存数据

简介: 【消息队列开发】 实现MemoryDataCenterTests类——测试管理内存数据

🍃前言

本次开发任务:对MemoryDataCenter(管理内存数据) 进行功能测试

🌳测试准备

创建两个方法,分别在每个测试单元前执行与每个单元后执行

测试单元前,创建一个 MemoryDataCenter 的对象

测试单元后,将这个对象置为 null

代码执行如下:

private MemoryDataCenter memoryDataCenter = null;
@BeforeEach
public void setUp() {
    memoryDataCenter = new MemoryDataCenter();
}
@AfterEach
public void tearDown() {
    memoryDataCenter = null;
}

🎋测试交换机与队列

首先为了测试,我们的创建交换机与队列

其次再进行测试,测试步骤都分为四步

  1. 构造一个交换机/队列插入内存中
  2. 查询出这个交换机/对列, 比较结果是否一致. 此处直接比较这俩引用指向同一个对象
  3. 删除这个交换机/队列
  4. 再次查询,看是否已经查不到了

需要注意的时:

  • 我们再判断是否为null用的是:Assertions.assertNull()

代码实现如下:

// 创建一个测试交换机
private Exchange createTestExchange(String exchangeName) {
    Exchange exchange = new Exchange();
    exchange.setName(exchangeName);
    exchange.setType(ExchangeType.DIRECT);
    exchange.setAutoDelete(false);
    exchange.setDurable(true);
    return exchange;
}
// 创建一个测试队列
private MSGQueue createTestQueue(String queueName) {
    MSGQueue queue = new MSGQueue();
    queue.setName(queueName);
    queue.setDurable(true);
    queue.setExclusive(false);
    queue.setAutoDelete(false);
    return queue;
}
// 针对交换机进行测试
@Test
public void testExchange() {
    // 1. 先构造一个交换机并插入.
    Exchange expectedExchange = createTestExchange("testExchange");
    memoryDataCenter.insertExchange(expectedExchange);
    // 2. 查询出这个交换机, 比较结果是否一致. 此处直接比较这俩引用指向同一个对象.
    Exchange actualExchange = memoryDataCenter.getExchange("testExchange");
    Assertions.assertEquals(expectedExchange, actualExchange);
    // 3. 删除这个交换机
    memoryDataCenter.deleteExchange("testExchange");
    // 4. 再查一次, 看是否就查不到了
    actualExchange = memoryDataCenter.getExchange("testExchange");
    Assertions.assertNull(actualExchange);
}
// 针对队列进行测试
@Test
public void testQueue() {
    // 1. 构造一个队列, 并插入
    MSGQueue expectedQueue = createTestQueue("testQueue");
    memoryDataCenter.insertQueue(expectedQueue);
    // 2. 查询这个队列, 并比较
    MSGQueue actualQueue = memoryDataCenter.getQueue("testQueue");
    Assertions.assertEquals(expectedQueue, actualQueue);
    // 3. 删除这个队列
    memoryDataCenter.deleteQueue("testQueue");
    // 4. 再次查询队列, 看是否能查到
    actualQueue = memoryDataCenter.getQueue("testQueue");
    Assertions.assertNull(actualQueue);
}

🎍测试绑定

首先我们构造一个绑定对象

然后添加该绑定对象

获取绑定对象时,我们需要注意的是:我们书写过两个获取绑定对象的方法

  • 一个是通过交换机的名字与队列名字查找的唯一绑定
  • 一个是通过交换机的名字返回所有绑定

关于唯一绑定,只需要查询,然后比对是否为统一对象即可

关于所有哦绑定,我们还需要多做的判断是:我们获取的链表的长度是否为1

删除相应绑定后,我们只需要判断是否已经null即可

代码实现如下:

// 针对绑定进行测试
@Test
public void testBinding() throws MqException {
    Binding expectedBinding = new Binding();
    expectedBinding.setExchangeName("testExchange");
    expectedBinding.setQueueName("testQueue");
    expectedBinding.setBindingKey("testBindingKey");
    memoryDataCenter.insertBinding(expectedBinding);
    Binding actualBinding = memoryDataCenter.getBinding("testExchange", "testQueue");
    Assertions.assertEquals(expectedBinding, actualBinding);
    ConcurrentHashMap<String, Binding> bindingMap = memoryDataCenter.getBindings("testExchange");
    Assertions.assertEquals(1, bindingMap.size());
    Assertions.assertEquals(expectedBinding, bindingMap.get("testQueue"));
    memoryDataCenter.deleteBinding(expectedBinding);
    actualBinding = memoryDataCenter.getBinding("testExchange", "testQueue");
    Assertions.assertNull(actualBinding);
}

🍀测试总消息

在前面存储消息是,我们有两种存储结构

  • 一种是key:消息ID ,value:消息对象
  • 一种是key:消息ID, value:装有消息对象的链表

这次我们先来测试前一种

首相我们准备一个创建消息的方法,用来构造消息

然后测试步骤依旧分为四步:

  1. 添加消息
  2. 取出消息
  3. 对比消息对象是否为同一个
  4. 删除消息后查看是否为 null

代码实现如下:

private Message createTestMessage(String content) {
    Message message = Message.createMessageWithId("testRoutingKey", null, content.getBytes());
    return message;
}
@Test
public void testMessage() {
    Message expectedMessage = createTestMessage("testMessage");
    memoryDataCenter.addMessage(expectedMessage);
    Message actualMessage = memoryDataCenter.getMessage(expectedMessage.getMessageId());
    Assertions.assertEquals(expectedMessage, actualMessage);
    memoryDataCenter.removeMessage(expectedMessage.getMessageId());
    actualMessage = memoryDataCenter.getMessage(expectedMessage.getMessageId());
    Assertions.assertNull(actualMessage);
}

🎄测试消息链表

测试步骤分为以下三步:

  1. 创建一个队列, 创建 10 条消息, 把这些消息都插入队列中.
  2. 从队列中取出这些消息
  3. 比较取出的消息和之前的消息是否一致

代码实现如下:

@Test
public void testSendMessage() {
    // 1. 创建一个队列, 创建 10 条消息, 把这些消息都插入队列中.
    MSGQueue queue = createTestQueue("testQueue");
    List<Message> expectedMessages = new ArrayList<>();
    for (int i = 0; i < 10; i++) {
        Message message = createTestMessage("testMessage" + i);
        memoryDataCenter.sendMessage(queue, message);
        expectedMessages.add(message);
    }
    // 2. 从队列中取出这些消息.
    List<Message> actualMessages = new ArrayList<>();
    while (true) {
        Message message = memoryDataCenter.pollMessage("testQueue");
        if (message == null) {
            break;
        }
        actualMessages.add(message);
    }
    // 3. 比较取出的消息和之前的消息是否一致.
    Assertions.assertEquals(expectedMessages.size(), actualMessages.size());
    for (int i = 0; i < expectedMessages.size(); i++) {
        Assertions.assertEquals(expectedMessages.get(i), actualMessages.get(i));
    }
}

🌴测试待确认消息

测试步骤分为四步走

  1. 添加未确认消息
  2. 取出消息
  3. 判断消息是否为同一对象
  4. 删除后判定是否null

代码实现如下:

@Test
public void testMessageWaitAck() {
    Message expectedMessage = createTestMessage("expectedMessage");
    memoryDataCenter.addMessageWaitAck("testQueue", expectedMessage);
    Message actualMessage = memoryDataCenter.getMessageWaitAck("testQueue", expectedMessage.getMessageId());
    Assertions.assertEquals(expectedMessage, actualMessage);
    memoryDataCenter.removeMessageWaitAck("testQueue", expectedMessage.getMessageId());
    actualMessage = memoryDataCenter.getMessageWaitAck("testQueue", expectedMessage.getMessageId());
    Assertions.assertNull(actualMessage);
}

🌲从硬盘上读取数据

从硬盘上读取数据,首先我们要构造硬盘上的数据。

而且由于我们构造这些数据时,会涉及到数据库操作,, 依赖 MyBatis. 就需要先启动 SpringApplication, 这样才能进行后续的数据库操作.

然后先在硬盘上构造好数据,然后再构造交换机、队列、绑定、消息

接下来进行结果的比对

最后清理硬盘的数据, 把整个 data 目录里的内容都删掉(包含了 meta.db 和 队列的目录).

实现代码如下:

@Test
public void testRecovery() throws IOException, MqException, ClassNotFoundException {
    // 由于后续需要进行数据库操作, 依赖 MyBatis. 就需要先启动 SpringApplication, 这样才能进行后续的数据库操作.
    MqApplication.context = SpringApplication.run(MqApplication.class);
    // 1. 在硬盘上构造好数据
    DiskDataCenter diskDataCenter = new DiskDataCenter();
    diskDataCenter.init();
    // 构造交换机
    Exchange expectedExchange = createTestExchange("testExchange");
    diskDataCenter.insertExchange(expectedExchange);
    // 构造队列
    MSGQueue expectedQueue = createTestQueue("testQueue");
    diskDataCenter.insertQueue(expectedQueue);
    // 构造绑定
    Binding expectedBinding = new Binding();
    expectedBinding.setExchangeName("testExchange");
    expectedBinding.setQueueName("testQueue");
    expectedBinding.setBindingKey("testBindingKey");
    diskDataCenter.insertBinding(expectedBinding);
    // 构造消息
    Message expectedMessage = createTestMessage("testContent");
    diskDataCenter.sendMessage(expectedQueue, expectedMessage);
    // 2. 执行恢复操作
    memoryDataCenter.recovery(diskDataCenter);
    // 3. 对比结果
    Exchange actualExchange = memoryDataCenter.getExchange("testExchange");
    Assertions.assertEquals(expectedExchange.getName(), actualExchange.getName());
    Assertions.assertEquals(expectedExchange.getType(), actualExchange.getType());
    Assertions.assertEquals(expectedExchange.isDurable(), actualExchange.isDurable());
    Assertions.assertEquals(expectedExchange.isAutoDelete(), actualExchange.isAutoDelete());
    MSGQueue actualQueue = memoryDataCenter.getQueue("testQueue");
    Assertions.assertEquals(expectedQueue.getName(), actualQueue.getName());
    Assertions.assertEquals(expectedQueue.isDurable(), actualQueue.isDurable());
    Assertions.assertEquals(expectedQueue.isAutoDelete(), actualQueue.isAutoDelete());
    Assertions.assertEquals(expectedQueue.isExclusive(), actualQueue.isExclusive());
    Binding actualBinding = memoryDataCenter.getBinding("testExchange", "testQueue");
    Assertions.assertEquals(expectedBinding.getExchangeName(), actualBinding.getExchangeName());
    Assertions.assertEquals(expectedBinding.getQueueName(), actualBinding.getQueueName());
    Assertions.assertEquals(expectedBinding.getBindingKey(), actualBinding.getBindingKey());
    Message actualMessage = memoryDataCenter.pollMessage("testQueue");
    Assertions.assertEquals(expectedMessage.getMessageId(), actualMessage.getMessageId());
    Assertions.assertEquals(expectedMessage.getRoutingKey(), actualMessage.getRoutingKey());
    Assertions.assertEquals(expectedMessage.getDeliverMode(), actualMessage.getDeliverMode());
    Assertions.assertArrayEquals(expectedMessage.getBody(), actualMessage.getBody());
    // 4. 清理硬盘的数据, 把整个 data 目录里的内容都删掉(包含了 meta.db 和 队列的目录).
    MqApplication.context.close();
    File dataDir = new File("./data");
    FileUtils.deleteDirectory(dataDir);
}

⭕总结

关于《【消息队列开发】 实现MemoryDataCenterTests类——测试管理内存数据》就讲解到这儿,感谢大家的支持,欢迎各位留言交流以及批评指正,如果文章对您有帮助或者觉得作者写的还不错可以点一下关注,点赞,收藏支持一下

相关文章
|
3月前
|
数据采集 算法 测试技术
【硬件测试】基于FPGA的1024QAM基带通信系统开发与硬件片内测试,包含信道模块,误码统计模块,可设置SNR
本文介绍了基于FPGA的1024QAM基带通信系统的硬件测试版本,包含testbench、高斯信道模块和误码率统计模块。系统新增ila在线数据采集和vio在线SNR设置模块,支持不同SNR条件下的性能测试。1024QAM调制将10比特映射到复平面上的1024个星座点之一,实现高效数据传输。硬件测试结果表明,在SNR=32dB和40dB时,系统表现出良好的性能。Verilog核心程序展示了各模块的连接与功能实现。
89 7
|
2月前
|
机器学习/深度学习 人工智能 并行计算
AI部署架构:A100、H100、A800、H800、H20的差异以及如何选型?开发、测试、生产环境如何进行AI大模型部署架构?
AI部署架构:A100、H100、A800、H800、H20的差异以及如何选型?开发、测试、生产环境如何进行AI大模型部署架构?
AI部署架构:A100、H100、A800、H800、H20的差异以及如何选型?开发、测试、生产环境如何进行AI大模型部署架构?
|
3月前
|
数据采集 算法 数据安全/隐私保护
【硬件测试】基于FPGA的4ASK调制解调通信系统开发与硬件片内测试,包含信道模块,误码统计模块,可设置SNR
本文介绍了基于FPGA的4ASK调制解调系统的硬件测试版本,该系统包括testbench、高斯信道模块和误码率统计模块,并新增了ILA在线数据采集和VIO在线SNR设置功能。通过VIO设置不同SNR(如15dB和25dB),实现了对系统性能的实时监测与调整。4ASK是一种通过改变载波幅度表示数据的数字调制方式,适用于多种通信场景。FPGA平台的高效性和灵活性使其成为构建高性能通信系统的理想选择。
104 17
|
3月前
|
数据采集 算法 数据安全/隐私保护
【硬件测试】基于FPGA的4FSK调制解调通信系统开发与硬件片内测试,包含信道模块,误码统计模块,可设置SNR
本文基于之前的文章《基于FPGA的4FSK调制解调系统》,增加了ILA在线数据采集模块和VIO在线SNR设置模块,实现了硬件测试版本。通过VIO设置不同SNR(如10dB和20dB),并展示了ILA采集的数据结果。四频移键控(4FSK)是一种数字调制方法,利用四个不同频率传输二进制数据,具有较高的频带利用率和抗干扰性能。输入的二进制数据分为两组,每组两个比特,对应四个频率f1、f2、f3、f4,分别代表二进制组合00、01、10、11。调制过程中选择相应频率输出,并进行幅度调制以增强抗干扰能力。接收端通过带通滤波器提取信号并还原为原始二进制数据。
82 7
|
3月前
|
数据采集 算法 数据处理
【硬件测试】基于FPGA的256QAM基带通信系统开发与硬件片内测试,包含信道模块,误码统计模块,可设置SNR
本文介绍了基于FPGA的256QAM基带通信系统的硬件测试版本,包含testbench、高斯信道模块和误码率统计模块。系统新增ila在线数据采集和vio在线SNR设置模块,支持不同信噪比(如30dB和40dB)的仿真测试,并提供配套操作视频。256QAM调制方案每个符号携带8比特信息,通过复数值星座图映射实现高效传输。Verilog代码展示了核心模块设计,包括SNR设置、数据处理和ILA测试分析,确保系统在实际硬件环境中的稳定性和性能。
53 2
|
4月前
|
数据采集 算法 数据安全/隐私保护
【硬件测试】基于FPGA的16QAM基带通信系统开发与硬件片内测试,包含信道模块,误码统计模块,可设置SNR
本文介绍了基于FPGA的16QAM基带通信系统硬件测试版本。该系统在仿真基础上增加了ILA在线数据采集和VIO在线SNR设置模块,支持不同信噪比(如15dB、25dB)的测试。16QAM是一种正交幅度调制方式,通过两路4ASK信号叠加实现,每个符号包含4比特信息。系统采用正交调幅法生成16QAM信号,并通过DAC转换为模拟信号。解调时使用正交相干解调,经低通滤波器恢复电平信号。开发板内完成发射与接收,无需定时同步模块。代码可移植至其他开发板,具体步骤见配套文档。
72 2
|
4月前
|
数据采集 算法 数据安全/隐私保护
【硬件测试】基于FPGA的64QAM基带通信系统开发与硬件片内测试,包含信道模块,误码统计模块,可设置SNR
本文介绍了基于FPGA的64QAM基带通信系统的硬件测试版本,包含testbench、高斯信道模块和误码率统计模块。系统新增ila在线数据采集模块和vio在线SNR设置模块,支持不同SNR条件下的仿真与测试。通过设置SNR为25dB和30dB进行测试,验证了系统的可行性和性能。此外,本文详细阐述了64QAM调制解调的工作原理,包括信号生成、调制、解调及误码率测试等环节,并提供了Verilog核心程序代码。
51 0
|
6天前
|
Java 测试技术 容器
Jmeter工具使用:HTTP接口性能测试实战
希望这篇文章能够帮助你初步理解如何使用JMeter进行HTTP接口性能测试,有兴趣的话,你可以研究更多关于JMeter的内容。记住,只有理解并掌握了这些工具,你才能充分利用它们发挥其应有的价值。+
152 23
|
5月前
|
数据可视化 前端开发 测试技术
接口测试新选择:Postman替代方案全解析
在软件开发中,接口测试工具至关重要。Postman长期占据主导地位,但随着国产工具的崛起,越来越多开发者转向更适合中国市场的替代方案——Apifox。它不仅支持中英文切换、完全免费不限人数,还具备强大的可视化操作、自动生成文档和API调试功能,极大简化了开发流程。
|
2月前
|
SQL 安全 测试技术
2025接口测试全攻略:高并发、安全防护与六大工具实战指南
本文探讨高并发稳定性验证、安全防护实战及六大工具(Postman、RunnerGo、Apipost、JMeter、SoapUI、Fiddler)选型指南,助力构建未来接口测试体系。接口测试旨在验证数据传输、参数合法性、错误处理能力及性能安全性,其重要性体现在早期发现问题、保障系统稳定和支撑持续集成。常用方法包括功能、性能、安全性及兼容性测试,典型场景涵盖前后端分离开发、第三方服务集成与数据一致性检查。选择合适的工具需综合考虑需求与团队协作等因素。
220 24