You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
在接触单元测试的一开始的阶段,我就对测试异步有疑惑,异步功能确实对我的代码编写有大大的帮助,但是测试就遇到一些麻烦。因为单元测试一般都是输入输出成对匹配出现,但是异步就麻烦了,因为输出不是马上获得的。
这里StackOverflow上也有类似问题 How to use JUnit to test asynchronous processes
里面有一些思路是异步转同步的思路
前言
在接触单元测试的一开始的阶段,我就对测试异步有疑惑,异步功能确实对我的代码编写有大大的帮助,但是测试就遇到一些麻烦。因为单元测试一般都是输入输出成对匹配出现,但是异步就麻烦了,因为输出不是马上获得的。
这里StackOverflow上也有类似问题
How to use JUnit to test asynchronous processes
里面有一些思路是异步转同步的思路
类似代码实在有点——蛋疼
这次正好借着学习单元测试的机会把异步测试这块捋一捋清楚
出一个demo
先写一个RxJava的例子
HttpBin测试网站是一个专门测试http的公网站点
我们用/uuid路由获取一个随机uuid,格式为application/json
先写一个RxJava的公共方法
这里基本延用了Android 练手之旅——RxAndroid&OKHttpClient(一)之中的代码。
注意:这里有一点点改进,增加了Cancel逻辑的处理
emitter.setCancellable(call::cancel);
这句代码保证了订阅被取消的时候会调用Call的cancel方法取消http的发送,做到节省资源的目的
接下来是MainActivity的代码
点击按钮显示最新的uuid。在模拟器测试下没啥问题。好了,我的目标就是把ResponseJson方法写进单元测试。
在Unit Test中加入RxJava
增加一个RxJavaTest.java的文件
我有三个选择
1)使用toBlocking()成员方法,把Rx同步化。这也是邓兄以前使用过的方案,应该可以用,但是主要缺点是会卡死进程直到整个Rx完成。
2)使用TestSubscriber来代替常规的订阅
这应该是一个比较好的方法。
因为TestSubscriber自带很多好用的assertXXXX方法
比如
TestObserver和TestSubscriber很多方法类似,只要能测试就行,那我就先试试用TestObserver测试
好的,第一个RxJava的测试用例完成了。
只会有一个值,所以用了.awaitCount(1),因为值就是long的0,所以使用.assertValue(0L)
ide里面运行下
测试通过,用时1s39ms,正好1秒多一点,主要的时间都拿来“等”timer了
前面的helloworld也看到了,测试没问题,就是要“白白”的等。
如果是短信验证码“冷却”,要等的60秒,那不是整个测试方法要等1分钟!
这里RxJava帮我们想过了,有一个TestScheduler帮我们达成“时光旅行”
这里应该还是针对哪些针对时钟触发的Observer来说的。直接上代码
这里首先把TestScheduler创建出来,再传入到intervalRange里面去
这里的例子是这个Rx是一个一共持续20秒,每过5秒吐一个值出来,一个出1,2,3,4,5个值 刚刚一开始是没有值的,所以是assertNoValues 接下来用testScheduler调用advanceTimeBy,把时间“前进”20秒,看看是不是获取1,2,3,4,5这些值了
运行结果正常,而且时间才用了23ms。效率还高了
接下来再做一个边界测试,如果只前进19秒会如何,应该是没有5才对!
改成
testScheduler.advanceTimeBy(19,TimeUnit.SECONDS);
运行符合预期!完美
好了上最终测试。
首先这是“真实世界”的异步,TestScheduler用不了。
所以只能用TestObserver 或者TestSubscriber了
这里uuid是随机的,但是长度是固定的,所以就assert字符串的length了
测试通过!由于是冷连接,加上3次握手和外网地址4秒多有一点慢
最后再测试一把Actions。
先把错误的Test Case先注销了
再触发一下流水线
参考链接
这两篇篇文章不是最新版本的RxJava,不过也有一定参考价值
Unit Testing with RxAndroid and RxJava
How to Test RxJava?
RxJava的单元测试源码,有参考价值就是没啥文档看
RxJava的单元测试参考源码
The text was updated successfully, but these errors were encountered: