已经在Android SDK中学习了很多关于JUnit的内容,但是感觉一直有几个问题没有解决(不知道大家是否有同样的感受)JUnit的测试都自动化的,完全是不需要任何操作的,有2个问题我一直都还没有找到答案,这2个问题如下:

  1. JUnit可以用来测试Android的基本组成元素:Activity、Service、Provider,那么我们如何控制这些基本元素运行的,这需要Android系统提供一些底层操作的接口才可以做到。
  2. 如何模拟界面操作,比如说:单击界面上的按钮、选择菜单等。

对于第二个问题,我在Cview中似乎找到了答案,Cview中提供一些界面操作的函数,例如:performClick(),看来Android SDK还是提供了一些这方面的函数来模拟各种操作。对于第一个问题,本篇对这个问题幅详细说明下。

首先我们先想下,如果要实现对Activity的测试需要些什么?首先需要创建Activity(这个Android SDK中已经提供了),然后可以控制Activity的生命周期,这些是最基本的。在Android SDK中说明过Activity的创建是异步的,也就是说当我们调用startActivty()后,这个函数立刻返回,而不是等待Activity创建好后才返回,这就需要一些同步方面的操作。将前面的概括起来就是2个方面:控制Activity的生命周期与同步方面的问题。Android SDK为我们提供了 instrument,在android.test包中InstrumentationTestCase 类有个函数getInstrumentation()以及通过adb shell am instrument启动测试例子的方法中,都提到了instrument,下面就对instrumentation详细说明。

什么是Instrumentation?

Instrumentation是执行application instrumentation代码的基类。当应用程序运行的时候instrumentation处于开启,Instrumentation将在任何应用程序运行前初始化,可以通过它监测系统与应用程序之间的交互。Instrumentation implementation通过的AndroidManifest.xml中的<instrumentation>标签进行描述。

Instrumentation似乎有些类似与window中的“钩子(Hook)函数”,在系统与应用程序之间安装了个“”。

android.app包中Instrumentation类结构,如下图所示

其包含有2个内部类:ActivityMoniter、ActivityResult

  • ActivityMoniter:有关特定的Intent的监视。一个ActivityMoniter类的实例通过函数addMonitor(Instrumentation.ActivityMonitor)添加到当前instrumentation中,一旦添加后,每当启动一个新的Activity,ActivityMoniter就会检测,如果匹配,其hit count计数更新等其他操作。一个ActivityMonitor也可以用来寻找一个Activity,通过waitForActivity()方法,这个函数将返直到匹配的活动被创建。
  • ActivityResult:一个活动执行的结果说明,返回到原来的活动。

然后我们看下Instrumentation类的函数,列举其主要函数如下:

  • 同步方面的操作;
  1. 创建一个Activity直到Activity开始运行;
  2. 在主线程中执行一个调用,主线程被阻滞直到调用结束 ;
  3. 当主线程空闲的时候(没有消息等待处理)执行一个调用;
  4. 同步等待主线程处于空闲期

看了这些,我们在结合前面说的2个方面:制Activity的生命周期与同步方面的问题,在Instrumentation类中都实现了,尤其是些同步操作方面的。

Instrumentation简单使用的例子

public classHelloTestextendsInstrumentationTestCase

{

Hello mActivityTested;

public HelloTest() {}

//@Override

protected voidsetUp() throws Exception

{

super.setUp();

Intent intent = new Intent();

intent.setClassName(“com.xmobileapp.hello”, Hello.class.getName());

intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);

mActivityTested = (Hello) getInstrumentation().startActivitySync(intent);

}

//@Override

protected voidtearDown() throws Exception

{

mActivityTested.finish();

super.tearDown();

}

}

在这里我们使用InstrumentationTestCase类的getInstrumentation()函数获取Instrumentation对象,通过Instrumentation的startActivitySync()函数启动一个Activity,直到Avtivity启动后返回。

AndroidManifest.xml中的<instrumentation>标签说明

打开AndroidManifest.xml文件后,将会看到AndroidManifest.xml编辑工具,通过这个工具我们可以很方面的在AndroidManifest.xml添加元素

选择Instrumentation面板后,我们就可以编辑Instrumentation标签了,界面如何操作在这里就不说明了,主要说明属性值的意义:

总结说明

学习完了Instrumentation,心中的很多问题都没有了,还需要到Android SDK中去深入的学习这个类,才能更好的测试Activity对象。

