「移动至上」已然是如今许多公司的宗旨了。然而想要合理高效地去测试一个移动应用程序却绝非那么简单。 今天 Google+团队,我们将和你一起分享在 iOS 和 Android 两个平台上通过不断尝试总结出的成功经验和走过的弯路。
总体而言
● 你需要熟悉和理解平台。在 Android 和在 iOS 上测试是存在着一些差异。这两个平台可用的测试工具和测试框架也是截然不同。 (比如,在开发语言上,Android 使用的是 Java 与此同时 iOS 使用的 Objective-C , 在界面风格和 UI 测试框架的工作方式上,两者也是不同的)
● 让你的测试套件和测试环境更加的稳定。因为不稳定的测试会让 build 的质量大打折扣,并且会让你的测试用例可信度降低,不稳定的测试还不如没有测试
● 把测试模块化,因为在移动设备上有太多的复杂的情景了(比如模拟器/ 设备状态,操作系统触发的操作等等)
● 为测试提供一个封闭的测试环境。在移动设备上的 UI 测试本来就是不稳定的,为其增加依赖会带来更大的不稳定性
● 单元测试是整个测试中至关重要的一个环节,尝试去把应用的 UI 和逻辑相分离。这个做法将使得单元测试更加的快捷和模块化
Android 测试
单元测试:
在 Android 上把 UI 代码和逻辑相分离是相对复杂的。例如,一个 activity 有时在同时扮演者 controller 和 view 。在写单元测试的时候一定要记住这点。
另外一个实用的建议是将单元测试从 Android emulator 中解耦合,这个可以减少单独 build 一个安卓包并安装,这样你的测试将会进行的更加快速。Robolectric 就是一个非常好的工具,它为你的测试执行实现了 Android 平台的 Stub
封闭的 UI 测试:
一个封闭的 UI 测试通常在没有网络请求或者是没有外部依赖的情况下进行的。如果可以在一个封闭的测试环境中进行,一个叫 Espresso 的白盒测试框架可以模拟用户在 UI 上的操作,还紧密耦合了应用的业务逻辑代码。Espresso 可以将你的测试动作和 UI 线程上的事件响应同步起来,从而减少不稳定性。更多关于 Espresso 的信息我们将在之后的 Google Testing Blog 中的文章覆盖。
图:这里是不封闭的流和封闭的流的对比图:
Monkey Tests:
Monkey Tests 的主要目的是通过在 Android 应用上进行压力测试来寻找闪退和程序没有响应(ANR = Application No Responding) 等问题. 他们通过一些随机的手势和点击事件来对 app 进行测试。Monkey Test 的结果从某种程度上来说是可重现的,超时和潜在出现的问题并不在你的控制范围之内,所以有可能会带来一些测试错误。在同样的配置下再做 monkey test 通常会再现这些错误。如果你每天都针对不同版本的 SDK 来执行这些用例,他们将非常邮箱并在新一轮发包之前检测到程序的 bug。
iOS 测试
单元测试:
像 GTMSenTestcase 或者 能够和 Xcode 结合起来的 OCUnit 这样的单元测试框架都是非常好的选择
Monkey 测试:
相对于 Android ,iOS 其实没有等价的原生工具来写 Monkey test , 但是这种类型的测试在 iOS 测试中还是会增加筹码。 Google+团队开发了自己的 monkey 测试框架,同时也有很多可用的第三方测试框架。
封闭的 UI 测试:
KIF 是公认的用 Objective-C 进行 UI 测试的强大工具,测试的时候可以更加紧密的和 app 相结合。让测试更加的牢固。KIF 可以使得 iOS 开发人员在写测试的时候使用和 app 相同的开发语言。
后台测试:
在移动应用的测试当中是不可缺少测试服务器后端和移动客户端的集成的这个环节的。当两者发布周期不尽相同的时候,这个环节显得尤其重要。
为确保测试策略的成功你必须能够在后台生成可重复的数据集合并且使得所有的外部依赖与封闭的后台无关。把服务放到内存里,外部依赖远程调用的回放都是确保测试环境封闭性和数据集合可重复的好方法。Google+团队使用 Guice 来实现依赖注入,这使得我们可以很方便的在测试时依靠伪功能实现移除外部依赖和使用预生成的数据集合。
图: 标准工作流 vs 回放测试工作流
总结:
测试移动应用程序可以说非常有挑战性,但是去理解不同平台的本质和工具对建立一个完善的测试机制有着至关重要的作用。 与此同时,提供一个可靠并且封闭的测试环境和进行的测试一样重要。
最终,你需要根据团队的需求来对你的自动化目标来定一个优先级,这里是我们Google+ 团队的优先级列表:
● 单元测试:不管在 Android 还是 iOS 上,这个都是最为重要的一部分,它们进行的很快,并且可靠性很高
● API 测试:保证你的后端问题不会给移动应用带来崩溃。当客户端和后端上线周期是不一样的时候,这样的问题尤其需要注意。
● UI 测试:这个在写脚本以及维护上需要花的时间更多。保证测试要覆盖关键跳转
● Monkey 测试:这个是完整移动应用自动化策略的最终一步。