这篇文章主要为大家介绍了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同步异步工具实的资料请关注编程学习网其它相关文章!
本文标题为:Awaitility同步异步工具实战示例详解
- Eclipse 插件更新错误日志在哪里? 2022-01-01
- 从 finally 块返回时 Java 的奇怪行为 2022-01-01
- Safepoint+stats 日志,输出 JDK12 中没有 vmop 操作 2022-01-01
- 将log4j 1.2配置转换为log4j 2配置 2022-01-01
- Jersey REST 客户端:发布多部分数据 2022-01-01
- C++ 和 Java 进程之间的共享内存 2022-01-01
- Spring Boot连接到使用仲裁器运行的MongoDB副本集 2022-01-01
- 如何使用WebFilter实现授权头检查 2022-01-01
- Java包名称中单词分隔符的约定是什么? 2022-01-01
- value & 是什么意思?0xff 在 Java 中做什么? 2022-01-01