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

 更新时间:2022年08月25日 17:05:28   作者:蚂蚁背大象  
这篇文章主要为大家介绍了Awaitility同步异步工具实战示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

引言

在编写测试用例的时候遇到有异步或者队列处理的时候经常会用到 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 Security获取用户认证信息的实现流程

    Spring Security获取用户认证信息的实现流程

    Spring Security是一个能够为基于Spring的企业应用系统提供声明式的安全访问控制解决方案的安全框架。它提供了一组可以在Spring应用上下文中配置的Bean,充分利用了Spring IoC,DI和AOP功能,为应用系统提供声明式的安全访问控制功能
    2022-12-12
  • Spring Cloud Hystrix的基本用法大全

    Spring Cloud Hystrix的基本用法大全

    这篇文章主要介绍了Spring Cloud Hyxtrix的基本使用,它是Spring Cloud中集成的一个组件,在整个生态中主要为我们提供服务隔离,服务熔断,服务降级功能,本文给大家介绍的非常详细,需要的朋友可以参考下
    2022-07-07
  • spring security动态配置url权限的2种实现方法

    spring security动态配置url权限的2种实现方法

    对于使用spring security来说,存在一种需求,就是动态去配置url的权限,即在运行时去配置url对应的访问角色。下面这篇文章主要给大家介绍了关于spring security动态配置url权限的2种实现方法,需要的朋友可以参考下
    2018-06-06
  • Spring Cloud Gateway服务网关限流问题及解决

    Spring Cloud Gateway服务网关限流问题及解决

    这篇文章主要介绍了Spring Cloud Gateway服务网关限流问题及解决,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2025-04-04
  • SpringCloud高可用配置中心Config详解

    SpringCloud高可用配置中心Config详解

    Spring Cloud Config 是一个解决分布式系统的配置管理方案,它包含了 server 和 client 两个部分,这篇文章主要介绍了SpringCloud之配置中心Config(高可用),需要的朋友可以参考下
    2022-04-04
  • SpringBoot3快速整合MyBatisPlus的示例代码

    SpringBoot3快速整合MyBatisPlus的示例代码

    本文介绍了快速整合MyBatis-Plus到Spring Boot 3项目中,包括依赖引入、代码生成器使用等,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2024-12-12
  • spring jpa 审计功能自定义填充字段方式

    spring jpa 审计功能自定义填充字段方式

    这篇文章主要介绍了spring jpa审计功能自定义填充字段方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-11-11
  • Java老矣 尚能饭否?

    Java老矣 尚能饭否?

    Java老矣,尚能饭否?各类编程语言横空出世,纷战不休,然而 TIOBE 的语言排行榜上,Java 却露出了明显的颓势。这个老牌的语言,未来会是怎样?
    2017-06-06
  • Intellij idea热部署插件JRebel的使用

    Intellij idea热部署插件JRebel的使用

    这篇文章主要介绍了Intellij idea热部署插件JRebel的使用,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-06-06
  • 教你在一分钟之内理解Java Lambda表达式并学会使用

    教你在一分钟之内理解Java Lambda表达式并学会使用

    今天给大家带的文章是Java8新特性的相关知识,文章围绕着如何在一分钟之内理解Java Lambda表达式并学会使用展开,文中有非常详细的介绍,需要的朋友可以参考下
    2021-06-06

最新评论