蘑菇街支付金融Android单元测试实践(6)

发表于:2016-05-20来源:推酷作者:不详点击数: 标签:单元测试
9. 未来的打算 使用Groovy和 RoboSpock 或者是Kotlin和 Spek ,真正实现BDD,这是很可能的事情,只是目前我们这边还没太多那方面的实践,因此就不说太多了。以

  9. 未来的打算

  使用Groovy和 RoboSpock 或者是Kotlin和 Spek ,真正实现BDD,这是很可能的事情,只是目前我们这边还没太多那方面的实践,因此就不说太多了。以后有一定实践了,到时候可以再更大家交流。

  文中部分代码: https://github.com/ChrisZou/android-unit-testing-tutorial

  QA环节

  Q:如何测试界面交互?如点击拖动等。

  A:Robolectric提供了非常丰富的测试交互的方式,比如findViewById(id).performClick()。基本上,使用 Robolectric,你可以像正常写安卓代码那样写测试代码。甚至正常情况下没有的方法,Robolectric也提供了。

  Q:我也是后来才接触代码测试的,然后开始喜欢上写代码测试,但当尝试为以前的代码写代码测试的时候,发现以前的结构很难写代码测试,请问你们也有遇到这种情况么?如何解决。

  A:这的确是比较头疼的问题,建议可以看看《Working Effective With Legacy Code》一般来说就是挑选一个比较好下手的地方,做好隔离写好测试,在重构。那本书里面提出了很多简单除暴的方式,比如把一个方法或变量从 private改成public等等。

  Q:自绘控件一般怎么去做自动化测试?

  A:自定义控件一般只测他的功能性的部分,样式、动画这样的一般不测。

  测试方式基本就是把这个控件new 出来,然后调用它的public 方法,验证它的text是不是正确等等。或者是相应的事件有没有触发,这个借助Robolectric可以做到。

  Q:业务测试数据,是自己本地写的逻辑,还是结合服务器的真实逻辑?

  A:对于单元测试来说,一般是自己mock服务器的返回结果,因为服务器返回结果是不是正确的,其实不是我们应该测的情况,而是服务器应该测的情况,我们要测的,是服务器返回正确的结果我们就显示正确的结果,服务器返回错误的结果,我们就显示错误的返回信息。

  Q:MVP的情况下view和presenter的回调函数需要做测试吗,如果需要怎么做?

  A:要测,把presenter new出来,直接调用它的那个方法就是了。

  Q:对于依赖环境的测试,比如有无网络,不同的网络测试类型,不同的网络类型,网络超时等,这种怎么去做单元测试比较好?在比如测试试写文件的方法,怎么去构造剩余空间不足、空间足够的环境?

  A:这些情况需要借助系统的api(比如NetworkManager),去判断情况,这种情况可以把这些系统的api mock掉,指定让他返回你想要指定的结果。

  Q:为啥方法名不是驼峰命名法?

  A:因为常常需要为同一个方法写好几个测试方法,每个方法测试的目的可能不一样,这个时候往往会把测试方法写的很长,需要一段的驼峰大小写切换,这样可读性不高,写起来又麻烦,或者是用下划线去分隔,这样写起来又很麻烦。因此我们特别写了那个annotation和junit rule,目的就是可以让单元测试的方法命名可以随意一点。

  Q:robolectric一般只能模拟点击到一个子控件,但是自绘的控件可能不满足,自绘控件一般是为了较少layout的嵌套,而实现自绘的,点击控件的不同区域可能会触发不同的事件,以前我们的做法非常拿到,需要专门去根据这个自绘控件去这一大堆的测试代码,不知道有没有什么好的方法?

  A:这种情况的确没碰到过,我觉得可以看看Robolectric有没有指定点击这个view的某个坐标的方法,以我的经验,要实现你说的那种功能,应该是在这个view的ontouch时间里面去处理把,可以看看Robolectric有没有类似的模拟ontouch的方法,估计应该是有的。

  感谢徐川对本文的审校。

  给InfoQ中文站投稿或者参与内容翻译工作,请邮件至editors@cn.infoq.com。也欢迎大家通过新浪微博(@InfoQ,@丁晓昀),微信(微信号: InfoQChina )关注我们。

原文转自: http://www.infoq.com/cn/articles/mogujie-android-unit-testing