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. 利用WPF建立自己的3d gis软件(非axhost方式)(十三)万能的用户层接口,(强大的WPF)

    原文:利用WPF建立自己的3d gis软件(非axhost方式)(十三)万能的用户层接口,(强大的WPF) 先下载SDK:https://pan.baidu.com/s/1M9kBS6ouUwLfrt ...

  2. Android Gallery组件实现循环显示图像

    Gallery组件主要用于横向显示图像列表,只是按常规做法.Gallery组件仅仅能有限地显示指定的图像.也就是说,假设为Gallery组件指定了10张图像,那么当Gallery组件显示到第10张时, ...

  3. How to configure spring boot through annotations in order to have something similar to <jsp-config> in web.xml?

    JSP file not rendering in Spring Boot web application You will need not one but two dependencies (ja ...

  4. Shell Step by Step (3) —— Stdin &amp; if

    4.输入输出 #! /bin/bash # Read users input and then get his name read -p "Please input your first n ...

  5. 矩阵微分(matrix derivatives)

    关于矩阵求导,得到的导数则是矩阵形式:关于矢量求导,得到的导数则是矢量形式:关于标量求导,得到的仍是标量形式.也即关于谁求导,得到的导数形式便和谁的维度信息一致. fx = f(x) grad = n ...

  6. IT引导学生成长的文章链接(十二)

    链接:IT学子成长指导类文章链接(1)(2)(3) (4) (5)(6)(7)(8)(9)(10)(11) "IT学子成长指导"类我收藏过的好文(十二期:至2014年4月26日) ...

  7. 对偶空间(dual linear space)

    1. 定义 设 V 为定义在数域 F 上的向量空间,定义 V 上的线性函数是从 V 到 F 的映射:f:V→F,且满足 ∀x,y∈V,k∈F 有:f(x+y)=f(x)+f(y),f(ka)=kf(a ...

  8. 微信小程序开发之从相册获取图片 使用相机拍照 本地图片上传

    1.index.wxml <!--index.wxml--> <button style="margin:30rpx;" bindtap="choose ...

  9. Swift现实

    笔者:fengsh998 原文地址:http://blog.csdn.net/fengsh998/article/details/34540623 转载请注明出处 假设认为文章对你有所帮助,请通过留言 ...

  10. node.js学习笔记之json数据转string

    Node.js中的JSON问题   var str = '{"dir":"kunhony","param":"archive&qu ...