前言:
现在Android开发非常红火,Java环境下敏捷开发是不二选择。而敏捷开发都是测试驱动。所以,最近研究了一下Android下的各种自动化测试手段。本文重点在于面上的比较而非点上的细节。时间比较短,所以很可能理解很不充分。
测试手段1:CTS
用来确保某设备符合Android兼容性规范。
CTS原来只对OHA联盟开放。最近Google把它Release出来了。似乎做过一些裁剪,比如针对Java虚拟机的测试,似乎被删除了,但我们一般用不着这么高深的。
针对每个版本,比如2.1,2.2,Goolge发布了一个兼容性规范,而CTS测试就是用来确保某手机或者模拟器符合该兼容性规范。
CTS测试基于Androidinstrumentation测试,其又基于JUnit测试。说白了,CTS就是一堆单元测试用例。这也是Java语言的擅长部分。
在2.1模拟器上试验了一下,有少数没有通过。
目前CTS主要包括功能方面的测试,有少数的性能方面的测试。性能测试未来会越来越多。
总的来说,CTS跟WM的LTK测试还是弱了一些,毕竟还年轻。它只包括自动化测试,目的主要是保证API的兼容性。由于基于单元测试,CTS本身不能用于测试多应用交互的情况。
对我们的帮助:
1)应用程序的开发者可以开发出自己应用的单元测试,并将其加入CTS测试集。
2)设备制造商可以通过周期性运行CTS测试,确保没有对Android伤筋动骨。
测试手段2:Monkey
猴子测试本身非常简单,就是模拟用户的按键输入,触摸屏输入,手势输入等。看手机多长时间会出异常。
可以设置让Monkey只测试某个应用,从而辅助应用程序的开发。
对我们的帮助:
1)应用程序的开发者可以测试自己应用的鲁棒性。
2)设备制造商可以使用猴子对自己的测试施行压力测试。看设备能坚持多久。
猴子测试即可以针对全局,也可以正对某个局部(某个Category, package等等)。
执行简单,效果明显。
测试手段3:ASE
ASE意思为Android脚本环境,即我们可以通过脚本(比如Python)调用Android的功能,从而定制一些测试。比如打电话,发短信,浏览网页,等。
个人觉得这对复现某些偶发故障非常有帮忙。
目前ASE还处于它的成长期,希望它不断成熟,为开发者提供更多便利。
我们可以扩充它的API(Java部分),并用python脚本调用这些 API, 从而实现丰富的测试功能。
用于API部分可以访问到Android全部API, python又能灵活部署测试,所以ASE的扩展性非常好。
详细介绍请访问:尝试 Android Scripting Environment 之一http://blog.csdn.net/zjujoe/archive/2010/06/09/5657868.aspx
尝试 Android Scripting Environment 之二http://blog.csdn.net/zjujoe/archive/2010/06/09/5659253.aspx
尝试 Android Scripting Environment 之三http://blog.csdn.net/zjujoe/archive/2010/06/18/5677787.aspx
尝试 Android Scripting Environment 之四http://blog.csdn.net/zjujoe/archive/2010/06/22/5687206.aspx
测试手段4: Robotium
该工具用于黑盒的自动化测试。可以在有源码或者只有APK的情况下对目标应用进行测试。
Robotimu提供了模仿用户操作行为的API,比如在某个控件上点击,输入Text等等。
远方的blog上有许多Robotium介绍:Robotium - Android自动化测试工具http://hi.baidu.com/maguowei/blog/item/9d438410def7850c213f2ea3.html
关于Robotium的环境搭建与步骤:Robotium应用与Android自动化测试的研究http://www.cnmsdn.com/html/201101/1295345270ID9225.html
测试步骤介绍:简单介绍如何使用robotium进行自动化测试http://www.51testing.com/?uid-115892-action-viewspace-itemid-223476
测试手段5:单元测试
Android本身带有很多单元测试例子,我们可以按需要模仿它们,针对某个应用进行单元测试。
注意Android的Instrument机制功能非常强大,可以测试UI。
总结
一方面我们要充分利用Android提供的现成测试,密切关注其进展,另一方面,我们要学习好java/Python编程,必要时,自己开发自己的测试用例。
作为模块开发者,一定要写自己的单元测试,一方面可以保证自己的代码没有缺陷,另一方面,也为系统级测试提供素材。
当然,自动化测试关键还在于意识,创意比实现更重要。
对于CTS/Monkey,我们不需要开发,只要执行测试就可以了。
对于ASE, 我们可以扩充它的现有API(Java),用Python调用这些API实现丰富的测试功能。
Robotium模仿普通用户行为,可以试着把一些原来由测试工程师做的测试变成Robotium自动化实现。
———————————————————————————————————————————————————————————
测试手段6:Monkeyrunner工具
monkeyrunner工具提供了一个API,使用此API写出的程序可以在Android代码之外控制Android设备和模拟器。通过monkeyrunner,您可以写出一个Python程序去安装一个Android应用程序或测试包,运行它,向它发送模拟击键,截取它的用户界面图片,并将截图存储于工作站上。monkeyrunner工具的主要设计目的是用于测试功能/框架水平上的应用程序和设备,或用于运行单元测试套件,但您当然也可以将其用于其它目的。
Android自动测试之monkeyrunner工具http://www.cnblogs.com/yyangblog/archive/2011/03/10/1980086.html
Monkeyrunner 使用说明http://article.yeeyan.org/view/37503/164523
MonkeyRunner工具共有三个类:MonkeyRunner、MonkeyDevice、MonkeyImage。
一、MonkeyRunnner类:
这个类主要用于把MonkeyRunner连接至真机或者模拟器,另外有个显示提示信息的alert方法和一个选择方法比较常用。
二、MonkeyImage类:
这个类主要是测试过程中,用来保存测试截图,把图片保存成各种格式,并且可以比较两个MonkeyImage对象。
主要常用的有两个方法:writeToFile (string path, string format) ,这个是保存截图的位置,和命名,可以把图片保存到sdcard里面,也可以保存到电脑里面;sameAs (MonkeyImage other, float percent) ,这个用来比较两个截图是否相同,结果为boolean值。
三、MonkeyDevice类:
这个类的方法就多了一下,主要提供了安装和卸载程序包、启动一个活动及操作键盘等事件的方法。像里面的startActivity (string uri, string action, string data, string mimetype, iterable categories dictionary extras, component component, flags) 启动一个应用,press (string name, dictionary type)点击控件 ,touch (integer x, integer y, integer type)点击控件(通过坐标定位) ,drag (tuple start, tuple end, float duration, integer steps) 拖拉控件等等方法比较常用。
一个简单的MONKEYRUNNER的例子http://www.yeetrack.com/?p=629
# python引入monkeyRunner模块 from com.android.monkeyrunner import MonkeyRunner, MonkeyDevice # 连接设备, 获得一个MonkeyDevice对象 device = MonkeyRunner.waitForConnection() # 安装apk包. 返回值是boolean,可以判断是否安装成功 device.installPackage('myproject/bin/MyApplication.apk') # sets a variable with the package's internal name package = 'com.example.android.myapplication' # sets a variable with the name of an Activity in the package activity = 'com.example.android.myapplication.MainActivity' # sets the name of the component to start runComponent = package + '/' + activity # 启动应用程序 device.startActivity(component=runComponent) # 按下手机的菜单键 device.press('KEYCODE_MENU', MonkeyDevice.DOWN_AND_UP) # 截图 result = device.takeSnapshot() # 保存截图 result.writeToFile('myproject/shot1.png','png')
测试手段7:QTP插件SeeTest
SeeTest是基于图像识别的自动化测试工具,工具对中文支持不是很好。这个要花钱买的,试用期14天。官网上说手机一连上就可以在seetest看到屏幕截图,并且提取图形元素,用于编写脚本。但是奇怪我的手机一操作,就不能再继续运行下去了,试过其他也不行,不知道有没有用过此工具的TX分享下经验。
http://www.advancedqtp.com/knowledge-base/articles/environment-techniques-id15/mobile-id777/test-android-with-qtp/
测试手段8:Autoandroid
Autoandroid基于android junit编写的测试框架功能强大可以完成application test。
Android + Selenium测试工具 = Positron用于集成测试和功能测试,Positron 结合了Android-Ant(如下图)和Eclipse。
http://code.google.com/p/autoandroid/
Selenium工具介绍http://www.ibm.com/developerworks/cn/java/wa-selenium-ajax/