android.app.instrumentation解析相关推荐

  1. java.lang.IllegalAccessException: class xxx is not accessible from class android.app.Instrumentation

    java.lang.IllegalAccessException: class xxx is not accessible from class android.app.Instrumentation ...

  2. c++builder启动了怎么停止_App 竟然是这样跑起来的 —— Android App/Activity 启动流程分析...

    在我的上一篇文章: AJie:按下电源键后竟然发生了这一幕 -- Android 系统启动流程分析​zhuanlan.zhihu.com 我们分析了系统在开机以后的一系列行为,其中最后一阶段 AMS( ...

  3. android email分析,解析sohu邮箱的邮件内容报错~!~!

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 我是使用javamail来接收邮件的,网上的这种程序很多,但是无法解析sohu邮箱的邮件内容(其他邮箱没问题的),求高人指点下,在下不胜感激-! 报错如下 ...

  4. 解决: is not accessible from java.lang.Class android.app.AppComponentFactory

    堆栈如下: Caused by: java.lang.IllegalAccessException: java.lang.Class<com.MainActivity> is not ac ...

  5. android app 目标版本,android – 在gradle中使用目标sdk版本23时,ZBA...

    我在我的项目中使用zbar扫描程序库.更新到sdk 23后,Marshmallow扫描仪无法正常工作.以下是gradle文件.如果我将targetSdkVersion设置为23以外的任何东西,扫描仪正 ...

  6. Android App Bundle(aab)与UnsatisfiedLinkError

    一.起因 所做项目因为是在Google Play市场,并且在2019.8.1开始,必须要携带64位so库,又因为所做App涉及到C层库比较多.大概有10MB左右.所以使用了Google最新的Andro ...

  7. android.app.fragment instantiationexception,recreate导致的Fragment报的错误

    在做夜间模式的时候在Fragment中调用了recreate()然后就报了这个错误 E/AndroidRuntime: FATAL EXCEPTION: main Process: com.xxxx. ...

  8. Android App Bundle

    1. Android App Bundle 是什么? 从 2021 年 8 月起,新应用需要使用 Android App Bundle 才能在 Google Play 中发布. Android App ...

  9. Android App Bundles(谷歌官方动态化框架)

    提纲 是什么(Android App Bundles简介) 为什么使用(aab的四个新功能及实用性) 怎么使用(怎么进行aab的改造) 怎么测试(可以通过google市场测试 而本文主要介绍aab本地 ...

最新文章

  1. 多媒体视像会议中音视频矩阵的用途
  2. 纹理对象的实时姿态估计
  3. S3C6410禁用和启用触摸屏
  4. c# 写入xml 怪异的事情
  5. tensorboard 数据降维分布图_以mnist为例探究tensorboard
  6. Java中的Type接口和Class类有什么区别
  7. C# - 类_使用新成员隐藏基类成员
  8. nginx解析漏洞 只要可以上传文件就会被黑
  9. GridView xml中设置android:focusable=false无效的原因
  10. 点餐系统的设计(一)
  11. update fabric from 1.3 to 1.8
  12. 计算相同维度向量之间的欧氏距离
  13. Linux之find + sed组合替换命令
  14. luoguP3507 [POI2010]GRA 性质 + 动态规划
  15. 常见的网络命令--ping.hostname
  16. docker安装kafka和zookeeper
  17. 2021年安全员-C证(陕西省)考试资料及安全员-C证(陕西省)免费试题
  18. php shopnc.dll,shopnc开发手册-ZX版.doc
  19. python人工智能面试题爱奇艺面试题_经典算法题:爱奇艺研发工程师算法笔试题...
  20. SSM 博客系统开发实战

热门文章

  1. Eclipse下maven使用嵌入式(Embedded)Neo4j创建Hello World项目
  2. 孤零零好可怜的光棍节
  3. Redis数据类型详解(五种)
  4. k8s上安装并初始化Helm。minikube
  5. ASP.NET Web API 异常日志记录
  6. 字幕在看着你:利用恶意字幕文件劫持计算机
  7. # 20155224 第十一周 课堂练习《计算后缀表达式的值》
  8. 手动实现 NSTabViewController 的 Rect Transition 及 Propagate Title-b
  9. Mysql一些重要配置参数的学习与整理(二)
  10. SPIRE.DOC - .NET开发者的福利