这两天准备研究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一项需要填写测试目标的包名):

    

 

    同时,还需在Application标签中嵌入如下声明:

     

    声明完毕,可以开始写测试代码了,如下:

 

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"));}@Overrideprotected void setUp() throws Exception {super.setUp();                target =  getActivity();                tx = (TextView) a.findViewById(0x7f060000);}@Overrideprotected 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可以让测试目标处于非触摸模式,以防止测试途中误操作。


    写完了测试类,即可开始运行。在eclipse中右击项目,在弹出的菜单中选择Run as → Android JUnit Test运行,即可看到如下界面:
     

    下面的是一些测试中的常用界面操控方法,方法中需要获取instrumentation对象,直接在类中调用getInstrumentation()即可,下面不再赘述。

 

  1. 可以直接获取Activity对象,通过findViewById来获取各个View控件,已完成对于各个View的操作,id值可以通过目标APK的R文件获取。
  2. 测试类仍需遵循Android的基本原则,对于View的更改必须要在UI线程中执行,因此要对View进行直接操作,需要利用runTestOnUiThread(Runnable r)函数。
  3. 需要对界面直接进行点击、滑动、按键等操作,可以用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();

 

 

更多相关文章

  1. Android解析XML三种方式(PULL、SAX、DOM)
  2. Android单元测试(七):Robolectric,在JVM上调用安卓的类
  3. Android(安卓)对应用进行单元测试
  4. Android(安卓)SQLite数据库增删改查操作的使用详解
  5. Android开发贴士集合(Part 1~4)
  6. Android中Linux suspend/resume流程
  7. Android(安卓)WebDriver 浏览器自动测试工具介绍
  8. Android(安卓)SharedPreferences总结及优化
  9. Android开发,ArcGis for Android的一些常见操作

随机推荐

  1. 如何在Mac上更新Chrome?
  2. 我们不一样!运维自动化典型案例观止
  3. Redis6 终于还是迎来了多线程版本!
  4. 我不配有五一
  5. 喂,业余草吗?你的生死簿管理系统我出10万买
  6. 基于 Python 的企业级运维平台开发实战!
  7. 又一个程序员“倒”下,Pandownload作者被
  8. Github 封禁了有伊朗外部贡献者的项目!
  9. 程序员又开始了疯狂的薅羊毛!
  10. 恒丰银行:金融云中 x86 裸机服务实践