Activity Test1
源代码下载(免积分) :下载
Acitivty測试的API的父类是InstrumentationTestCase。这个类可以获取Instrumentation。来操作Activity。
对于activity測试,InstrumentationTestCase提供了以下三个功能:
- 
生命周期的控制:使用Instrumentation,您能控制activity的生命周期 
- 
Dependency injection:使用Instrumentation,你可以创建mock的系统对象。能帮助你控制測试环境 
- 
UI交互:使用Instrumentation可以发送按键或者触屏事件 
InstrumentationTestCase測试Activity的基本的子类:
- 
ActivityInstrumentationTestCase2 :这个类用于一个或者多个activity的功能測试 
- 
ActivityUnitTestCase:用于測试隔离的单个activity 
- 
SingleLaunchActivityTestCase:这个类用于測试单个activity。比較少用。 
其它和Activity相关的类
        Mock 相关的类,ViewAsserts等。
- ActivityInstrumentationTestCase2类的測试activity的功能
功能:在SendActivity中定义Button用于启动ReceiveActivity。并把EditText中的数据传递给ReceiveActivity
注意:假设使用的是真机时,首先要把锁屏解开。其次要把键盘调成英文输入。不然的话死的非常慘的,^_^
1. 继承ActivityInstrumentationTestCase2public class SendeActivityFunTest extends
ActivityInstrumentationTestCase2<SendActivity>
2.添加构造方法,这是junit要求的。
    /*为了測试的应用可以正确的实例化,必须设置这个构造函数
     * test runner(InstrumentationTestRunner或者其子类)会调用构造函数去实例化測试类。
     */
    public SendeActivityFunTest() {
        /*android可以利用SendActivity.class和AndroidManifest.xml
         *中的instrumentation标签中的android:targetPackage属性可以获取要測试的类。
         */
        super(SendActivity.class);
        // TODO Auto-generated constructor stub
    }3. 添加setUp方法
//setUp()方法在其它測试方法之前调用,主要是用于初始化变量和清楚曾经的測试。
protected void setUp() throws Exception { // TODO Auto-generated method stub super.setUp(); //保存系统对象的引用 mSendActivity = getActivity(); sendButton = (Button) mSendActivity.findViewById(R.id.sendButton); mEditText = (EditText) mSendActivity.findViewById(R.id.editText); }
4. 加入測试是否正确初始化的方法
    //验证初始化是否正确
    public void testPreconditions()
    {
        assertNotNull(mSendActivity);
        assertNotNull(sendButton);
        assertNotNull(mEditText);
    }5. 測试是否可以正确的启动ReceiveActivity。并获取正确的数据
    //測试是否可以引导ReceiveActivity。并传递的数据正确
    public void testSendMessageToReceiverActivity()
    {
        //创建ActivityMonitor去监听系统和ReceiverActivity的通信
        Instrumentation.ActivityMonitor activityMonitor = getInstrumentation()
                            .addMonitor(ReceiveActivity.class.getName(), null, false);
        /*在UI线程的測试要注意:
         * 创建一个Runnable的匿名内部类,并作为參数传递给runOnUiThread()
         * 
         */
        getInstrumentation().runOnMainSync(new Runnable() {
            @Override
            public void run() {
                // TODO Auto-generated method stub
                //请求获取焦点
                mEditText.requestFocus();
            }
        });
        //等待直到MainHandler中的事件都有被运行完
        getInstrumentation().waitForIdleSync();
        //发送字符串到EditText中
        getInstrumentation().sendStringSync(message);
        getInstrumentation().waitForIdleSync();
        /*TouchUtils:有非常多触摸事件,这些方法可以用在InstrumentationTestCase
         *和ActivityInstrumentationTestCase2上去模拟用户触摸屏幕。
         */
        TouchUtils.clickView(this, sendButton);
        //Block until an Activity is created that matches this monitor
        ReceiveActivity receiveActivity = (ReceiveActivity) activityMonitor
                                        .waitForActivityWithTimeout(TIME_OUT);
        assertNotNull("ReceiverActivity is null", receiveActivity);
        assertEquals("monitor for ReceiverActivity has not been called", 
                                                1,activityMonitor.getHits());
        final TextView receivedMessage = (TextView) receiveActivity
                                                .findViewById(R.id.textView);
        assertNotNull(receivedMessage);
        assertEquals("wrong received message ", message,
                                        receivedMessage.getText().toString());
        //移除activityMonitor
        getInstrumentation().removeMonitor(activityMonitor);
    }使用ActivityInstrumentationTestCase2通常的測试步骤是:
- 初始化的測试(此时setup方法中的变量)
- UI測试
- activity的状态管理的測试(主要用于測试生命周期)
參考的资料:
http://developer.android.com/training/activity-testing/index.html
http://developer.android.com/tools/testing/activity_testing.html
http://developer.android.com/tools/testing/activity_test.html
 
                    
                 
                
            
         浙公网安备 33010602011771号
浙公网安备 33010602011771号