这里需要把Instrumentation类的视频的上、中、下三集一起看,把内容总结一下。。。

视频地址:

http://study.163.com/course/courseLearn.htm?courseId=712011#/learn/video?lessonId=881433&courseId=712011

http://study.163.com/course/courseLearn.htm?courseId=712011#/learn/video?lessonId=878104&courseId=712011

http://study.163.com/course/courseLearn.htm?courseId=712011#/learn/video?lessonId=877119&courseId=712011

一、引子(面试题)

如何在一个app中做event事件?(touch、滑动和按键等)

答:

1、Device.touch(x,y)          //monkeyrunner的方法

2、solo.clickOnView(String id)        //Robotium的方法

3、driver.findElement(By.name("xxx")).click()             //Selenium的方法

4、不采用任何开源或非开源的测试框架(monkeyrunner、robotium、appium、selenium、Androiddriver、uiautomator等都不许用)

此时就需要用google提供的基础测试类Instrumentation

注:Robotium就是基于Instrumentation的二次封装,所以理解Robotium的原理还在于Instrumentation

问题:

1、Robotium的运行原理是什么?

答:Robotium是通过对instrumentation的注入事件(sendKeyDownUpSync、sendPointerSync)的封装、以及通过调用instrumentation的runOnMainSync、runOnUiThread等来完成对控件的操作,让用户可以直接调用一个solo.clickOnText等方法,就能够完成操作,而不用自己去写一堆找到控件,然后再点击触发等方法

2、为什么Robotium的testcase需要一个setup方法和一个teardown方法

答:分析Instrumentation的原理,InstrumentationTestCase或者InstrumentationTestCase2都需要有一个setUp和tearDown方法,一个用来进行前期准备,获取所有需要的东西,比如说主Activity,比如说获取到所有的控件ID,然后在下面的test方法中才能用这些ID进行相应测试的操作。

根本原因是因为:setup和teardown是junit必须执行的生命周期函数,所有的Test类都是基于这个做的,所以必须要有这两个方法才行。

3、Robotium的AndroidManifest.xml中配置的节点<Instrumentation>又是什么含义?不导入jnuit-report.jar包的时候,Instrumentation中配置的 android:name="android.test.InstrumentationTestRunner",如果用了这个jnuit-report.jar包之后,就需要修改Instrumenation的节点配置为android:name="com.zutubi.android.junitreport.JUnitReportTestRunner"?

答:按照理解,这个配置的Instrumentation节点的anroid:name指的就是用以启动的TestRuner的名,只有配置了这个之后,测试程序才能够启动起来,这个启动过程应该又回到上一篇Robotium里面记录的那样了,运行一个测试程序,会先运行一个系统工具Activity Manager,然后Activity Manager通过Instrumentation框架来启动和控制TestRunner,但是你需要给Activity Manager提供TestRuner的名,就是指的这里配置的android:name

Instrumentation的这个AndroidManifest.xml的标签中的配置(该标签位于Application标签的外面):

<instrumentation

android:name="android.test.InstrumentationTestRunner"

android:targetPackage="xxx.xxx.xxx"/>

android:name指定TestRunner,这就是导入了一个命名空间,一个包名,就是android.test.Instrumentation,这个标签一导入,系统就知道你要应用Instrumentation测试框架了

二、万能的Instrumentation类

First:what is Instrumentation?

答:

Instrumentation是执行Application Instrumentation代码的基类,当应用程序运行的时候Instrumentation处于开启(备注:需要了解应用程序运行之前就已经开启哪些东西?),Instrumentation将在任何应用程序运行前初始化,可以通过它监测系统与应用程序之间的交互。

Second:how to implement the Instrumentation?

答:

Instrumentation的实现是通过在AndroidManifext.xml中加一个<Instrumentation>的标签,具体如下:

Third:how to understand the Instrumentation?

答:

Instrumentaion比较像Windows里面的钩子(Hook),在系统和应用程序之间装了一个特殊装置用以进行监听

