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+团队的优先级顺序:

  1. 单元测试:无论Android还是iOS这永远是最高优先级。它们运行速度快并且比其它类型测试都要更稳定。
  2. 后台测试:确保你的后台不会导致移动客户端不能正常工作。特别是移动客户端和后台服务的发布周期不一致时,这点需要特别小心。
  3. UI测试:它们天生就速度慢而且不稳定。而且需要花更多的时间去实现和维护。优先在应用的关键路径上确保测试覆盖率。
  4. 猴子测试:这是完善你测试自动化策略的最后一步。

Google+团队如何测试移动应用 - from Google Testing Blog的更多相关文章

  1. Google+ 团队的 Android UI 测试

    https://github.com/bboyfeiyu/android-tech-frontier/tree/master/android-blog/Google%2B%20%E5%9B%A2%E9 ...

  2. Google 团队效能研究 | 为什么雇用最聪明的人是远远不够的?

    简评:Google 的一项团队效能研究结果,可能会让你重新认识如何建立一个优秀的团队. Google 的搜索业务可能最为人所知,但 Google 可不仅仅有搜索业务,它可能还是最擅于大数据研究的公司之 ...

  3. 为什么有如此多的C++测试框架 - from Google Testing Blog

    Why Are There So Many C++ Testing Frameworks? by Zhanyong Wan (Software Engineer) 最近貌似有很多人正在开发他们自己的C ...

  4. 《Google软件测试之道》 第一章google软件测试介绍

    前段时间比较迷茫,没有明确的学习方向和内容.不过有一点应该是可以肯定的:迷茫的时候就把空闲的时间用来看书吧! 这本书,目前只是比较粗略的看了一遍,感触很大.以下是个人所作的笔记,与原文会有出入的地方. ...

  5. Google map v3 using simple tool file google.map.util.js v 1.1

    /** * GOOGLE地图开发使用工具 * @author BOONYACHENGDU@GMAIL.COM * @date 2013-08-23 * @notice 地图容器的z-index不能小于 ...

  6. 高效率使用google,国外搜索引擎,国内顺利使用Google的另类技巧,可用谷歌镜像, 可用google学术, 如何使用robots不让百度和google收录

    Google良好的搜索和易用性已经得到了广大网友的欢迎,但是除了我们经常使用的Google网站.图像和新闻搜索之外,它还有很多其他搜索功能和搜索技巧.如果我们也能充分利用,必将带来更大的便利.这里我介 ...

  7. iOS团队开发者测试

    那么你需要在你下载证书的那个电脑上从钥匙串-->选择证书-->右键到处证书,保存为.p12的证书,以后这个证书拷贝到任何电脑上去都是可以使用的! 本来只有一台电脑可以测试, 现在要团队开发 ...

  8. 大量客户反映wordpress的网站打开巨慢,经分析发现,这些网站大都使用了google的字体服务,由于最近google的服务已经被大陆屏蔽,所以wordpress的网站打开时,会卡在字体加载上。

     一会你安装完wp,发现打开巨卡的话,看看这个帖子:http://bbs.myhostcn.com/thread-1026-1-1.html最近一段时间,大量客户反映wordpress的网站打开巨慢, ...

  9. Google map v3 using simple tool file google.map.util.js v 1.0

    /** * GOOGLE地图开发使用工具 * @author BOONYACHENGDU@GMAIL.COM * @date 2013-08-23 * @notice 地图容器的(div)z-inde ...

随机推荐

  1. AndroidStudio一步步教你修改项目包名(最详细,最易懂)

    如果你看了很多篇博文还是修改不了包名,我相信这篇可以帮你解决修改包名的问题 修改项目包名,实现不覆盖安装(如果只是想不覆盖安装,更改build.gradle里面的包名就OK了,那这篇博文到这里就可以结 ...

  2. Objective-C 数据类型 (一)

    数据类型分为三类:基本数据类型,对象类型,id类型. 基本数据类型:int ,float double char 对象类型:类,指针对象,协议 id类型:可以表示对象类型(在表示对象类型的时候 不需要 ...

  3. 说下IEnumerable相关的

    IEnumerable 我们每天都在使用foreach进行遍历,今天讨论下面三个常见的问题: 为什么在foreach中不能修改item的值 要实现foreach需要满足什么条件 为什么Linq to ...

  4. JScript实现将指定目录下的vc工程加到解决方案

    作者:朱金灿 来源:http://blog.csdn.net/clever101 main(); function main() { try { var WSShell = WScript.Creat ...

  5. SWFTools PDF转换为SWF

    前言 在iText 制作PDF这篇博文中只是简单的介绍了如何制作PDF,为了能让PDF在Web页面中显示,我还需要通过SWFTools工具将PDF文件转换为SWF文件,然后通过SWF文件显示在Web网 ...

  6. win10 uwp 使用 asp dotnet core 做图床服务器客户端

    原文 win10 uwp 使用 asp dotnet core 做图床服务器客户端 本文告诉大家如何在 UWP 做客户端和 asp dotnet core 做服务器端来做一个图床工具   服务器端 从 ...

  7. 机器学习:scikit-learn 做笑脸识别 (SVM, KNN, Logisitc regression)

    scikit-learn 是 Python 非常强大的一个做机器学习的包,今天介绍scikit-learn 里几个常用的分类器 SVM, KNN 和 logistic regression,用来做笑脸 ...

  8. 简明Python3教程 7.运算符和表达式

    简介 你写的大多数逻辑行都包含表达式.表达式的一个简单例子是2 + 3.一个表达式可分为操作符和操作数两部分. 操作符的功能是执行一项任务:操作符可由一个符号或关键字代表,如+ .操作符需要数据以供执 ...

  9. [数字dp] hdu 3271 SNIBB

    意甲冠军:有两个查询: q=1.在[x,y]间隔,兑换b十进制,数字和m多少个月. q=2.在[x,y]间隔,兑换b十进制,数字是m第一k的数目是多少(十进制),没有输出由给定的主题. 思维: 和比特 ...

  10. Qt移动应用开发(六):QML与C++互动

    Qt移动应用开发(六):QML与C++互动 上一篇文章讲到了在Qt Quick中实现场景切换的一种可能的方法,场景切换是诸如游戏等应用在内必需要面临的技术难点,所以场景切换并没有通行的方法,依据自己的 ...