Android系统梳理-instrumentation简单介绍

来源:互联网 发布:高潮技巧 知乎 编辑:程序博客网 时间:2024/06/08 09:58

    上次在进行AndroidManifest.xml文件说明时,对其中的instrumenation标签有了一些兴趣,不过由于之前了解不多,这次做一个简单说明,留作备忘。

    Intrumentation是一个用于单元测试的框架,它可以和Junit框架一起方便Android开发人员进行功能模块与业务逻辑的测试,增加对应用的管理。

    针对实用性来说,Junit是一个功能非常强大的单元测试框架,在Java中使用非常普遍。下面是Android下TestCase的结构:


    如果开发人员使用eclipse进行开发,还有方便的图形界面可供操作。

    在Android中使用Junit时,需要在AndroidManifest.xml中进行instrumentation配置,配置语法如下:

<instrumentation android:functionalTest=["true" | "false"]                 android:handleProfiling=["true" | "false"]                 android:icon="drawable resource"                 android:label="string resource"                 android:name="string"                 android:targetPackage="string" />
    其中name一般使用系统提供的类android.test.InstrumentationTestRunner,如果开发人员有需求,也可以从Instrumentation或者InstrumentationTestRunner继承再进行扩展。

    同时,还需要在Application标签中增加<uses-library android:name="android.test.runner" />标签信息,这样在应用编译时才能找到对应信息。如果没有配置以上两个标签的话,很可能会出现如下的错误提示:

    下面用一个例子进行说明单元测试的过程:

    AndroidManifest.xml信息如下:

<manifest xmlns:android="http://schemas.android.com/apk/res/android"    package="com.oldsun.test"    android:versionCode="1"    android:versionName="1.0" >    <uses-sdk        android:minSdkVersion="9"        android:targetSdkVersion="14" />    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />    <application        android:allowBackup="true"        android:icon="@drawable/ic_launcher"        android:label="@string/app_name"        android:theme="@style/AppTheme" >                <activity            android:name="com.oldsun.test.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>        <uses-library android:name="android.test.runner" />    </application><instrumentation android:name="android.test.InstrumentationTestRunner"    android:targetPackage="com.oldsun.test" android:label="Just test" />    </manifest>
    设置测试用例:

package com.oldsun.test;import junit.framework.Assert;import android.test.AndroidTestCase;public class SunTest extends AndroidTestCase {public void justTest() {Assert.assertTrue(FuncUtils.isEmulator());}}测试的方法为:/** * 判断当前是否为模拟器。 *  * @return 是否为模拟器 */    public static boolean isEmulator(){        return  ("sdk".equals(Build.MODEL)) || ("google_sdk".equals(Build.MODEL));    }
执行该用例

可以看到结果如下:


    如果是对Activity交互处理进行测试,可以使用ActivityInstrumentationTestCase2类,下面的Activity中存在一个EditText,一个TextView以及一个Button,点击Button后,会将EditText值赋到TextView中,下面对该点击事件进行测试。

    Activity内容如下:

package com.oldsun.test;import android.app.Activity;import android.os.Bundle;import android.view.View;import android.view.View.OnClickListener;import android.widget.Button;import android.widget.EditText;import android.widget.TextView;public class MainActivity extends Activity {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);final EditText editText = (EditText) findViewById(R.id.editText1);final TextView textView = (TextView) findViewById(R.id.textView1);final Button button = (Button) findViewById(R.id.button1);button.setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View v) {textView.setText(editText.getText().toString());editText.setText("");}});}@Overrideprotected void onDestroy() {super.onDestroy();}}

ActivityInstrumentationTestCase2类如下:

package com.oldsun.test;import android.app.Activity;import android.os.SystemClock;import android.test.ActivityInstrumentationTestCase2;import android.view.KeyEvent;import android.widget.Button;import android.widget.EditText;import android.widget.TextView;public class SunInstrumentationTest extends ActivityInstrumentationTestCase2<MainActivity> {private Button button;private TextView textView;private EditText editText;private Activity activity;public SunInstrumentationTest() {super("com.oldsun.test", MainActivity.class);}@Overrideprotected void setUp() throws Exception {super.setUp();activity = getActivity();editText = (EditText) activity.findViewById(R.id.editText1);textView = (TextView) activity.findViewById(R.id.textView1);button = (Button) activity.findViewById(R.id.button1);}public void testButton() {getInstrumentation().runOnMainSync(new Runnable() {@Overridepublic void run() {editText.requestFocus();}});getInstrumentation().waitForIdleSync();// 填入"hello"sendKeys(KeyEvent.KEYCODE_H);sendKeys(KeyEvent.KEYCODE_E);sendKeys(KeyEvent.KEYCODE_L);sendKeys(KeyEvent.KEYCODE_L);sendKeys(KeyEvent.KEYCODE_O);// 延迟一秒SystemClock.sleep(1000);// 点击按钮getInstrumentation().runOnMainSync(new Runnable() {@Overridepublic void run() {button.requestFocus();button.performClick();}});getInstrumentation().waitForIdleSync();SystemClock.sleep(1000);// 进行断言assertEquals("hello", textView.getText().toString());assertEquals("", editText.getText().toString());}}
执行单元测试方法,正常



    除了在eclipse中通过界面方式调用外,也可以通过命令行的方式调用,例如:adb shell am instrument -e class com.oldsun.test.SunInstrumentationTest-w com.oldsun.test/android.test.InstrumentationTestRunner





0 0
原创粉丝点击