iOS的自动化测试

上一篇 / 下一篇  2012-04-01 09:28:20 / 个人分类:自动化测试

去年5月份接手测试了几个iOS客户端,简单看了点关于iOS UI自动化测试的东西,做了点记录,现在看看已经落伍了好多。姑且放着也许哪天还能用上。51Testing软件测试网z qs4r(R W%|O-j2{

  要测试一个已成型的应用,从用户所见的角度来做自动化收益还是比较高的。目前了解的UI测试方法分为两类,一种是iOS4提供的UI Automation,一种是把测试代码注入到应用中。

3RS'IyE7G0

Z^A.V*V6~0  1)iOS4的UI Automation51Testing软件测试网$L j-I)D,cc

51Testing软件测试网wXQL.E

  用JavaScript驱动在应用上模拟用户行为,由Instruments的Automation工具执行。具体的可以参考这篇文章在iOS 4 中实现UI自动测试,操作很简单,先编写自动化测试的Javascript文件,在Automation工具中选择这个文件,选择测试的target(模拟器和真机都可以),然后点Record(这个名字起得很坑爹,我一度以为它支持录制,像Selenium一样转化为js代码呢),此时会运行所选的应用同时自动化脚本也开始运作了。

d+^.WE5vQwV&M0

'N;zW)C Wr9T3tZ7Ho0  API可以在SDK Developer Document里找到,主要的是UIAElement、UIAElementArray、UIALogger这几个。但是API不是很完善,比如我要得到整个elementTree可以通过UIATarget.localTarget().logElementTree()得到,但是没有API能获取所有的Element,获取Element只能以获取子控件的形式一级一级查找,最后的代码可能就会变成这样:

3Vj6k | IXn051Testing软件测试网-t`'S Y+Y _;x

3O"ST)rz!zb0
window.tableViews()[0].cells()[1].buttons()[2].tap();
51Testing软件测试网R1~&O!aZ-z#O9r5G

51Testing软件测试网 ?4h J:}'N/g Cg[w

51Testing软件测试网'l o8_I.P B$O-tao

  即使可以通过button的name直接找到这个button也需要写成这样:

F-A'Dw!A051Testing软件测试网:}rL\*A-rW.q

51Testing软件测试网6m ifI Rf6E

window.tableViews()[0].cells()[1].buttons().firstWithName("search");
51Testing软件测试网eH?.\p.]-f

eT%dg9A@I051Testing软件测试网#i/E1`M\

  非常难看难维护。我尝试遍历一个view上的所有控件整整运行了两分钟。

3v m-G6EfC0r'@x!|B5k0

4`8qT4D1_ |8~U4]0  另外推荐一个测试框架,Working with UIAutomation这篇文章中提供了tuneup_js这样一个框架,封装得非常简单,除了没有before after之类的封装外对我来说暂时已经够用了(需要每个case执行完后或者执行开始前恢复默认状态,不过这个很容易实现),可以参考。

'@#?!XoFX6qX0

_ NZ%@J\6[0  2)测试代码注入到应用代码中

lC O ~uru-d051Testing软件测试网 o:^/\:q|Dd8nz

  大致的思路是,新建一个测试的target,在applicationDidFinishLaunching最后创建一个测试对象,这个对象封装在测试的代码中,那么此时这个target就是应用+测试的新的东西了,安装后可以看到应用一直在模拟用户行为,也就是测试代码在运行。

!Ltbnyt\l!d0

!N&S-g4~&Oi*k1?0  这种测试方法其他部门的同事在研究,这里可以介绍几个测试框架:

iv I/d u5s,a3|T051Testing软件测试网^$^,p,a Q5~A,T-e:y

  FoneMonkey,这是我最早接触的iOS自动化框架,支持录制回放,但是不知道怎么对结果做验证。如果仅仅是录制回放的话,UI Recorder已经挺好用了。51Testing软件测试网];k3] T(z

51Testing软件测试网v+z0m*vo3?4h/y

  Bromine,这个框架还不错,封装到最后只需要填几个Plist就可以完成testcase,只是不方便扩展,可以模拟用户行为无法做数据验证,同事基于这个框架在做定制,想法是做成C/S模式,这样如果server端没有发送请求测试就不会进行。

{${K } Q6`(Etc051Testing软件测试网Re5pd/M6c.}b*LS

  GoogleToolbox for Mac (GTM),Google的一个开源项目。GTM + TestMerge.app = UI testing bliss据说也是类似的思路。51Testing软件测试网:_ [m!v k9Y3~u,ZL

51Testing软件测试网G)A;`+FrEx+x(a C{S ^

  总结一下以上两种测试方法存在的问题:

*f~R @0G p QE051Testing软件测试网1Si,^ [!K&_7VC2Ts]

  iOS4的UI Automation有一个硬伤,就是4.0以下iOS不支持,这对自动化来说是打点折扣的。但是既然是Instruments的工具,不知道能否和其他工具一起使用,比如用leak检测内存泄露,比如用UI Recorder记录操作,然后回放到低版本的iOS设备或者模拟器上,可行性没了解过。

F:H#Ypj0

`5fJ}6^.aQ O0  第一种方案使用Javascript,相对第二种方案的Objective C上手还是要简单一些。

qE{!b#MLti051Testing软件测试网3Ur0N#cT8ra:z,a

  需要解决的问题还有,如果应用crash,测试就不能继续了。如果crash后重跑下一个case,那就不能有case之间的耦合。如何重新运行app有待研究。51Testing软件测试网*A$}Yh}`r'g

9T5t`v.T0  另外以上两种方案最后都要做到可持续集成,第一种方案需要做的是把build app、run app & testcase、generate testresult整个流程串起来,Automation这个工具提供可以测试报告,Instruments可以Shell运行,是否可行还需要研究,如果行不通的话可以尝试用Apple Script运行;第二种方案难点在于如何生成报告,需要把测试的log重定向到某个文件输出,这也是他们准备做成C/S结构的原因之一,可以在server端直接得到测试结果。51Testing软件测试网eYS/\:fdfJ

_ _\Dy1?P0  PS:如果测试的不是客户端而是web应用的话,Selenium2已经支持iOS和android平台了,可参考Selenium IphoneDriver51Testing软件测试网 P0v kP6wT-v5]G


TAG:

 

评分:0

我来说两句

Open Toolbar