How the Google+ Team Tests Mobile Apps by Eduardo Bravo Ortiz
“移动第一”在当下已成为很多公司的口头禅。但是能够用一种合理的方法来测试移动应用却是非常有挑战的工作。今天Google+团队将和你一起分享iOS和Android平台上移动应用测试的成功经验和走过的弯路。
平台无关部分
- 深入理解你的平台。Andoird上的测试和iOS是不同的。无论是测试工具还是框架在这两个平台上都有巨大的差异。例如Andoird使用Java而iOS使用Objective-C,UI布局在不同平台上差别很大,而且UI自动化框架在不同平台上的工作方式也随着变化。
- 稳定你的测试用例和测试环境。不稳定的测试还不如没有测试,因为它们会污染你build的质量并且降低测试用例的可信度。
- 把测试尽可能分解成可管理的模块。移动平台测试有太多复杂依赖关系,比如模拟器/设备状态,操作系统触发的操作等。
- 为你的测试提供一个封闭的测试环境。移动平台的UI测试天生就不稳定,不要因为外部依赖的原因而导入更多不稳定的因素。
- 单元测试是移动测试策略的基石。努力把应用的业务逻辑代码与前端UI分离。这种分离将使你的单元测试更加粒子化并且跑得更快。
Android测试
单元测试
在Android平台上将业务逻辑和前端UI分离是件非常困难的工作。例如,一个Activity同时扮演着Conrtoller和View的角色;在编写单元测试的时候你一定要牢记这点。另一个建议是将单元测试和Android模拟器解耦合,这将使得你可以迅速的执行单元测试而不必为执行测试而编译和安装APK文件。Robolectric是个完美的工具,它为你的测试执行实现了Android平台的Stub。
封闭的UI测试
封闭的UI测试意味着在执行测试用例时不执行网络调用或外部依赖。当测试在一个封闭的环境运行时,一个白盒测试框架,例如Espresso不仅可以模拟用户在UI上的操作,而且还紧密的耦合了应用的业务逻辑代码。Espresso还可以同步你的测试操作和UI线程上的事件响应同步以降低不稳定性。更多关于Espresso的信息和请关注Google Testing Blog将要发表的文章。
图:非封闭工作流 vs 封闭工作流
猴子测试
猴子测试用来寻找Android应用的奔溃和无响应(ANR = Application No Responding)。它们执行伪随机代码比如点击和手势。猴子测试的结果在某种程度上是可重现的。延时等不受控制的因素会导致测试用例失败,但重复运行猴子测试并使用相同的配置有很大的几率重现失败。 如果你每天使用不同版本的SDK来执行这些用例,那么可以很高效的在新版本开发的早期就发现这些bug。
iOS测试
单元测试
比如随Xcode一起发布的OCUnit,或者GTMSenTestcase都是单元测试很好的选择。
封闭的UI测试
KIF被证明是Objective-C的UI测试最强大的解决方案。它和应用在同一进程中执行,使得测试代码可以和应用更紧密的耦合在一起,这自然使得测试用例更为稳定。KIF还允许开发者用与应用相同的语言编写测试用例。
遵循与Android的UI测试相同的范式,我们希望Objective-C的测试也是封闭的。一个很好的方式是实现一个假的服务器把一些期望的响应封装在内。因为KIF与应用在同一进程内执行,所以期望的响应是可编程的,这使得测试更容易维护并且更稳定。
猴子测试
与Android不同,iOS没有原生的编写猴子测试的工具,但是这类测试在iOS上的价值还是很大的。在Google+最近的某次发布中,我们用猴子测试的方法找到了16个崩溃。尽管有着很多第三方的现成选择 ,Google+团队还是开发了自己定制的猴子测试框架。
后台测试
如果移动客户端没有与后台服务的集成测试,那么这个测试策略就是不完整的。特别是当移动客户端和后台的发布周期不一致时,这点尤须注意。回放的测试策略特别有助于避免后台服务的变化导致移动客户端不能正常工作。这个策略的理论是模拟客户端的一组核心请求和正确的响应文件。回放测试把这些核心请求发送给后台服务然后检查响应文件是否与期望的匹配。因为客服端和服务器之间的响应不总是确定的,所以你必须借助于diff工具来忽略那些可以接受的差别。
为确保测试策略的成功你必须能够在后台生成可重复的数据集合并且使得所有的外部依赖与封闭的后台无关。把服务放到内存里,外部依赖远程调用的回放都是确保测试环境封闭性和数据集合可重复的好方法。Google+团队使用Guice来实现依赖注入,这使得我们可以很方便的在测试时依靠伪功能实现移除外部依赖和使用预生成的数据集合。
图: 标准工作流 vs 回放测试工作流
结论
移动测试非常具有挑战性,但是构造一个能够理解不同平台和工具差异的复杂测试战略是成功的关键。提供一个可靠并且封闭的测试环境和编写测试用例一样重要。
最后,根据你团队的需要来确定自动化测试的优先级。以下是Google+团队的优先级顺序:
- 单元测试:无论Android还是iOS这永远是最高优先级。它们运行速度快并且比其它类型测试都要更稳定。
- 后台测试:确保你的后台不会导致移动客户端不能正常工作。特别是移动客户端和后台服务的发布周期不一致时,这点需要特别小心。
- UI测试:它们天生就速度慢而且不稳定。而且需要花更多的时间去实现和维护。优先在应用的关键路径上确保测试覆盖率。
- 猴子测试:这是完善你测试自动化策略的最后一步。