一 前言
什么是自动化测试?
把以人为驱动的测试行为转化为机器执行的一种过程,即模拟手工测试步骤,
通过执行测试脚本自动地测试软件,自动地完成软件的单元测试、功能测试、负载测试或性能测试等全部工作。
自动化测试应该从提高工作效率和产品质量的根本目标出发,而不是为了自动化而自动化。
测试用例(test case):
是为了特定测试目的而设计一个特定的使用实例或场景,包括测试条件、测试数据及与之相关的测试规程或操作过程。
测试用例也可以被称为有效地发现软件缺陷的最小测试执行单元。
测试脚本(test script):是进行自动化测试时所编写的、可执行的一种程序,以实现测试用例的执行过程。
优越性: 高效率 准确可靠 复用性 可以完成手工测试无法完成的测试,适合负载测试、性能测试、回归测试。
缺
黑盒测试也称功能测试,它是通过测试来检测每个功能是否都能正常使用。
在测试中,把程序看作一个不能打开的黑盒子,在完全不考虑程序内部结构和内部特性的情况下,在程序接口进行测试。
它只检查程序功能是否按照需求规格说明书的规定正常使用,程序是否能适当地接收输入数据而产生正确的输出信息。
黑盒测试着眼于程序外部结构,不考虑内部逻辑结构,主要针对软件界面和软件功能进行测试。
白盒测试
白盒指的是盒子是可视的,你清楚盒子内部的东西以及里面是如何运作的。"
白盒"法全面了解程序内部逻辑结构、对所有逻辑路径进行测试。"白盒"法是穷举路径测试。
在使用这一方案时,测试者必须检查程序的内部结构,从检查程序的逻辑着手,得出测试数据。
白盒测试工具是对源代码进行的测试。
二 测试工具分析
现在,已经有大量的Android自动化测试架构或工具可供我们使用,
其中包括:Activity Instrumentation,MonkeyRunner,Robotium,UiAutomator。
还有可以实现跨平台测试的Appium。
1
单元测试就是在开发的是时候,一步步的,一方法为单位的进行测试。
比如说你写了一个类,这个类呢有很多的方法,你想知道你写的这个方法到底对不对,那么你就可以使用单元测试框架进行测试。
它也可以被用作快速检验新建工程或进行冒烟测试。
始终,单元测试是作为一种有效的、系统的检验应用程序各功能执行的方式。
Android SDK支持JUnit的自动化单元测试,很多测试工具都是复用Junit测试框架。
单元测试可以为逻辑测试,功能测试和用户界面测试等,不再是专门手动测试移动应用。
Android提供了基于JUnit测试框架的测试API来书写测试用例和测试程序。
另外,Android还提供了强大的Instrumentation框架,允许测试用例访问程序的状态及运行时对象。
第一,
我们需要在运行单元测试时,一定要 用JDK来运行,利用java命令来启动JUnit的某个Runner。
如果是用Eclipse的话,可以在Run Configuration里新建一个JUnit。但是一定要记得在Classpath选项卡里将Bootstrap Entries中的Android Library改成JRE,并且添加junit.jar。
具体的设置可以参考:http://developer.android.com/guide/appendix/faq/troubleshooting.html#addjunit。
这种方法运行的JUnit运行在JDK之上的,而不是android,所以,只能测试一些和android无关的东西,比如业务逻辑,数据封装,数值计算等等。并不能测试android api。
android中可利用的主要测试API。继承自JUnit的TestCase,不能使用Instrumentation框架。
第二,
Android 测试环境的核心是一个Instrumentation框架,在这个框架下,你的测试应用程序可以精确控制应用程序。
使用Instrumentation, 你可以在主程序启动之前,创建模拟的系统对象,如Context;控制应用程序的多个生命周期;发送UI事件给应用程序;在执行期间检查程序状态。
Instrumentation框架通过将主程序和测试程序运行在同一个进程来实现这些功能。
Instrumentation implementation通过的AndroidManifest.xml中的标签进行描述。
android.app.instrumentaion类分析请参考
http://blog.csdn.net/zhaoweixing1989/article/details/8532940
你可以将Instrumentation理解为一种没有图形界面的,具有启动能力的,用于监控其他类(用Target Package声明)的工具类。
Android APIs提供的instrumentation类可以初始化Android应用程序代码,允许你监控应用程序的系统交互,配合KeyEvent、MotionEvent类,发送用户事件,进而实现GUI 层的自动化。
参考:http://www.cnblogs.com/carbs/archive/2013/01/12/2857596.html
ActivityInstrumentationT
局限性:只能满足单个活动的功能测试。
2
Robotium是android测试中一个简单而又强大的工具。
说它简单,是因为Robotium是基于Android测试框架InstrumentationTestCase2
通过反射等手段,调用系统隐藏的功能,实现instrumentation无法实现的功能。
它的文档只有一个Solo类,而且配置步骤是固定的几步。对程序上的每一个按钮,文本控件,图像,等都可以捕捉到,既可以使用按钮显示的名字进行点击,也可以使用坐标进行点击。
优点:主要针对某一个APK进行自动化测试,APK可以有源码,也可以没有源码,功能强大;在黑盒测试里面比monekyrunner效率更好,
缺点:针对APK操作,而且需要对APK重新签名(有工具),因此操作相对复杂;
3 Monkey
为支撑黑盒自动化测试,Android SDK提供了Money和MonkeyRunner两个测试工具。
Monkey是一个命令行工具,可以运行在模拟器里或实际设备中,它是一种轻量级的性能测试工具。
它向系统发送伪随机的事件流,模拟用户触摸屏幕、滑动Trackball、按键等操作来对设备上的程序进行压力测试,检测程序多久的时间会发生异常。
除了生成随机的事件序列,也支持接收脚本的解释执行命令。
可以在monkey的 --help里面查到。但官方没有。
不足:
缺少必要的条件判断等命令,难以在功能测试上有所作为。
将其作为生成随机事件的工具,测试应用的健壮性。
4 MonkeyRunner
MonkeyRunner工具提供了一个API,使用此API写出的程序可以在Android代码之外控制Android设备和模拟器。
通过MonkeyRunne,您可以写出一个Python程序去安装一个Android应用程序或测试包,运行它,
向它发送模拟击键,截取它的用户界面图片,并将截图存储于工作站上。
MonkeyRunner工具的主要设计目的是用于测试功能框架水平上的应用程序和设备,或用于运行单元测试套件。
与monkey的区别在工作站上通过API定义的特定命令和事件控制设备或模拟器。
优点:操作最为简单,可以录制测试脚本,可视化操作;
缺点:主要生成坐标的自动化操作,移植性不强,虽然有python和Java类库的支持,但是自身提供的API有限,需要通过插件来扩展其功能,功能最为局限
5 Appium
Google在sdk4.0以后提供了一个自动化解决方案uiautomator:
优点:可以跨应用了;这可是亲生的;
缺点:必须sdk4.0以上版本;要想实现的好,最好有开发配合;java项目编译为jar后需要push到手机才能运行,
Appium 是一个开源、免费的移动端自动化测试框架,可以用来测试原生和混合移动应用,
同时支持测试多种平台(Ios、Android、FirefoxOS)下应用,是跨平台的,可以用在osx,windows以及linux桌面系统上,
底层是采用 WebDriver JSON Wire 协议去实现的。
由SauceLabs支持,一家业界领先的测试产品公司, 有成熟的企业测试解决方案。
为什么选择appium ?
1.
2.
3.
依托
如果在没有使用Appium的情况,你使用了Apple的UIAutomation库就只能通过Javascript,并且只能通过Instruments application插桩应用来运行你的测试. 同样的,在Google的UiAutomator体系下,你只能用Java写你的测试案例. Appium最终开启了跨平台原生移动自动化的可能.
工作原理
Appium通过多种原生自动化框架来提供基于Selenium的
Appium驱动Apple的UIAutomation库提供IOS支持. UIAutomation基于Dan Cuellar’s
Android支持上, 在新版本的Android使用了Uiautomator框架,老版本的android上使用了Selendroid
FirefoxOS的支持依赖一个基于Gecko平台并且兼容WebDriver的自动化驱动Marionette,不过暂不翻译了.因为暂时用不到
Android
支持版本: android 2.3 平台及以上
windows
如果你在windows上安装appium,你没法使用预编译专用于OS X的.app文件,你也将不能测试IOS apps,
因为appium依赖OS X专用的库来支持IOS测试。这意味着你只能通过在mac上来运行IOS的app测试。这点限制挺大。