Google+团队如何测试移动应用 - from Google Testing Blog
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测试:它们天生就速度慢而且不稳定。而且需要花更多的时间去实现和维护。优先在应用的关键路径上确保测试覆盖率。
- 猴子测试:这是完善你测试自动化策略的最后一步。
Google+团队如何测试移动应用 - from Google Testing Blog的更多相关文章
- Google+ 团队的 Android UI 测试
https://github.com/bboyfeiyu/android-tech-frontier/tree/master/android-blog/Google%2B%20%E5%9B%A2%E9 ...
- Google 团队效能研究 | 为什么雇用最聪明的人是远远不够的?
简评:Google 的一项团队效能研究结果,可能会让你重新认识如何建立一个优秀的团队. Google 的搜索业务可能最为人所知,但 Google 可不仅仅有搜索业务,它可能还是最擅于大数据研究的公司之 ...
- 为什么有如此多的C++测试框架 - from Google Testing Blog
Why Are There So Many C++ Testing Frameworks? by Zhanyong Wan (Software Engineer) 最近貌似有很多人正在开发他们自己的C ...
- 《Google软件测试之道》 第一章google软件测试介绍
前段时间比较迷茫,没有明确的学习方向和内容.不过有一点应该是可以肯定的:迷茫的时候就把空闲的时间用来看书吧! 这本书,目前只是比较粗略的看了一遍,感触很大.以下是个人所作的笔记,与原文会有出入的地方. ...
- 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不能小于 ...
- 高效率使用google,国外搜索引擎,国内顺利使用Google的另类技巧,可用谷歌镜像, 可用google学术, 如何使用robots不让百度和google收录
Google良好的搜索和易用性已经得到了广大网友的欢迎,但是除了我们经常使用的Google网站.图像和新闻搜索之外,它还有很多其他搜索功能和搜索技巧.如果我们也能充分利用,必将带来更大的便利.这里我介 ...
- iOS团队开发者测试
那么你需要在你下载证书的那个电脑上从钥匙串-->选择证书-->右键到处证书,保存为.p12的证书,以后这个证书拷贝到任何电脑上去都是可以使用的! 本来只有一台电脑可以测试, 现在要团队开发 ...
- 大量客户反映wordpress的网站打开巨慢,经分析发现,这些网站大都使用了google的字体服务,由于最近google的服务已经被大陆屏蔽,所以wordpress的网站打开时,会卡在字体加载上。
一会你安装完wp,发现打开巨卡的话,看看这个帖子:http://bbs.myhostcn.com/thread-1026-1-1.html最近一段时间,大量客户反映wordpress的网站打开巨慢, ...
- 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 ...
随机推荐
- base64编码转图片
protected void Button1_Click(object sender, EventArgs e) { //strImg为base64编码的图片字符串 string strImg = & ...
- 西门子与三菱PLC报文比较
1.西门子和三菱的几个区别(上位只关心的通讯层面):1. 西门子PLC通讯端口固定102,但是可以连接多个PC端(客户端),三菱PLC通讯端口可以自定义,最多好像8个,但是每个端口只能连接一个客户端: ...
- Asp.net固定功能位充满了零(解决,演示样本)!
Asp.net固定功能位充满了零(解决.演示样本)! 在发展,其中,数实现出现8数字.但是,需要使用0加厚.例如:123,代表:0000123. 真实的比例,如下: decimal aaa = 123 ...
- BS学习概述
从最初的牛腩新闻公布系统,到如今的JS,回想一下,自己的BS也算是学了大半,可是有时候想起来还是总是有一种不踏实的感觉,一是由于从开学到如今赶上了三级考试,自考.软考,导致BS学习时间被大大压缩了,代 ...
- Tab选项卡界面(1)
Tab用一个简单的应用程序接口的标签是集中的界面布局文件的同一页上的接口组件不同的标签.并计划将在主类集中的代码文件.这种方法的优点是,文件在项目数不会被添加,但是,假设Tab接口组件更个性化的标签. ...
- 从零开始学习 asp.net core 2.1 web api 后端api基础框架(四)-创建Controller
原文:从零开始学习 asp.net core 2.1 web api 后端api基础框架(四)-创建Controller 版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog ...
- C#使用Selenium实现QQ空间数据抓取 说说抓取
上一篇讲的是如何模拟真人操作登录QQ空间,本篇主要讲述一下如何抓取QQ说说数据 继续登录空间后的操作 登陆后我们发现QQ空间的菜单其实是固定的,只需要找到对应元素就可以,继续XPath 可以得到地址 ...
- 模拟请求(模拟header gzip解压 泛型)
WebClient HeaderData是自定义类对象,存储header信息 private static T GetDataCommonMethod<T>(string url, str ...
- Go 语言如果按这样改进,能不能火过 Java?
据 InfoWorld 消息,为改进 Go 语言的开发工具,Go 可能会获得自己的语言服务器,类似于 Microsoft 和 Red Hat 的语言服务器协议. 消息是从 Go 语言开发者的讨论组中流 ...
- 【msdn wpf forum翻译】获取当前窗口焦点所在的元素
原文:[msdn wpf forum翻译]获取当前窗口焦点所在的元素 原文地址: http://social.msdn.microsoft.com/Forums/en-US/wpf/thread/6b ...