关于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());//测试结果
    }

}
时间: 2024-08-01 04:36:13

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

行为触发之Android自动化测试instrumentation(一)

由于对测试并没有太多的概念,一不小心搜索到各种前缀:Instrumentation.InstrumentationTestCase.InstrumentationTestSuite.InstrumentationTestRunner 傻了眼,但仔细一看把前缀去掉后大致就分类为了这三类:TestCase.TestSuite.TestRunner.用中文来翻译应该可以认为是测试样例,测试集合,测试运行工具吧.之后再官方文档中搜索InstrumentationTestRunner,用法介绍http:/

(Android+IOS)正在做一个新闻App,做的差不多了,听听大家的建议 (图)

(Android+IOS)正在做一个新闻App,做的差不多了,听听大家的建议! 新闻采集器做好了,前端展示APP界面感觉还不是很好,还需要改进改进,希望发布(Android和IOS版本)前听听大家的建议! 新闻采集器做好了,前端展示APP界面感觉还不是很好,还需要改进改进,希望发布前听听大家的建议!

android——利用SharedPreference做引导界面

很久以前就接触过sharedPreference这个android中的存储介质.但是一直没有实际使用过,今天在看之前做的“民用机型大全”的app时,突然想到可以使用sharedPreference类来改进这个app中的一个缺陷. 此前,我先介绍sharedPreference的使用.Android数据总共有四种存储的方式 一.SharePreference 二.SQLite 三.File 四.ContentProvider SharedPreference类是一个轻量级的存储类,特别适合保存软件

一盘很大的棋:Android Wear要做用户唯一的收件箱

在今年的Google I/O 2014上,Google用一组数据告诉了我们:"安卓月活跃用户达 10 亿,用户每天点亮.解锁手机 1000 亿次". 这么算下来,一个合格的安卓用户每天都要解锁100此次呀.亲,你及格了么?三分钟一次信息提醒,五分钟两次消息推送,一个强迫症怎么可能经受的住这种折磨呢?总有收到新消息的错觉,总有遗漏信息的幻觉,无数次的点亮.解锁手机就成了必修课. Google已经看到了智能手机时代的上述问题,不会让这样的问题再延续到智能手表上,想要借助新的工具和战场,真正

原生Android也能做Web开发了

原生Android也能做Web开发了 版权声明:转载必须注明本文转自严振杰的博客:http://blog.yanzhenjie.com 大家好,今天跟大家介绍一个让原生Android也可以做Web开发的开源项目--AndServer. 开源地址:https://github.com/yanzhenjie/AndServer AndServer是一个Android端的Web服务器,类似Apache或者Tomcat,但又有不同,它是一个普通的Android Library,Android项目Grad

Android中可以做的两件坏事---破解锁屏密码和获取Wifi密码

之前的文章一直在介绍OC,最近也是在找急忙慌的学习IOS,所以Android方面的知识分享就有点中断了,但是我现在还是要靠Android吃饭,所以不能Android的工作不能停呀,今天咋们来看一下我在现实中遇到的两个问题和解决方案 问题一:忘记手机的锁屏密码了 Android中在设置中的安全菜单栏中是可以设置锁屏密码的,有直接的文本密码和手势密码(我们一般会用到的两个密码),但是有时候脑子不好使,密码总是忘了,到时候该怎么办呢? 方法一:我们知道现在最流行的手势锁就是九宫格了,他在设置手势的时候

【转】Jmeter做功能测试的优点和不足

利用Jmeter做功能测试有以下优点: ●    不依赖于界面,如果服务正常启动,传递参数明确就可以添加测试用例,执行测试 ●    测试脚本不需要编程,熟悉http请求,熟悉业务流程,就可以根据页面中input对象来编写测试用例 ●    测试脚本维护方便,可以将测试脚本复制,并且可以将某一部分单独保存 ●    可以跳过页面限制,向后台程序添加非法数据,这样可以测试后台程序的健壮性 ●    利用badboy录制测试脚本,可以快速的形成测试脚本 ●    Jmeter断言可以验证代码中是否有

Android中可以做的两件坏事——破解锁屏密码和获取Wifi密码

今天咋们来看一下我在现实中遇到的两个问题和解决方案 问题一:忘记手机的锁屏密码了 Android中在设置中的安全菜单栏中是可以设置锁屏密码的,有直接的文本密码和手势密码(我们一般会用到的两个密码),但是有时候脑子不好使,密码总是忘了,到时候该怎么办呢? 方法一:我们知道现在最流行的手势锁就是九宫格了,他在设置手势的时候,是有一定规则的,比如手势点不能少于4个,而且有些手势是不存在的,一般手势是九宫格,每个点代表一个数值: 0     1     2 3     4     5 6     7  

Android高级控件(五)——如何打造一个企业级应用对话列表,以QQ,微信为例

Android高级控件(五)--如何打造一个企业级应用对话列表,以QQ,微信为例 看标题这么高大上,实际上,还是运用我么拿到listview去扩展,我们讲什么呢,就是研究一下QQ,微信的这种对话列表,我们先看一个传统的ListView是怎么样的,我们做一个通讯录吧,通讯录的组成就是一个头像,一个名字,一个电话号码,一个点击拨打的按钮,既然这样,那我们的item就出来了 call_list_item.xml <?xml version="1.0" encoding="ut