利用ActivityInstrumentationTestCase2测试Activity
测试 Activity
在 Android中 ,用来测试 activity的类 是 ActivityInstrumentationTestCase2
以一个简单 的程序来 说 明 这 个 类 的使用方法以及 Android单 元 测试 流程
首先是程序界面 :两个文本框 ,一个 Spinner,两个按钮 ,要对 Reset按钮进 行 测试 ,按下 Reset按钮 后 ,所有控件状态 恢 复为进 入 Activity时 的状 态 .如果有文本框不为 空 ,那么测试 失 败 ,Reset的按钮 事件没有起到作用 .
下面看一下我们的测试类:
新建一个类 ,继 承自 ActivityInstrumentationTestCase2 :
package com.zhang.test.login.test;
import android.test.ActivityInstrumentationTestCase2;
public class TestInput extends ActivityInstrumentationTestCase2 {
}
因为 在 eclipse中已经 加入了被 测 程序的源 码 ,所以现 在可以直接使用 LoginApplication中的任何资 源 。( 单击 LoginApplicationTest->Properties->Java Build Path->Projects,点击 Add找到被测 程序的工程 LoginApplication,选 中加入到 测试 工程 )
修改完成后的 TestInput类 :
package com.zhang.test.login.test;
import android.test.ActivityInstrumentationTestCase2;
import com.zhang.test.login.MainActivity;
public class TestInput extends ActivityInstrumentationTestCase2 {
public TestInput() {
super("com.zhang.test.login", MainActivity.class);
}
@Override
protected void setUp() throws Exception {
super.setUp();
}
@Override
protected void tearDown() throws Exception {
super.tearDown();
}
}
具体编写 规 范 请 参考文档中的 :Resources->Tutorials->Hello Testing章节 (最新版 2.2文档 ),文档目录 在 :/docs /resources/tutorials/testing/helloandroid_test.html
准
就 绪 ,现 在 ,就可以开 始 编 写 测试 用例了 !
在对 Activity进 行 测试 的 时 候 ,无非就是发 送按 键 ,或者直接通过给 某些控件的方法控制事件 ,以及需要等待的时 候 线 程 进 行睡眠 :
发 送按 键 a
sendKeys(KeyEvent.KEYCODE_A);
发 送按 键 数字 0
sendKeys(KeyEvent.KEYCODE_0);
延迟 2500毫秒
SystenClock.sleep(2500);
有些时 候需要在主 线 程中运行方法 ,使用
getInstrumentation().runOnMainSync(new Runnable() {
@Override
public void run() {
//文本框控件获 取焦点
mText.requestFocus();
//文本框控件点击 事件
mText.performClick();
}
});
在每 个 测试 用例的最后 ,需要对测试结 果 进 行断言 ,使用 junit原生的 assert系列方法对结 果 进 行断言即可 .
完整的代码 :
package com.zhang.test.login.test;
import android.app.Activity;
import android.os.SystemClock;
import android.test.ActivityInstrumentationTestCase2;
import android.util.Log;
import android.view.KeyEvent;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Spinner;
import com.zhang.test.login.MainActivity;
import com.zhang.test.login.R;
public class TestInput extends ActivityInstrumentationTestCase2 {
private static final String TAG = "TestInput";
private Activity mActivity;
private Button mButtonReset;
private EditText mUsername, mPassword;
private Spinner mSpinner;
public TestInput() {
super("com.zhang.test.login", MainActivity.class);
}
@Override
protected void setUp() throws Exception {
super.setUp();
mActivity = getActivity();
mUsername = (EditText) mActivity.findViewById(R.id.txt_username);
mPassword = (EditText) mActivity.findViewById(R.id.txt_password);
mSpinner = (Spinner) mActivity.findViewById(R.id.spinner_gender);
mButtonReset = (Button) mActivity.findViewById(R.id.btn_reset);
}
@Override
protected void tearDown() throws Exception {
super.tearDown();
}
public void testInput() {
boolean pass = false;
//username文本框获 取焦点 ,必须 运行在主 线 程中 ,故使用如下方法 :
getInstrumentation().runOnMainSync(new Runnable() {
@Override
public void run() {
mUsername.requestFocus();
}
});
getInstrumentation().waitForIdleSync();
sendKeys(KeyEvent.KEYCODE_A);
sendKeys(KeyEvent.KEYCODE_0);
sendKeys(KeyEvent.KEYCODE_1);
sendKeys(KeyEvent.KEYCODE_2);
//延迟 2秒
SystemClock.sleep(2000);
//同上
getInstrumentation().runOnMainSync(new Runnable() {
@Override
public void run() {
mPassword.requestFocus();
}
});
getInstrumentation().waitForIdleSync();
sendKeys(KeyEvent.KEYCODE_A);
sendKeys(KeyEvent.KEYCODE_0);
sendKeys(KeyEvent.KEYCODE_1);
sendKeys(KeyEvent.KEYCODE_2);
getInstrumentation().runOnMainSync(new Runnable() {
@Override
public void run() {
mSpinner.requestFocus();
mSpinner.performClick();
}
});
getInstrumentation().waitForIdleSync();
//往下选 2个 ,再按中间 确定 键
sendKeys(KeyEvent.KEYCODE_DPAD_DOWN);
sendKeys(KeyEvent.KEYCODE_DPAD_DOWN);
sendKeys(KeyEvent.KEYCODE_DPAD_CENTER);
SystemClock.sleep(1000);
//按下 reset,最后检查 是否已重置
getInstrumentation().runOnMainSync(new Runnable() {
@Override
public void run() {
mButtonReset.requestFocus();
mButtonReset.performClick();
}
});
getInstrumentation().waitForIdleSync();
SystemClock.sleep(1000);
Log.d(TAG, "username:" + mUsername.getText().toString().equals(""));
Log.d(TAG, "Password:" + mPassword.getText().toString().equals(""));
Log.d(TAG, "username:" + mSpinner.getSelectedItemPosition());
//进 行断言
assertEquals("Username text not null!", "", mUsername.getText().toString());
assertEquals("Password text not null!", "", mPassword.getText().toString());
assertEquals("Gender selection error!", 0, mSpinner.getSelectedItemPosition());
}
}
测试 方法
命令行 :
adb shell am instrument -w com.zhang.test.login.test/android.test.InstrumentationTestRunner
命令使用方法请查 看文档 :/docs/guide/developing/testing/testing_otheride.html
测试结 果 :
测试 正常用一个 . 来表示
出现 异常用 .E
测试 出 错 用 .F
更多相关文章
- android开发之Parcelable使用详解
- android sample之Notepad(带下划线的TestView)
- Android设置中“强行停止”详解
- Android绘图基础:Canvas、Paint等的使用
- android中URI简介
- Android多媒体开发(4)——添加FFmpeg支持
- 【转】Android(安卓)APP性能及专项测试(个人整理)
- Android(安卓)NDK开发:JNI基础篇
- MediaStore与Media.EXTERNAL_CONTENT_URI