最近在看测试方面的东西,看到官网上有一个使用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());//测试结果
} }

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

  1. Xamarin android使用Sqlite做本地存储数据库

    android使用Sqlite做本地存储非常常见(打个比方就像是浏览器要做本地存储使用LocalStorage,貌似不是很恰当,大概就是这个意思). SQLite 是一个软件库,实现了自给自足的.无服 ...

  2. Android 使用ViewPager 做的半吊子的图片轮播

    Android 使用ViewPager 做的半吊子的图片轮播 效果图 虽然不咋样,但是最起码的功能是实现了,下面我们来一步步的实现它. 界面 下面我们来分析一下界面的构成 整体的布局: 因为我们要做出 ...

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

    来源:http://blog.csdn.net/jiangwei0910410003/article/details/41800409 今天咋们来看一下我在现实中遇到的两个问题和解决方案 问题一:忘记 ...

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

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

  5. Struts2 用过滤器代替了 servlet ,???? 且不需要tomcat就可以直接做功能测试

    Struts2  用过滤器代替了 servlet ,????  且不需要tomcat就可以直接做功能测试

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

    利用Jmeter做功能测试有以下优点: ●    不依赖于界面,如果服务正常启动,传递参数明确就可以添加测试用例,执行测试 ●    测试脚本不需要编程,熟悉http请求,熟悉业务流程,就可以根据页面 ...

  7. Cordova Android项目如何做代码混淆

    我想修改build.gradle配置 可是这个文件明确写了// GENERATED FILE! DO NOT EDIT!可是还是试了试: if (cdvReleaseSigningProperties ...

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

    之前的文章一直在介绍OC,最近也是在找急忙慌的学习IOS,所以Android方面的知识分享就有点中断了,但是我现在还是要靠Android吃饭,所以不能Android的工作不能停呀,今天咋们来看一下我在 ...

  9. Android(java)学习笔记219:开发一个多界面的应用程序之两种意图

    1.两种意图: (1)显式意图: 在代码里面用intent设置要开启Activity的字节码.class文件: (2)隐式意图: Android(java)学习笔记218:开发一个多界面的应用程序之人 ...

随机推荐

  1. Java虚拟机运行时数据区域划分

        Java虚拟机数据运行时区域 方法区(Method Area) 存储加载的类信息,常量,静态变量,编译器编译后的代码等数据.虽然JVM规范把方法区描述为堆的一个逻辑部分,但它却有一个别名叫做N ...

  2. c++ 基础知识 0001 const 知识1

    1. C++ const用法 尽可能使用const 2. C++ const 允许指定一个语义约束,编译器会强制实施这个约束,允许程序员告诉编译器某值是保持不变的.如果在编程中确实有某个值保持不变,就 ...

  3. Spring3.x JSR-303

    JSR303介绍 JSR303-Bean Validation描述:This JSR will define a meta-data model and API for JavaBeanTM vali ...

  4. Maven根据不同的环境打包不同的配置

    前言: 在开发过程中,我们的软件会面对不同的运行环境,比如开发环境.测试环境.生产环境,而我们的软件在不同的环境中,有的配置可能会不一样,比如数据源配置.日志文件配置等等. 那么就需要借助maven提 ...

  5. Asp.Net 构架(HttpModule 介绍) - Part.3

    引言 Http 请求处理流程 和 Http Handler 介绍 这两篇文章里,我们首先了解了Http请求在服务器端的处理流程,随后我们知道Http请求最终会由实现了IHttpHandler接口的类进 ...

  6. 【精品分享二】ASP.NET MVC系列精品图书高清PDF下载

    更多图书请关注:第一教育云电子书平台  http://book.1eduyun.com/ 注:本专题提供的所有的电子书下载资源均系收集于百度云,本网站(http://book.1eduyun.com/ ...

  7. (转)Android 50道面试题总结(大家看看吧)

    1. 方法重载与覆盖的区别?(Overload与Override的区别)2. String 和StringBuffer的区别3. 字符串“abcde”通过写一个函数不让调用第三方的字符串,实现一个字符 ...

  8. 如何设计并使用FireMonkeyStyle

    如何设计并使用FireMonkeyStyle FireMonkey使用Style来控制控件的显示方式. 每个控件都有一个StyleLookup属性,FireMonkey就是通过控件的这个属性来在当前窗 ...

  9. nodejs 中的 NODE_PATH

    在使用 nodejs 开发中我们都免不了要去安装一些第三方模块. 那么你或多或少的遇到过以下一些问题 再继续阅读之前,我们先来弄清楚一个概念. npm install --global xxx 属于全 ...

  10. 终端启动tomcat报错 command not found 解决方法 (含启动和关闭命令)

    Tomcat配置步骤: 1.cd命令进入Tomcat安装路径的bin下 2.sudo chmod 755*.sh 输入appleID密码获得相关权限 3.sudo sh ./startup.sh启动T ...