Android系统梳理-instrumentation简单介绍
来源:互联网 发布:高潮技巧 知乎 编辑:程序博客网 时间:2024/06/08 09:58
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
- Android系统梳理-instrumentation简单介绍
- Instrumentation介绍
- Android Mvp简单梳理
- android 多媒体系统梳理
- android系统博客梳理
- Android Instrumentation
- android Instrumentation
- android Instrumentation
- android Instrumentation
- android Instrumentation
- Android Wifi简单的梳理
- Android Wifi简单的梳理
- 【Android应用开发】Instrumentation简单的模拟按键发送消息
- instrumentation 功能介绍(javaagent)
- Android系统内核引导流程梳理
- Android系统架构图及简单的系统架构介绍
- Android系统架构图及简单的系统架构介绍
- android.app.instrumentation解析
- Android Fragments 详细使用
- 程序员推荐的最简单有效的科学健脑…
- 怎么做难做的本地生活服务?
- 卫星天线如何接受CCTV-5 CCTV-6
- android实现discuz论坛的登录
- Android系统梳理-instrumentation简单介绍
- 关于Android流畅度不如iOS的几点看…
- 网络通信值获取和解析xml和json
- Unity学习数据库之简单的代码创建删除库和表
- 前谷歌工程团队负责人:如何打造一…
- 程序员学习能力提升三要素
- 音视频接口详解
- LEETCODE: Combination Sum II
- 股份与期权的分配示例