关于Android使用Instrumentation做功能测试的时候遇到的一个问题

最近在看测试方面的东西,看到官网上有一个使用Instrumentation做功能测试的例子,自己敲了敲,但是在自己的手机上就是测不过。

经过调试,我发现是我手机上的输入法把输入事件拦截了,需要多输入一些空格给输入法,让它来把字符填入EditText中才行。

这件事再次印证了android中事件传播的机制,keyevent先传递给当前上下文,然后分发给窗体实例,然后是输入法,接着发给父VIEW,一层层的发往焦点控件

                     touchevent则是反过来的

下面是我的测试代码,有三个类,Lesson3,Lesson3start,lesson3test

Lesson3.java

package com.example.u3.testpractice;

import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.view.inputmethod.InputMethodManager;
import android.widget.Button;
import android.widget.EditText;

/**
 * Created by U3 on 2015/4/11.
 */
public class Lesson3 extends Activity  {
    private final String exString = "hi, unit test";
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.lesson3layout);
        Button mButton = (Button)findViewById(R.id.bt_lesson3);
        Button mButton2 = (Button)findViewById(R.id.bt_lesson3_2);
        final EditText mEditText = (EditText)findViewById(R.id.et_edittext);
        mButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent mIntent = new Intent(Lesson3.this,Lesson3start.class);
                mIntent.putExtra("ExString",exString);
                startActivity(mIntent);
                finish();
            }
        });
        mButton2.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent mIntent = new Intent(Lesson3.this,Lesson3start.class);
                final String msg  = mEditText.getText().toString();
                mIntent.putExtra("ExString",msg);
                startActivity(mIntent);
                finish();
            }
        });

    }
}
//该类代码很简单,不做过多说明

lesson3start.java

public class Lesson3start extends Activity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.lesson3layout);

        TextView mTextView = (TextView)findViewById(R.id.tv_lesson3);
        String exString = getIntent().getStringExtra("ExString");
        mTextView.setText(exString);
    }
}

下面是最关键的测试类代码,lesson3test2.java

public class Lesson3Test2 extends ActivityInstrumentationTestCase2<Lesson3> {
    private Lesson3 lesson3test;
    private  Lesson3start lesson3start;
    private static final String TEXT_MSG1 = "hello receiver";
    private static final String TEXT_MSG2 = "helloreceiver";
    public Lesson3Test2() {
        super(Lesson3.class);
    }

    @Override
    protected void setUp() throws Exception {
        super.setUp();
        setActivityInitialTouchMode(true);//设置触摸模式
        lesson3test = getActivity();//得到activity
    }

    public void testPrecondition() {
        assertNotNull("Activity is not run", lesson3test);
    }

    public void testSendandRecive_Text() {
        final Button mButton = (Button) lesson3test.findViewById(R.id.bt_lesson3_2);
        final EditText mEditText = (EditText) lesson3test.findViewById(R.id.et_edittext);
        Instrumentation.ActivityMonitor reciveMonitor = getInstrumentation().addMonitor(Lesson3start.class.getName(), null, false);//设置monitor检测activity
        getInstrumentation().runOnMainSync(new Runnable() {
            @Override
            public void run() {
                mEditText.requestFocus();//主线程获得焦点
            }
        });
        getInstrumentation().waitForIdleSync();//等待主线程完成操作
        getInstrumentation().sendStringSync(TEXT_MSG1+" ");//输入String
        getInstrumentation().waitForIdleSync();//等待
        TouchUtils.clickView(this,mButton);//模拟点击按钮
        lesson3start = (Lesson3start)reciveMonitor.waitForActivityWithTimeout(1000);
        assertNotNull("not start activity",lesson3start);
        assertEquals("moniter not hit",1,reciveMonitor.getHits());
        assertEquals("wrong class to start",Lesson3start.class,lesson3start.getClass());
        final TextView testText = (TextView)lesson3start.findViewById(R.id.tv_lesson3);

        assertEquals("wrong text to send",TEXT_MSG2,testText.getText());//测试结果
    }

}
原文地址:https://www.cnblogs.com/u3shadow/p/4419333.html