让Android测试自己跑起来Junit经典.docx
- 文档编号:10237434
- 上传时间:2023-02-09
- 格式:DOCX
- 页数:17
- 大小:1.13MB
让Android测试自己跑起来Junit经典.docx
《让Android测试自己跑起来Junit经典.docx》由会员分享,可在线阅读,更多相关《让Android测试自己跑起来Junit经典.docx(17页珍藏版)》请在冰豆网上搜索。
让Android测试自己跑起来Junit经典
让Android测试自己跑起来
概述:
Android可用的自动化测试工具
由于Android平台本身的优越性,自动化测试的工具很多,有的是谷歌官方提供的,有的是不同厂商自己量身定做的,也有一些是民间山寨出来的,这些测试框架和测试工具有很多相同的地方,当然他们也有他们自己测试的侧重点,简单列举几个我看到过的测试框架吧:
*AndroidSDK中的junit+Instrumentation
看起来它是做单元测试的用的,实际上它真的是做单元测试用的^_^。
不过这个东西其实功能很强大的,使用他咱们还可以做UI的功能测试,厉害吧。
目前质管组探索的Android自动化测试也是以这个东西为基础开始的。
*Robotim
它是在androidSDKframework的基础上抽象出来了一些非常好用的方法。
听起来简单,但是他提供的接口真的是给我们解决了很大的问题。
这个可以辅助AndroidSDK中的junit+Instrumentation进行更多的功能测试。
*Monkey
应用于压力测试,通过反复随机模拟一些非常规的操作(比如不停的点击屏幕,不停的切换应用程序等等),来测试我们的应用程序可以坚持跑多久而不挂掉
*CTS
一种类似于WindowsMobileLTK的测试,里面包含了一些测试的命令集合:
Android.xml
AppSecurity.xml,CTS.xml,Java.xml,Performance.xml,RefApp.xml,Signature.xml,VM.xml这些XML文件里面定义包含了很多已经写好现成的用例集合,测试者通过一些命令就可以驱动执行那些用例,测试系统的不同方面。
起初Google坚持不对这个东西进行开放,是的这个东西没有可扩展性,据说现在想通了,这个东西也开放出来了。
不过目前还不知道他能扩展到什么地步,至少通过以前的经验来看这个东西对于手机终端厂商用处不小,但是对于我们终端软件测试用处不是很大。
*传统的LinuxShell脚本来驱动测试
上一篇里面提过了,android的adbshell很强大,集成了不少有用的Linux命令,我们可以通过开发一些shell小脚本来辅助我们进行测试,比如,启动程序100啦,时时检测CPU占用率啦等等。
不过有一点小小的不幸,就是这个东西需要手机有root权限才成
这里面咱主要介绍一下,大家尝试了2个来月的junit+Instrumentation,Robotim,顺带再提提MonkeyTest
*******************************************************************************1.JUnit+Instrumentation
1.1他们是什么?
*JUnit-用于Java应用程序的老牌儿单元测试框架
*Instrumentation-JavaSE5中的新特性,在JavaSE6中被赋予了更强大的功能,使用Instrumentation,开发者可以构建一个独立于应用程序的代理程序(Agent),用来监测和协助运行在JVM上的程序,甚至能够替换和修改某些类的定义。
在这里Instrumentation是一种操作系统和上层应用程序之间的监控机制。
当应用程序运行时,若Instrumentation设置为开启,它将在应用程序运行前初始化,与应用程序运行在同一个进程中,监测应用程序与系统之间的交互,并可以对应用程序进行一定的控制,例如,监控应用中各Activity的调用情况,启动和结束Activity,对Activity生命周期中的各个状态进行切换,甚至可以向Activity发送按键事件和字符。
1.2简单的说说这个测试框架
这个测试框架其实不仅仅是JUnit和Instrumentation单独来完成的,这里面当然少不了AndroidSDK的帮忙,他们仨合作帮助我们来完成我们的自动化测试
这个测试框架位于AndroidSDK中的android.test包,里面包含了一些从JUnit基本类里面继承过来的XTestCase类,通过Instrumentation驱动来完成自动化脚本的执行。
总结起来就是充分发挥了JUnit在测试用例开发、组织等方面的特点。
Instrumentation提供了对应用程序进行控制的有效途径。
使用与开发应用程序相同的环境使我们方便的调用AndroidAPI,系统级API,标准JavaAPI以及应用程序中的API。
1.3写测试用例之前要做什么
1.3.1获得完整的应用程序代码或者源程序jar包
由于测试工程里面要直接通过相关接口控制应用程序,所以我们需要将待测应用程序的接口引入到测试工程里面来,而且很多时候我们需要借助于源程序里面可以使用的API来辅助我们的测试
1.3.2评估可以用自动化实现的测试部分
自动化测试不肯能帮我们完成所有手工操作,秉承2/8原则,用20%的effort来获得80%的收益。
例如:
一个测试用例用手工测试的话,只需要5分钟且不是每次测试都需要执行;如果写成自动化脚本来执行,需要写n个类,n行代码3天才能开发完成,这样就不值得了。
在决定哪些用例可以用来做自动化时,我们需要考虑以下几个要素:
*前提可设置
*过程可模拟
*结果可以验证
*异常可控制
满足不了其中任意一个,对于自动化测试也是很困难的。
1.3.3了解完整的交互流程
这里提的自动化测试是在模拟手工操作,那么我们在开始开发一个自动化测试脚本之前,一定要对Activity,Dialog,View之间切换的流程心知肚明。
比如以下几个方面我们就需要先考虑:
*应用程序的入口Activity是什么(这个是必须的,因为我们至少得把程序启动起来吧^_^)
*我要到达下一个页面是该点击某个按钮?
还是该选择某个菜单?
*在我到达下一个页面之间是不是会弹出,一个对话框?
我需不需要把这个对话框先处理了?
*我在操作的过程中会出现什么异常警告?
*....
总之,我们需要就像写测试用例文档那样,把执行用例的过程搞清楚
1.3.4充分理解应用程序源代码中layout布局
当我们进入一个页面的时候,页面会出现很多内容,这个时候我们需要把这些内容的布局搞明白,Android的layout都是XML格式的通过hierarchyviewer.bat工具来看他就是个树状结构的,我们需要分析一下这棵“树”的每个元素都是怎么安排的。
每个元素都是啥。
1.3.5了解每个元素的类型以及实现方式
这个其实延续了上一条,当我们找到了我们需要的元素,我们就需要考虑:
*它是什么类型?
这好比我们得知道它是人类,是动物,是植物?
*它的id是什么?
大部分的元素都有一个唯一表示它的id,方便我们在茫茫人海中找到它
*了解它能干什么?
比如能被单击么,他能被拖动么等等
1.3.6知道如何在应用程序源代码中快速找到实用的接口
1.3.7尽可能多的搜集执行过程当中的异常
2.她长什么样?
前面说了那么多,现在正式开始来看看这个东西到底是什么样子
*测试代码的集合是一个独立的工程,将来会打包成APK的包装入手机来执行
*需要引用被测程序的工程,或者引入源程序的jar包
*继承于XXXTestCase
*有setUptearDown
*测试方法必须为public且以test开头:
testABC()..
*测试方法可以与其他普通方法共同存在于一个类中
*要有public的构造函数
*用***TestSuite组织测试用例
*也有Listener和Runner,通过***Runner来执行脚本,收集运行结果
*跟应用程序一样也有自己的AndroidManifest.xml文件
*代码执行开始或手动或自动的启动应用程序的入口Activity
*Instrumentation和入口Activity的实例陪伴我们从头到尾
3.以Notepad为例来看看这个自动化脚本该怎么开发
3.1将被测试程序引入到Eclipse里面来
*File->Import->选择General里面的ExistingprojectsintoWorkspace
*点击"Browse..."按钮,从存放的路径选择你的工程然后确定
*勾选上工程前面的复选框,然后finish,工程就出现在了workspace里面了
3.2创建测试工程
*File->New->Other...->选择Android里面的AndroidTestProject
*填写相关的属性,点击finish按钮
*我们导入的源程序和测试程序是这样的
3.2开始写测试代码
3.2.1新建一个class:
File->New->Class,从**TestCase继承,这里我们从最基本的ActivityInstrumentationTestCase2来继承(具体每一个**TestCase,什么意思我们可以参考AndroidSDK中的API文档)
3.2.2构造函数,这个构造函数的格式与从哪个TestCase继承来的有关,如果我们从ActivityInstrumentationTestCase2集成来,格式如下:
3.2.3写一个setUp函数,每个用例执行之前都会调用一次setUp()函数,我们可以把用例执行之前通用的前提条件写在这里,例如打开一个文件,打开一个数据库,这里我们完成对每个类里都需要用的Instrumentation实例以及入口Activity的实例进行初始化
3.2.4写一个tearDown函数,每个用例执行之后都会调用一次tearDown()函数,我们在这里需要清理资源,例如停掉所有打开的Activity,关闭数据库等等
3.2.5写测试函数,每个测试函数头都必须是publicvoidtestXXX()throwsExecpetion这个格式,函数里面就是写我们真正的那些功能代码了
3.2.6开发自动化测试代码的时候有几个关键API我们经常会用的到,这里列举一些,更多的API还需参考AndroidSDK文档
assertXXXX:
用来对结果做断言,通过不同的assert函数后缀对测试结果进行判断,assert函数一般有2中形式:
带打印用户自定义错误信息和不带打印用户自定一错误信息的,如需打印用户自定义信息则第一个参数定义为打印的错误信息
EX:
assertNotNull(obj);//判断obj是否为空
assertNotNull("objisnull",obj);判断obj是否为空,如果为空则打印错误信息“objisnull”
assertEquals(expResult,actResult);//判断expResult和actResult是否相等
assertEquals("twovalueisdifferent",expResult,actResult);//判断expResult和actResult是否相等,如果不相等则打印错误信息twovalueisdifferent
ActvityMonitor:
对即将被launch起来的Activity进行监控,配合着waitForMonitorWithTimeout()函数获得目标Activity的实例
EX:
Instrumentation.sendStringSync:
向获得焦点的输入框输入字符串
EX:
Instrumentation.sendKeyDownUpSync:
模拟一个按键操作
System.Clock.sleep(1000);//程序等待1秒钟的时间
View.findViewById():
通过某个view的id来获得view实例
EX:
Instrumentation.runOnMainSync或者Activity.runOnUIThread:
在另一个线程执行View的动作,并将信息同步到主线程,这两个API使用结果是一样的
EX:
Instrumentation.invokeMenuActionSync:
点击菜单项
EX:
3.2.7测试工程也要写一个AndroidManifest.xml来告诉Android系统我是谁,我要干什
3.3执行测试代码
3.3.1打包安装应用程序与测试程序
*使用与源代码相同SDK编译测试代码生成apk
*使用与源代码相同的key对测试apk进行前面
*将远程序apk和测试apk装入手机或者模拟器
3.3.2执行命令格式
adbshellaminstrument[-r][-e
常用的是一下三种形式:
*执行测试工程里面的NotePadTest类中的测试代码:
#adbshellaminstrument-eclasscom.tencent.june.test.NotePadTest-wcom.tencent.june.test/android.test.InstrumentationTestRunner
*执行测试工程中NotePadTest里面的testAddNote方法
#adbshellaminstrument-eclasscom.tencent.june.test.NotePadTest#testAddNote-wcom.tencent.june.test/android.test.InstrumentationTestRunner
*执行测试工程里面所有测试用例代码
#adbshellaminstrument-wcom.qq.test/android.test.InstrumentationTestRunner
3.3.3执行结果
******************************************************************************
4.认识一个叫做Robotim的API集合
前面介绍的那写基本的API已经帮我们解决了很多问题,但是由于Android系统的特性以及应用程序的实现方式使得我们对于Dialog,Menu,toast等等一筹莫展,无法通过id获得他们的实例,这时我们可以通过一个第三方的API集合来解决这样的问题
4.1如何使用
4.1.1下载robotimjar包并添加到工程的ReferencedLibraries中
4.1.3Robotim仅仅是在Instrumentation的基础上提供了另外的一套APIlib,配置和执行没有其他的改变,关于RobotimAPI的使用可以参考Robotimjavadoc
5.MonkeyTest
5.1在Android里面MonkeyTest用来做压力测试,看看程序在非常规的操作下可以坚持多久就不挂掉。
MonkeyTest位于/system/framework/monkey.jar,执行文件位于/system/bin/monkey是集成在adbshell里面的一个命令
*基本配置选项,如设置尝试的事件数
*运行约束选项,如设置只对单独的一个包进行测试
*事件类型和频率
*调试选项
命令格式举例
没有异常的执行结果
出现异常的执行结果
5.2MonkeyTest少了点什么
精确定位事件
程序被动退出后的处理
随机事件执行轨迹的跟踪
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- Android 测试 自己 起来 Junit 经典
![提示](https://static.bdocx.com/images/bang_tan.gif)