做自动化测试的时候用到的类是:InstrumetationTestCase类,(Instrumentation是一个测试基类,InstrumentationTestCase是一个测试框架,那么具体Android本身官方提供的多个测试类之间是个啥样的关系呢??

Robotium是对InsttumentationTestCase2的二次封装,这个InstrumentationTestCase其实跟InstrumenatationTestCase2已经有点差别了,InstrumentationTestCase2已经对InstrumentationTestCase做了一个简化处理,比如增加了public方法getActivity(),就可以直接获得当前被测对象的Activity,而不用像在InstrumentationTestCase里面那样,通过getInstrumentation().startActivitySync(intent)方法来获取Activity了。。。

三、实现touch、keyEvent等事件

1、准备安卓的环境(java环境、eclipse、环境变量配置)

2、写一个安卓的app(被测app)

3、开始写测试框架代码

测试必须要保证测试app和被测程序签名一致,既然是自己写的,那么肯定是用debug签名比较方便,这样被测代码和测试代码在不同的包中,但是在同一个工程里,签名肯定一致;如果没有源码的话,也需要签名一致,就需要进行重签名了。

具体的代码就是,建一个包名来创建app,然后一个待测程序建立一个包,一个测试程序建立一个包。

Instrumentation对安卓操作系统的版本没有要求,这个是特别好的

demo1:实现对一个button的点击操作

具体代码内容详解:

1、Intent.setClassName(packageName, MainActivity.class.getName)方法

2、startActivitySync(Intent intent)方法:

Intent是一个意图,在安卓开发里面可以通过Intent.setClass,之后用this.startActivity(Intent intent)就可以跳转到你想要去的那个Activity

startActivitySync的这个方法,在启动了这个APP之后,将这个Intent传递给他,然后它就能够给你返回当前的MainActivity

3、Junit4的assertEquals和robotium的searchText

assertEquals方法需要输入expected string和actual string,然后两者进行比较,返回是否相等,用此来做校验;

serchText方法是将所有的TextView全部找到,放到一个集合中,然后去做对比(通过正则表达式)

Instrumentation是怎么跟robotium对应上的???其实直接看InstrumenetationTestCase2,会更加清晰,所以Robotium是需要extends InstrumentationTestCase2的。其实东西都是一样的,就是你要知道包名,然后知道类名,然后通过这个类名去findViewById来获取到你需要的控件ID,之后调用方法对这个控件进行操作(包括sendPointSync等注入事件、runOnMainSync、runOnUiThread方法等来操作控件),之后根据当前控件的状态,与你预期想要的状态做一个对比,就可以知道是否达到了想到的结果。另外,还需要在AndroidManifest.xml中进行<Instrumentation>节点的配置,用以告诉ActivityManager要用什么TestRunner。

demo2和demo3:

instrumentation.sendKeyDownUPSync详解

sendPointerSync方法(能够产生手指操作控件的响应效果)

MotionEvent

一个Error的处理:java.lang.SecurityException:Injecting to another application requires INJECT_EVENT permission

解决方案:直接在AndroidManifest.xml中进行配置,如果出现类似的这种涉及到perssion的问题,也是类似,直接在Manifest.xml中配置即可,应该都能解决。

四、Instrumentation类API基础

1、callActivityOnCreate(Activity activity, Bundle icicle)

说明:Perform calling of an activity's onCreate(Bundle) method

一个activity的onCreate(Bundle savedInstanceState)方法,这个Bundle对象是用来存储Activity的状态,比如Activity被stop但不是destory时,这个对象就用上了,之后再resume回来时,就要用到这个Bundle对象来恢复之前的状态,比较像递归里面的堆栈信息的存储

2、getContext()

说明:得到上下文的一个引用,就可以进一步得到view、windows、控件

3、startActivitySync()

说明:以同步方式start一个Activity,即这是一个阻塞性的方法,必须要start起这个Activity之后,返回了结果,然后程序才能继续往下走

所谓同步:就是发出一个请求后什么事都不做,一直等待请求返回后才会继续做事;

所谓异步:就是发出请求后继续去做其他事,这个请求处理完成后会通知你,这时候就可以处理这个回应了。

4、sendKeyDownUpSync(int key)

downup的点击事件,通过对一些系统按键的操作来完成。比如KeyEvent.KEYCODE_MENU、KeyEvent.KEYCODE_HOME等

5、sendPointerSync(MotionEvent event)

发送一个具体的点触事件,MotionEvent有obtain方法,可以针对具体的Down或者UP事件进行操作,在某一个特定的坐标位置,通过这个能够看到测试case时,程序上会出现被点击选中的阴影效果,而直接调用button.performClick()方法是没有这个效果的。

金阳光测试

新浪微博:金阳光woody

         

          网站地址

1、百度搜:金阳光测试

2、官网:www.goldensunshine.cc

微信公众号

Instrumentation类——Android自动化测试学习历程的更多相关文章

  1. Robotium原理初步--Android自动化测试学习历程

    章节:自动化基础篇——Robotium原理初步(第四讲) 主要讲解内容与笔记: 一.基于控件 1.spinner——下拉菜单 2.TabHost——左右滑动选择菜单,类似电话本 3.Gallery—— ...

  2. 百度Cafe原理--Android自动化测试学习历程

    主要讲解内容及笔记: 一.Cafe原理 Cafe是一款自动化测试框架,解决问题:跨进程测试.快速深度测试 官网:http://baiduqa.github.io/Cafe/ Cafe provides ...

  3. Appium原理初步--Android自动化测试学习历程

    章节:自动化基础篇——Appium原理初步(第七讲) 本期关键词: Appium.跨语言跨平台.Bootstrap 主要讲解内容及笔记: 一.what is appium 一种封装了uiautomat ...

  4. Android-Junit-Report测试报告生成——Android自动化测试学习历程

    视频地址: http://www.chuanke.com/v1983382-135467-384869.html 这个内容其实已经在用了,我在上一篇文章robotium—只有apk文件的测试中已经讲过 ...

  5. AndroidDriver原理初步--Android自动化测试学习历程

    章节:自动化基础篇——AndroidDriver原理初步(第六讲) 主要讲解内容及笔记: 一.AndroidDriver核心原理 对上图的解析: PC端的端口通过adb,将android版的Remot ...

  6. Selenium原理初步--Android自动化测试学习历程

    章节:自动化基础篇——Selenium原理初步(第五讲) 注:其实所有的东西都是应该先去用,但是工具基本都一样,底层都是用的最基础的内容实现的,测试应该做的是: (1)熟练使用工具,了解各个工具的利弊 ...

  7. MonkeyRunner原理初步--Android自动化测试学习历程

    章节:自动化基础篇——MonkeyRunner原理初步 主要讲解内容及笔记: 一.理论知识和脚本演示 最佳方式是上官网文档去查看monkeyrunner的介绍,官网上不去,就找了一个本地的androi ...

  8. 自动化预备知识上&&下--Android自动化测试学习历程

    章节:自动化基础篇——自动化预备知识上&&下 主要讲解内容及笔记: 一.需要具备的能力: 测试一年,编程一年,熟悉并掌握业界自动化测试工具(monkey--压力测试.monkeyrun ...

  9. 跨进程(同一app不同进程之间通信)——Android自动化测试学习历程

    视频地址:http://study.163.com/course/courseLearn.htm?courseId=712011#/learn/video?lessonId=877122&co ...

随机推荐

  1. 机器学习进阶-图像基本操作-边界补全操作 1.cv2.copyMakeBoder(img, top_size, bottom_size, left_size, right_size, cv2.BORDER_REPLICATE) 进行边界的补零操作 2.cv2.BORDER_REPLICATE(边界补零复制操作)...

    1.cv2.copyMakeBoder(img, top_size, bottom_size, left_size, right_size, cv2.BORDER_REPLICATE) 参数说明: i ...

  2. JEECG-P3首个开源插件诞生!CMS网站插件 Jeecg-p3-biz-cms1.0版本发布!

    Jeecg-P3-Biz-Cms   ( JEECG 首个微服务插件,支持小程序的CMS系统) 是基于JEECG-P3 微服务框架开发的CMS建站系统,可轻量级集成进jeecg系统,定制各类网站模板, ...

  3. jsfl 常用方法

    //打开fla文档 fl.openDocument (JSFL_PATH+"tongzhi.fla"); //发布flash fl.getDocumentDOM().publish ...

  4. css3 - 特性

    伪类选择器 伪类选择器,不用再使用js来控制奇偶不同了 tr:nth-child(even){ background-color: white; } tr:nth-child(odd){ backgr ...

  5. 使用adb查看CPU和内存

    adb shell ->cat/sys/class/net/wlan0/address 获取Mac地址 abd shell –>cat /proc/cpuinfo 获取CPU信息 adb ...

  6. vscode 不显示指定后缀名pyc文件

    不显示python生成的pyc文件 不显示java eclipse编辑器生成的.metadata生成的文件夹 py文件执行后会生成.pyc文件,会影响侧边栏的使用,可以通过如下设置隐藏.pyc等中间文 ...

  7. 移动端取消touch高亮效果

    在做移动端页面时,会发现所有a标签在触发点击时或者所有设置了伪类 :active 的元素,默认都会在激活状态时,显示高亮框,如果不想要这个高亮,那么你可以通过css以下方法来禁止: .xxx{ -we ...

  8. MyBatis对入参对象的属性空判断

      <!-- 查询学生list,like姓名 -->   <select id="getStudentListLikeName" parameterType=&q ...

  9. http post 接口

    集团需求管理系统通过网状网与给各省公司需求管理系统进行交互.落地方为发起方提供访问的URL,发起方使用HTTP POST方法发送请求报文并得到应答报文,发起方作为落地方的HTTP客户端,落地方作为发起 ...

  10. Structs复习 OGNL

    Dominmodel只有传 User.age 类似的这种Structs才能帮创建对象 Dominmodel User里必须有空的构造方法 OGNL:OBJECT GRAPHIC NAVAGATION ...