Android单元测试初探——Instrumentation(转载)

学习Android有一段时间了,虽然前段时间对软件测试有了一些了解,不过接触android的单元测试却是头一次。这几天在物流大赛上也用了不少时间,所以对于android的单元测试没有太深入的研究,所以先写个基本入门吧!

首先,我们来了解一下android的测试类的层次结构:

可以看出android中的测试方法主要有AndroidTextCase和InstrumentationTextCase。在这篇文章中,我将介绍Instrumentation这种测试方法,那么什么是Instrumentation?

Instrumentation和Activity有点类似,只不过Activity是需要一个界面的,而Instrumentation并不是这样的,我们可以将它理解为一种没有图形界面的,具有启动能力的,用于监控其他类(用Target
Package声明)的工具类。

下面通过一个简单的例子来讲解Instrumentation的基本测试方法。

1.首先建立一个Android project,类名为Sample,代码如下:

view
source

print?






01 package com.hustophone.sample;






02   






03 import android.app.Activity;






04 import android.os.Bundle;






05 import android.view.View;






06 import android.view.View.OnClickListener;






07 import android.widget.Button;






08 import android.widget.TextView;






09   





10 public class
Sample extends
Activity {






11     private
TextView myText = null;






12     private
Button button = null;






13   






14     @Override






15     public
void onCreate(Bundle savedInstanceState) {






16         super.onCreate(savedInstanceState);






17         setContentView(R.layout.main);






18         myText = (TextView) findViewById(R.id.text1);






19         button = (Button) findViewById(R.id.button1);





20         button.setOnClickListener(new
OnClickListener() {






21             @Override





22             public
void onClick(View arg0) {






23                 myText.setText("Hello Android");






24             }






25         });






26     }






27   





28     public
int add(int i, int j) {





29         return
(i + j);






30     }





31 }

这个程序的功能比较简单,点击按钮之后,TextView的内容由Hello变为Hello
Android.同时,在这个类中,我还写了一个简单的add方法,没有被调用,仅供测试而已。

2. 在src文件夹中添加一个测试包,在测试包中添加一个测试类SampleTest

测试类的代码如下:

view
source

print?






01 package com.hustophone.sample.test;






02   






03 import com.hustophone.sample.R;






04 import com.hustophone.sample.Sample;






05 import android.content.Intent;






06 import android.os.SystemClock;






07 import android.test.InstrumentationTestCase;






08 import android.util.Log;






09 import android.widget.Button;






10 import android.widget.TextView;






11   






12 public class
SampleTest extends
InstrumentationTestCase {






13     private
Sample sample = null;






14     private
Button button = null;






15     private
TextView text = null;






16   






17     /*






18      * 初始设置






19      * @see junit.framework.TestCase#setUp()






20      */






21     @Override






22     protected void setUp()  {






23         try {






24             super.setUp();






25         } catch (Exception e) {






26             e.printStackTrace();






27         }






28         Intent intent = new Intent();






29         intent.setClassName("com.hustophone.sample", Sample.class.getName());






30         intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);






31         sample = (Sample) getInstrumentation().startActivitySync(intent);






32         text = (TextView) sample.findViewById(R.id.text1);






33         button = (Button) sample.findViewById(R.id.button1);






34     }






35   






36     /*






37      * 垃圾清理与资源回收






38      * @see android.test.InstrumentationTestCase#tearDown()






39      */






40     @Override






41     protected void tearDown()  {






42         sample.finish();






43         try {






44             super.tearDown();






45         } catch (Exception e) {






46             e.printStackTrace();






47         }






48     }






49   






50     /*






51      * 活动功能测试






52      */






53     public void testActivity() throws Exception {






54         Log.v("testActivity", "test the Activity");






55         SystemClock.sleep(1500);






56         getInstrumentation().runOnMainSync(new PerformClick(button));






57         SystemClock.sleep(3000);






58         assertEquals("Hello Android", text.getText().toString());






59     }






