Android Instrumentation基础使用
这两天准备研究Robotium的源码,不过由于Robotium是以Instrumentation为基础的,因此就先补习了一下Instrumentation的基础。
Instrumentation是Android自带一个单元测试框架,不过虽然这么说,其对于大部分应用开发人员来讲,最大的作用反而是用于功能或UI测试。
整个框架继承自JUnit框架,使用方法也类似,也是要继承TestCase类。不过在Instrumentation中,需要继承的是几个Google提供的TestCase的子类,其中最重要也是最常用的是ActivityInstrumentationTestCase2这个类,一般进行应用界面测试时都需继承此类(Robotium一般也是使用此类)。当然,Android也提供了几个其他选择用于测试其他组件:
- ActivityUnitTestCase: 用于单独Activity的单元测试
- ApplicationTestCase:用于测试Application
- ProviderTestCase2:用于测试Provider的测试类
- ServiceTestCase:用于测试service的测试类
这几个类全部基于AndroidTestCase类,只不过根据各个组件的特性提供了不同的get方法,如getActivity(), getService()等等,而AndroidTestCase继承于junit的TestCase类,所以所有测试类遵循单元测试框架。
要写一个APK的Instrumentation测试,首先准备一个测试目标——即待测试的APK。然后再建立一个APK作为测试APK,在Manifest中添加如下声明(其中targetPackage一项需要填写测试目标的包名):
<instrumentation android:name="android.test.InstrumentationTestRunner" android:targetPackage="com.test.target" />
同时,还需在Application标签中嵌入如下声明:
<uses-library android:name="android.test.runner" />
声明完毕,可以开始写测试代码了,如下:
package com.tc.upnptest.test; import android.app.Activity; import android.app.Instrumentation.ActivityMonitor; import android.app.Instrumentation.ActivityResult; import android.content.Intent; import android.os.SystemClock; import android.test.ActivityInstrumentationTestCase2; import android.util.Log; import android.widget.Button; import android.widget.TextView; public class MainTest extends ActivityInstrumentationTestCase2{ private Activity target; private TextView tx; public MainTest() throws ClassNotFoundException { super(Class.forName("com.test.target.MainActivity")); } @Override protected void setUp() throws Exception { super.setUp(); target = getActivity(); tx = (TextView) a.findViewById(0x7f060000); } @Override protected void tearDown() throws Exception { super.tearDown(); } public void testMain() { dosomething(); assertTrue(true); } }
首先写一个类继承ActivityInstrumentationTestCase2,如上面的MainTest。需要注意的是此类的构造方法不要加任何参数,在构造方法中直接调用super(Class)即可,其中Class就是要测的Activity的Class。
getActivity()会自动获取Activity对象(就是上面声明的Class对应的Activity),如果Activity没有启动则会自动启动。如果想要主动启动Activity,可以用launchActivityWithIntent,或instrumentation.startActivitySync。
另外,在setUp中调用setActivityInitialTouchMode可以让测试目标处于非触摸模式,以防止测试途中误操作。
![](http://dl2.iteye.com/upload/attachment/0094/0847/44c23628-fb5c-3da4-8b12-9880ba57e4fe.png)
下面的是一些测试中的常用界面操控方法,方法中需要获取instrumentation对象,直接在类中调用getInstrumentation()即可,下面不再赘述。
- 可以直接获取Activity对象,通过findViewById来获取各个View控件,已完成对于各个View的操作,id值可以通过目标APK的R文件获取。
- 测试类仍需遵循Android的基本原则,对于View的更改必须要在UI线程中执行,因此要对View进行直接操作,需要利用runTestOnUiThread(Runnable r)函数。
- 需要对界面直接进行点击、滑动、按键等操作,可以用sendKeys发送一些按键,也可以直接用instrumentation类中的sendKeyDownUpSync, sendKeySync, sendPointerSync等方法发送原始的事件。
当测试时有Activity跳转时,可以用ActivityMonitor捕获新的Activity,如下操作:
ActivityMonitor am = new ActivityMonitor("com.test.target.Activity2", null, false); getInstrumentation().addMonitor(am); Activity b = getInstrumentation().waitForMonitor(am);
测试时往往需要等待一个UI事件执行完毕,再进行下一个测试操作,这时可以直接调用
getInstrumentation().waitForIdleSync();
- Android Instrumentation基础使用
- Android 基础教程之-------Android ProgressBar的使用!
- Android基础教程之---Android状态栏提醒(Notification,NotificationManager)的使用!
- Android SlidingMenu以及ActionBarSherlock的基础使用教程
- Android 基础教程之-------Android ProgressBar的使用!
- Android RenderScript 的使用基础篇
- Android基础知识之String类使用详解
- Android基础—使用IntentService
- android开发基础[源码获取及编译、模拟器使用]
- Android基础之退出键及menu不能使用
- [Android基础] 使用 ExpandableListView 展现分类数据
- Android WebView使用基础
- Android基础——使用Fragment适应不同屏幕和分辨率
- Android基础——Activity的使用
- Android基础之Notification的简介及使用
- 【Android基础】listview控件的使用(1)------最简单的listview的使用
- Android基础教程(一)之------更改与显示文字标签TextView标签的使用
- 【Android开发基础】应用界面主题Theme使用方法
- Android基础之退出键及menu不能使用
- Android基于客户端和服务器的Socket编程例子之Socket基础通讯--socket模型使用