Awaitility同步异步工具实战示例详解_java

来源:脚本之家  责任编辑:小易  
目录
引言1. awaitility入门1.1 静态导入1.2 简单例子2. awaitility在RocketMQ中的实战3. 总结

引言

在编写测试用例的时候遇到有异步或者队列处理的时候经常会用到 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.2 简单例子

例子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测试用例为例子来解决,在代码中可以看到有这样的代码:

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

解决之前的执行时间:

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

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

有兴趣的可以关注一下RocketMQ的这个ISSUE:github.com/apache/rock…

使用awaitility重构后的执行时间:

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

3. 总结

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

以上就是Awaitility同步异步工具实战示例详解的详细内容,更多关于Awaitility同步异步工具实的资料请关注真格学网其它相关文章!

您可能感兴趣的文章:Spring的事件和监听器-同步与异步详解Java异步调用转同步的方法Java异步调用转同步方法实例详解java同步与异步的学习笔记整理Java系统中拆分同步和异步详解详解java 三种调用机制(同步、回调、异步)

  • 本文相关:
  • 使用shiro实现登录成功后跳转到之前的页面
  • 如何使用try-with-resource机制关闭连接
  • 利用log4j将不同package的日志输出到不同文件的方法
  • 深入理解spring boot 监控
  • 使用idea将工具类打包使用的详细教程
  • 详解java序列化机制
  • springmvc中拦截器的实现
  • springboot 2.0 整合sharding-jdbc中间件实现数据分库分表
  • java8新特性之类型注解_动力节点java学院整理
  • 二维码生成java实现代码
  • 如何正确理解.NET 4.5和C#5.0中的async/await异步编程模式
  • 如何正确理解.NET 4.5和C#5.0中的async/await异步编程模式
  • countdownlatch 进行异步转同步操作,退出时为什么countdown
  • async await和promise区别是什么?
  • async await和promise的区别是什么?
  • async和await有什么区别?
  • promise与asynsawait区别?
  • await async和***.run的区别?
  • 使用async await 封装 axios的方法
  • 有人关注C#5新加的关键字async和await么
  • 在JS循环中使用async/await的方法
  • ES7之Async/await的使用详解
  • async/await地狱该如何避免详解
  • async/await成对匹配,不是一个死循环吗
  • c#async await 一般用在什么位置
  • C#的异步编程是什么?请问代码要怎么写?
  • c#event 怎么实现async await
  • 网站首页网页制作脚本下载服务器操作系统网站运营平面设计媒体动画电脑基础硬件教程网络安全c#教程vbvb.netc 语言java编程delphijavaandroidiosswiftscala易语言汇编语言r语言其它相关首页javaspring的事件和监听器-同步与异步详解java异步调用转同步的方法java异步调用转同步方法实例详解java同步与异步的学习笔记整理java系统中拆分同步和异步详解详解java 三种调用机制(同步、回调、异步)使用shiro实现登录成功后跳转到之前的页面如何使用try-with-resource机制关闭连接利用log4j将不同package的日志输出到不同文件的方法深入理解spring boot 监控使用idea将工具类打包使用的详细教程详解java序列化机制springmvc中拦截器的实现springboot 2.0 整合sharding-jdbc中间件实现数据分库分表java8新特性之类型注解_动力节点java学院整理二维码生成java实现代码intellij idea 2020最新intellij?idea?2020.2.3永久破解激活java使double保留两位小数的多方法 java保留两位idea2021.2永久激活码最新超详细(激活到2099)idea 2020版本最新破解教程可激活至2089java8 十大新特性详解2020.2 intellij ideajava.net.socketexception: connidea?2020.3最新永久激活码(免费激活到?209java写入文件的几种方法分享springboot统一功能处理的方式详解jdbc实现图书馆借阅系统linux下执行java程序的sh脚本分享jdbc+jsp实现简单员工管理系统spring远程调用httpclient/resttemplate的方法java 简单的计算器程序实例代码javaweb应用实例:用servlet实现oracle 基本增删改查java数据结构基础:算法java设计模式学习之工厂方法模式java scanner 类的使用小结
    免责声明 - 关于我们 - 联系我们 - 广告联系 - 友情链接 - 帮助中心 - 频道导航
    Copyright © 2017 www.zgxue.com All Rights Reserved