前言:为什么要进行单元测试?单元测试能快速是开发者,找到代码中的问题所在,因为是单元测试,所以代码只执行响应的测试单元,执行快解决问题的效率高,同时提高代码的质量。
Android中的单元测试可简单分为两步:
1.Manifast中注册:要注册三个部分。
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.xhm.testandroid" android:versionCode="1" android:versionName="1.0" > <uses-sdk android:minSdkVersion="8" android:targetSdkVersion="17" /> <!-- 单元测试的权限 --> <uses-permission android:name="android.permission.RUN_INSTRUMENTATION" /> <!-- 单元测试的工具基类,测试类需要,其中的name和targetPackage是必须的,其他标签可选。targetPackage名要和package名相同,否者会报异常 --> <instrumentation android:name="android.test.InstrumentationTestRunner"
android:targetPackage="com.xhm.testandroid" /> <application android:allowBackup="true" android:icon="@drawable/ic_launcher" android:label="@string/app_name" android:theme="@style/AppTheme" > <!-- 单元测试的工具包 --> <uses-library android:name="android.test.runner" /> <activity android:name="com.xhm.testandroid.MainActivity" android:label="@string/app_name" > <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> </application> </manifest>
2.测试工具类编写:
package com.xhm.testandroid; import android.test.ActivityInstrumentationTestCase2; /** * 测试工具类编写 其中的MainActivity为要测试的类。 * 当选择Run As---->Android JUnit Test时,就是自动寻找这个类, * 并一次调用测试方法,然后弹出JUnit界面 * @author Administrator * */ public class BaseTest extends ActivityInstrumentationTestCase2<MainActivity> { // 这个构造方法适用于SDK版本低的。super中参数1:被测试类的包名;super中参数2:被测试类的名字 public BaseTest() { super("com.xhm.testandroid", MainActivity.class); } // 这个构造方法适用于SDK版本高的。 public BaseTest(Class<MainActivity> activityClass) { super(activityClass); } // 测试方法随意取名,但必须为public,测试的时候建立的方法都会调用 public void testNull() { // 获得MainActivity,这样就能调用其中的方法了 getActivity(); } public void testTest() { assertEquals("Helloworld!", getActivity().testjia(1, 3).getText()); } }
3.程序测试截图:
测试程序截图:
测试结果截图:
其中的表示测试成功,即返回的结果和预想的一致。
其中的表示测试失败,即返回的结果和预想的不同。
4.注意:
1)也许有人会问为什么运行测试的时候会自动去执行BaseTest这个方法,首先是因为他继承了ActivityInstrumentationTestCase2这个类,而在注册instrumentation时就是关键,你可以将Instrumentation理解为一种没有图形界面的,具有启动能力的,用于监控其他类(用Target Package声明)的工具类。
2)在注册targetPackage时,一定要和项目的package一致,否则会出现问题,然后将测试类建立在targetPackage所指向的包路径下。
3)在写测试工具类的时候,写了两个构造方法,因为发现在android低版本的SDK中,只有一个参数的构造方法不会调用,所以写了两个。
5.常用方法:
AndroidTestCase.getContext()://此函数的功能为得到Android系统的上下文对象,通过它可以取得contentResolver等对象。 ActivityInstrumentationTestCase.getActivity()//此函数的功能为得到被测Activity对象 assertTrue(String message,boolean condition)//声明状态是True assertFalse(String message,boolean condition)//声明状态是False assertEquals(String message,T expected,T expected)//声明两个对象相等 assertNotNull(String message,Object object)//声明对象不为空 assertNull(String message,Object object)//声明对象为空 fall(String message)//测试失败并附带一条消息
所有的方法位于:junit.framework.Assert中,地址http://developer.android.com/reference/junit/framework/Assert.html。