一、关于iOS UI自动化测试
要测试一个已成型的应用,从用户所见的角度来做自动化收益还是比较高的。
目前了解的UI测试方法分为两类,一种是iOS4提供的UI Automation,一种是把测试代码注入到应用中。
1)iOS4的UI Automation
用JavaScript驱动在应用上模拟用户行为,由Instruments的Automation工具执行。具体的可以参考这篇文章在iOS 4 中实现UI自动测试,操作很简单,先编写自动化测试的Javascript文件,在Automation工具中选择这个文件,选择测试的target(模拟器和真机都可以),然后点Record(这个名字起得很坑爹,我一度以为它支持录制,像Selenium一样转化为js代码呢),此时会运行所选的应用同时自动化脚本也开始运作了。
API可以在SDK Developer Document里找到,主要的是UIAElement、UIAElementArray、UIALogger这几个。但是API不是很完善,比如我要得到整个elementTree可以通过UIATarget.localTarget().logElementTree()得到,但是没有API能获取所有的Element,获取Element只能以获取子控件的形式一级一级查找,最后的代码可能就会变成这样:
window.tableViews()[0].cells()[1].buttons()[2].tap();
即使可以通过button的name直接找到这个button也需要写成这样:
window.tableViews()[0].cells()[1].buttons().firstWithName("search");
非常难看难维护。我尝试遍历一个view上的所有控件整整运行了两分钟。
另外推荐一个测试框架,Working with UIAutomation这篇文章中提供了tuneup_js这样一个框架,封装得非常简单,除了没有before after之类的封装外对我来说暂时已经够用了(需要每个case执行完后或者执行开始前恢复默认状态,不过这个很容易实现),可以参考。
2)测试代码注入到应用代码中
大致的思路是,新建一个测试的target,在applicationDidFinishLaunching最后创建一个测试对象,这个对象封装在测试的代码中,那么此时这个target就是应用+测试的新的东西了,安装后可以看到应用一直在模拟用户行为,也就是测试代码在运行。
这种测试方法其他部门的同事在研究,这里可以介绍几个测试框架:
FoneMonkey,这是我最早接触的iOS自动化框架,支持录制回放,但是不知道怎么对结果做验证。如果仅仅是录制回放的话,UI Recorder已经挺好用了。
Bromine,这个框架还不错,封装到最后只需要填几个Plist就可以完成testcase,只是不方便扩展,可以模拟用户行为无法做数据验证,同事基于这个框架在做定制,想法是做成C/S模式,这样如果server端没有发送请求测试就不会进行。
Google Toolbox for Mac (GTM),Google的一个开源项目。GTM + TestMerge.app = UI testing bliss据说也是类似的思路。
总结存在的问题:
iOS4的UI Automation有一个硬伤,就是4.0以下iOS不支持,这对自动化来说是打点折扣的。但是既然是Instruments的工具,不知道能否和其他工具一起使用,比如用leak检测内存泄露,比如用UI Recorder记录操作,然后回放到低版本的iOS设备或者模拟器上,可行性没了解过。
第一种方案使用Javascript,相对第二种方案的Objective C上手还是要简单一些。
需要解决的问题还有,如果应用crash,测试就不能继续了。如果crash后重跑下一个case,那就不能有case之间的耦合。如何重新运行app有待研究。
另外以上两种方案最后都要做到可持续集成,第一种方案需要做的是把build app、run app & testcase、generate testresult整个流程串起来,Automation这个工具提供可以测试报告,Instruments可以Shell运行,是否可行还需要研究,如果行不通的话可以尝试用Apple Script运行;第二种方案难点在于如何生成报告,需要把测试的log重定向到某个文件输出,这也是他们准备做成C/S结构的原因之一,可以在server端直接得到测试结果。
PS:如果测试的不是客户端而是web应用的话,Selenium2已经支持iOS和android平台了,可参考Selenium IphoneDriver。
二、关于xcode4.2 iOS的自动化测试
使用Instruments 里面的Automation,可以对iOS进行自动化测试。
在这里下载修改好的项目,xcode4.2下用的:http://download.csdn.net/detail/andyddd/3714104
下载那个附件:LoginWindow_Src.zip,编译里面的xcode项目,如果编译有错,就将Targets-- Building Settings -- Prefix Header 项清空(如果使用的是上面已经修改好的,就不用改了)。
![](http://www.lanou3g.com/upload/image/201302/20130227143413_405.gif)
安装xcode的时候,instruments已经装好了,与xcode在一个程序组里。
启动Instruments,在左侧添加Scripts:LongonTest.js, 然后在上面选择Target为刚才编译成功的iOS的app。
![](http://www.lanou3g.com/upload/image/201302/20130227143414_139.gif)
这个app的位置在用户目录下的:~/Library/Application Support/iPhone Simulator/<iOS version>/Applications/
![](http://www.lanou3g.com/upload/image/201302/20130227143415_743.gif)
然后就可以运行测试脚本了,测试成功后的截图如下:
![](http://www.lanou3g.com/upload/image/201302/20130227143416_110.gif)
三、iphone、ipad自动化测试,解决方案
明确概念:
目的:自动化测试是为了减轻测试人员“例行公事”似的测试任务,而诞生的一种测试方法,他是必须的,但不是万能的,就像金钱一样;
概念:利用现成的测试工具,对程序的执行、操作流程进行录制,而后运行时让程序自动走完录制的流程;
原理:操作录制过程,就是测试脚本的自动生成过程,以后的自动测试就是执行相应的脚本,所以,必要时是需要自己动手实现脚本编写;
测试工具包括:
1、测试脚本的文件包(插入到程序中),如foneMonkey 在mac中应用,其他地方没用过
2、完整的工具(能够启动程序,并按照已经录制的操作步骤执行),eggplant软件
3、自动运行脚本平台(能够启动程序,操作过程由自己编写脚本实现),Instruments,xcode环境一般自带
我尝试过的两种测试方法:
(1)利用fontMonkey测试工具包
1、下载FoneMonkey.zip文件并解压
2、用xcode打开工程目录
3、添加一个测试用的target
![](http://www.lanou3g.com/upload/image/201302/20130227143420_414.png)
并重命名:
![](http://www.lanou3g.com/upload/image/201302/20130227143421_185.png)
4、选取刚才创建的target并将解压好的FontMonkey倒入工程目录
![](http://www.lanou3g.com/upload/image/201302/20130227143425_666.png)
也可以直接拖入到文件目录:
![](http://www.lanou3g.com/upload/image/201302/20130227143426_670.png)
导入时确保你的target为刚才添加的
![](http://www.lanou3g.com/upload/image/201302/20130227143427_761.png)
5、添加完以后的效果为
![](http://www.lanou3g.com/upload/image/201302/20130227143428_609.png)
6、此时在你的框架中会默认添加两个文件
libFoneMonkey.5.4a.beta.a
libFoneMonkeyOCUnit.5.4a.beta.a
这两个文件在FoneMonkey的lib文件夹中,如果框架管理中没有,则可以直接拖过去;
然后再添加几个框架文件(默认有三个),libxml2.dylib、SenTestingKit.framework、QuartzCore.framework
7、修改工程的配置文件 Buile Seting->Linking->Other Linker Flags
添加选项 -all_load
![](http://www.lanou3g.com/upload/image/201302/20130227143432_323.png)
8、开始编译程序
选择测试target以及模拟器(真机器还没试验),运行
![](http://www.lanou3g.com/upload/image/201302/20130227143437_376.png)
第二个按钮是录制、第三个是播放、第四个返回上级页面;录制完成后,右上角第一个是保存,第二个是选择保存的脚本对程序进行测试;
原文地址:http://www.gorillalogic.com/books/fonemonkey-doc/setup-guide/preparing-an-app
略有改动,加入了一些必要的注意点;
(2)在Instrument中编写脚本进行测试(不能录制)
1、打开Instruments工具
一般路径:/Developer/Applications/instruments
2、选择Automation
![](http://www.lanou3g.com/upload/image/201302/20130227143439_266.png)
3、添加测试脚本(如果有现成的,可以导入)
![](http://www.lanou3g.com/upload/image/201302/20130227143439_237.png)
4、编写脚本
给出测试几个按钮点击的脚本
var target = UIATarget.localTarget(); //变量用来表示这是一个测试系统
var application = target.frontMostApp(); //确定要测试的程序
var window = application.mainWindow(); //确定要册书的窗口
window.logElementTree(); //获取要测试界面的所有元素
var bt=window.buttons()[2];
if(bt.isValid()){
bt.tap();
}
else{
UIAlogger.logMessage(“some error show!”);
}
5、倒入程序的xx.app 包
![](http://www.lanou3g.com/upload/image/201302/20130227143441_120.png)
6、点击Record将会直接通过脚本去点击程序中的一个按钮
程序设计成:一个页面,页面上有几个按钮就可以了(我用的ios5.0虚拟机);
参考文档:http://developer.apple.com/library/ios/#documentation/DeveloperTools/Reference/UIAutomationRef/_index.html
希望能给同志们有所帮助;