60   






61     /*






62      * 模拟按钮点击的接口






63      */






64     private class PerformClick implements Runnable {






65         Button btn;






66         public PerformClick(Button button) {






67             btn = button;






68         }






69   






70         public void run() {






71             btn.performClick();






72         }






73     }






74   






75     /*






76      * 测试类中的方法






77      */





78     public
void testAdd() throws
Exception{






79         String tag = "testAdd";






80         Log.v(tag, "test the method");






81         int
test = sample.add(1, 1);






82         assertEquals(2, test);






83     }





84 }

下面来简单讲解一下代码: setUp()和tearDown()都是受保护的方法,通过继承可以覆写这些方法。

在android Developer中有如下的解释 protected void setUp () Since: API
Level 3 Sets up the fixture, for example, open a network connection. This method
is called before a test is executed.

protected void tearDown () Since: API Level 3 Make sure all
resources are cleaned up and garbage collected before moving on to the next
test. Subclasses that override this method should make sure they call
super.tearDown() at the end of the overriding method.

setUp ()用来初始设置,如启动一个Activity,初始化资源等。 tearDown ()则用来垃圾清理与资源回收。

在testActivity()这个测试方法中,我模拟了一个按钮点击事件,然后来判断程序是否按照预期的执行。在这里PerformClick这个方法继承了Runnable接口,通过新的线程来执行模拟事件,之所以这么做,是因为如果直接在UI线程中运行可能会阻滞UI线程。

2.要想正确地执行测试,还需要修改AndroidManifest.xml这个文件.

view
source

print?






01 <?xml
version="1.0"
encoding="utf-8"?>






02 <manifest
xmlns:android="http://schemas.android.com/apk/res/android"






03     package="com.hustophone.sample"
android:versionCode="1"






04     android:versionName="1.0">






05     <application
android:icon="@drawable/icon"
android:label="@string/app_name">






06         <!--用于引入测试库-->





07         <uses-library
android:name="android.test.runner"
/>






08         <activity
android:name=".Sample"
android:label="@string/app_name">






09            <intent-filter>





10               <action
android:name="android.intent.action.MAIN"
/>





11               <category
android:name="android.intent.category.LAUNCHER"
/>






12            </intent-filter>






13        </activity>






14     </application>






15   





16     <uses-sdk
android:minSdkVersion="3"
/>






17     <!--表示被测试的目标包与instrumentation的名称。-->





18     <instrumentation
android:targetPackage="com.hustophone.sample"
android:name="android.test.InstrumentationTestRunner"
/>






19 </manifest>

经过以上步骤,下面可以开始测试了。测试方法也有以下几种,下面介绍两个常用的方法:

(1) 用Eclipse集成的JUnit工具 在Eclipse中选择工程Sample,单击右键,在Run as子菜单选项中选择Android JUnit
Test

同时可以通过LogCat工具查看信息

(2) 通过模拟器运行单元测试

点击模拟器界面的Dev Tools菜单

再点击Instrumentation选项,进入Instrumentation菜单

这里有一个InstrumentationTestRunner,它是测试的入口,点击这个选项,就可以自动运行我们的测试代码。以下为运行结果:

按钮点击前

按钮点击后

至此,一个简单的测试过程结束了。当然,android的测试内容还有很多,也有比较复杂的,我会在以后的学习过程中继续分享我的体会。好了,今天就到这里吧!

Android单元测试初探——Instrumentation(转载),布布扣,bubuko.com

时间: 06-08

Android单元测试初探——Instrumentation(转载)的相关文章

太白---落燕纷飞第一重 Android单元测试Instrumentation和irobotium

