首页 > 其他分享 >Awaitility同步异步工具介绍与RocketMQ中实战

Awaitility同步异步工具介绍与RocketMQ中实战

时间:2022-12-12 10:06:09浏览次数:72  
标签:Awaitility 异步 Thread awaitility 例子 时间 sleep RocketMQ

在编写测试用例的时候遇到有异步或者队列处理的时候经常会用到 ​​Thread.sleep()​​ 等待来进行测试。例如:​​DLedger​​ 测试选举的过程。当DLedger Leader下线。此时DLedger会重新发起选举,这个选举的过程是需要一定时间。很多时候在测试代码中就会使用 ​​Thread.sleep​​ 。 由于选举需要的时间多少不确定所以sleep时间就会设置为开发者经验的最大值。这样会造成测试代码会变得很慢。 当然开发者可以通过自己轮询来实现减少时间的消耗。

下面介绍一个处理这个一类问题的工具:​awaitility

1. awaitility入门

Maven:

<dependency>
<groupId>org.awaitility</groupId>
<artifactId>awaitility</artifactId>
<version>xxxx</version>
<scope>test</scope>
</dependency>

文章编写的时候版本为:4.2.0

1.1 静态导入

为了有效地使用Awaitility,建议从Awaitility框架中静态地导入以下方法:

  • ​org.awaitility.Awaitility.*​

在使用的时候需要搭配Java的时间相关的类以及Junit相关类:

  • ​java.time.Duration.*​
  • ​java.util.concurrent.TimeUnit.*​
  • ​org.junit.Assert.*​

1.1 简单例子

例子1:

await().until(newUserIsAdded());

等待直到执行newUserIsAdded()返回true. 这个是没有返回值的。

例子2:

await().atMost(5, SECONDS).until(newUserWasAdded());

最多等待5秒,等待直到执行newUserIsAdded()返回true. 这个是没有返回值的。

例子3:

await().until( userRepositorySize(), equalTo(1) );

等待直到执行userRepositorySize()返回方法对应的值. 这个是有返回值

更多的例子可以​参照官网​ 使用例子

2. awaitility在RocketMQ中的实战

在RocketMQ的test cases 中有一些使用了 Thread.sleep,接下来我们看看如何使用awaitility进行优化,减少测试用例的执行时间。以ControllerManagerTest测试用例为例子来解决,在代码中可以看到有这样的代码:


Awaitility同步异步工具介绍与RocketMQ中实战_单元测试

上图框出来的代码主要的作用是什么呢?等待Broker的Master过期,但是过期的时间我们根据设置的心跳的过期时间来预估时间。所以这里填写的是6秒当然你也可以填写10秒或者更长。

解决之前的执行时间

Awaitility同步异步工具介绍与RocketMQ中实战_单元测试_02

使用awaitility对代码进行改造重构

Awaitility同步异步工具介绍与RocketMQ中实战_执行时间_03

重构后的代码,如上图的红线框出来部分。当然我这里还对其他的进行处理。

有兴趣的可以关注一下RocketMQ的这个​​ISSUE#4873​​, 后续我这边还会对其他的测试用例进优化提交相对应的PR

使用awaitility重构后的执行时间

Awaitility同步异步工具介绍与RocketMQ中实战_测试用例_04

时间有明显的下降。相比之前的下降了5秒左右。

3. 总结

  • 在测试过程中引入awaitility能够很大程度上方便测试,无需要每次都凭经验去预估时间。并且很多时候这个Thread.sleep的时间不是很好估算。减少了单元测试执行的时间。特别是像RocketMQ这样大型的项目单元测试很多。并且很多都是去测试分布式的,如果使用Thread.sleep会导致整个单元测试的时间很长。
  • 无需自己去实现轮询来减少单元测试的时间。

标签:Awaitility,异步,Thread,awaitility,例子,时间,sleep,RocketMQ
From: https://blog.51cto.com/u_15733182/5929060

相关文章

  • 回顾 | Apache Flink X Apache RocketMQ · 上海站(PPT下载)
    7月6日,ApacheFlinkMeetupXApacheRocketMQ·上海站,来自阿里巴巴、网易的Flink技术专家与ApacheRocketMQ社区大咖一起分享关于Flink、RocketMQ的应用实践与......
  • RocketMQ详细配置与使用
    一、MQ介绍1.1为什么要用MQ消息队列是一种“先进先出”的数据结构其应用场景主要包含以下3个方面1)应用解耦系统的耦合性越高,容错性就越低。以电商应用为例,用户创建......
  • python高性能异步爬虫
    目的:在爬虫中使用异步实现高性能的数据爬取操作。异步爬虫的方式:1、多线程,多进程(不建议):好处:可以为相关阻塞的操作单独开启线程,阻塞操作就可以异步执行。弊端:无法无限制的开......
  • 异步批处理教程
    书接上回大数据量、高并发业务怎么优化?(一)文章中介绍了异步批处理的三种方式,本文继续深入针对前两种进行讲解,并给出代码示例:一普通版本,采用阻塞队列 ArrayBlockingQue......
  • 【工具】简陋的异步转同步队列
    前言最近碰到一个场景,在开发一个需求的过程中将系统的接口封装了一层,但是系统接口全部是以异步的形式回调的,这导致两个问题:外部操作传入封装类的时候,上一次的操作还未完......
  • [转]React hooks useEffect中如何使用异步函数(即如何使用async/await)
    1.useEffect的回调参数返回的是一个清除副作用的clean-up函数。因此无法返回Promise,更无法使用async/await2.如何让useEffect支持async/await2.1、方法一(推荐):useEf......
  • 专访|开源之夏最佳质量奖 Apache RocketMQ Committer 黄章衡
    随着开源之夏2022年度优秀学生名单出炉,其中ApacheRocketMQCommitter黄章衡同学获得开源之夏最佳质量奖。今天,我们也带来黄章衡同学的人物专访。https://summer-ospp.a......
  • js中如何顺序执行异步任务
    在js中,任务可分为两种,同步任务和异步任务。(1)同步任务又叫非耗时任务,指的是在主线程排队执行的那些任务只有前一个任务执行完毕,才能执行后一个任务(2)异步任务又......
  • JavaScript入门⑨-异步编程●异世界之旅
    JavaScript入门系列目录JavaScript入门①-基础知识筑基JavaScript入门②-函数(1)基础{浅出}JavaScript入门③-函数(2)原理{深入}执行上下文JavaScript入门④-万物皆......
  • 关于异步在操作系统层面的支持
    DMA(直接内存访问)拥有DMA功能的硬件在和内存进行数据交换的时候可以不消耗CPU资源。只要CPU在发起数据传输时发送一个指令,硬件就开始自己和内存交换数据,在传输完成之后......