PS:叫太白---落燕纷飞纯粹好玩(天涯明月游戏画面感,打击感,碰撞虽然做的不尽人意,但是太白这个职业还是不错,用作开头,,做个旁白而已). 这里的单元测试无论是instrumentation还是irobotium都不适用于游戏,游戏的自动化可以参考公司内wetest的基于引擎的对象识别自动化解决方案 or 前面用sikuli的方案.这里仅适用于传统行业Application范畴.但基本思想类似,都是找到对应的对象,执行对应的方法,而这里的被测目标是具体的class里面的某个function.

深入浅出Android makefile(1)--初探(转载)

转载:http://nfer-zhuang.iteye.com/blog/1752368 一.说明 android build system是一个非常庞大的系统,要编译Android工程.修改或新增Android模块都需要对这个编译系统有一定的了解.但是由于它实在是太庞大了,大家往往是不知道从哪里切入进去,对Android的编译系统进行一个系统的学习. 下面我们尝试从一个小模块逐步对android build system做一个深入剖析.选择的这个模块名字叫做acp ,源码位于build\too

Android随笔之——Android单元测试

在实际开发中,开发android软件的过程需要不断地进行测试.所以掌握Android的单元测试是极其重要的.您应该把单元测试作为Android应用开发周期的一部分,精心编写的测试可以在开发早起帮你发现错误. 关于Android单元测试可以看Google官方给的教程:Best Practices for Testing(需要FQ) 一.创建Android Test Project 1.创建一个Android Project:Hello.并将其布局文件改成如下: 1 <LinearLayout xm

does not specify a android.test.InstrumentationTestRunner instrumentation or does not declare

在Android进行Junit单元测试的时候报以下错误: [2015-04-06 20:26:21 - adtest] adtest does not specify a android.test.InstrumentationTestRunner instrumentation or does not declare uses-library android.test.runner in its AndroidManifest.xml 是权限配置问题,需要在AndroidManifest.xm

android单元测试

http://blog.csdn.net/duancanmeng/article/details/7458851 第一步:在AndroidManifest.xml中加入如下两段代码: 代码一 <uses-library android:name="android.test.runner"/>代表把第三方中的依赖库引入进来 代码二 <instrumentation android:name="android.test.InstrumentationTestRu

android单元测试AndroidTestCase

在实际开发中,开发android软件的过程需要不断的进行测试.而是用Junit测试框架,则是正规android开发的必用技术,在Junit中可以得到组件,可以模拟发送事件和检测程序处理的正确性. 比如,若想验证一个自定义类中的某个方法时,则可以在单元测试中创建这个类对象,并给定适合参数调用该类方法. Android单元测试具体方法如下: (1).创建一个类继承AndroidTestCase,该类为一个单元测试类. (2).在AndroidMainfest中声明instrumentation分支.

Android 性能测试初探(五)

书接上文 Android 性能测试初探之 GPU(四) 前文说了的一些性能测试项大家可能都听说,接下来我们聊聊大家不常关注的测试项- 功耗 . 功耗测试主要从以下几个方面入手进行测试 测试手机安装目标APK前后待机功耗无明显差异 常见使用场景中能够正常进入待机,待机电流在正常范围内. 长时间连续使用应用无异常耗电现象 功耗测试的方法分为两类,一类为软件测试,一类为硬件测试 我们先说说软件测试,这里我们会聊聊一些DIY的思路,软件测试一般分为2类, 第一种采用市场上提供的第三方工具,如金山电池管家

如何进行Android单元测试

如何进行Android单元测试 Menifest.xml中加入: <application>中加入: <uses-library android:name="android.test.runner" /> <application>外面加入: <uses-permission android:name="android.permission.RUN_INSTRUMENTATION" /> <instrumenta

Android单元测试Junit的配置

要进行Android的单元测试首先的配置指令集和用户库,下面是详细的配置步骤 @1:指令集配置(instrumentation) 1.1 打开AndroidManifest.xml文件,点击instrumentation选项 点选ADD后 点instrumentation选项,指令集就添加成功 name必须指定为android.test.InstrumentationTestRunner Target Package为单元测试的包名 Lable随便指定 这样instrumentation就添加成