在实际开发中,开发android软件的过程需要不断地进行测试。所以掌握Android的单元测试是极其重要的。您应该把单元测试作为Android应用开发周期的一部分,精心编写的测试可以在开发早起帮你发现错误。

  关于Android单元测试可以看Google官方给的教程:Best Practices for Testing(需要翻墙)

一、创建Android Test Project

  1、创建一个Android Project:Hello。并将其布局文件改成如下:

 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" > <TextView
android:id="@+id/text"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="@string/hello_world" /> <!-- 这样直接写字符串是不好的,建议写在strings.xml中 -->
<EditText
android:id="@+id/edit"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="请输入" /> </LinearLayout>

  2、创建Hello对应的测试项目:File->New->Other->Android->Android Test Project,弹出”New Android Test Project”对话框,在"Project Name"中输入“HelloTest”,点击“Next”。

  3、在”Select Test Target”中,选中你要测试的Android项目,然后点击Finish即可。

  创建完Android Test Project后,打开HelloTest项目的AndroidManifest.xml文件,你会发现里面的配置会比HelloTest多,具体不同请看下面的代码:

 <?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.lsj.hello.test"
android:versionCode="1"
android:versionName="1.0" > <uses-sdk android:minSdkVersion="8" /> <!-- 代表配置单元测试框架的启动装置,启动装置有好几个类,可以选择,一般情况下我们使用上面这个 -->
<!-- targetPackage与Hello的package相同,代表单元测试框架和当前应用是处于同一个进程中 -->
<instrumentation
android:name="android.test.InstrumentationTestRunner"
android:targetPackage="com.lsj.hello" /> <application
android:icon="@drawable/ic_launcher"
android:label="@string/app_name" >
<!-- 代表把单元测试框架中的一些依赖库引入进来 -->
<uses-library android:name="android.test.runner" />
</application> </manifest>

二、单元测试代码编写

  1、创建完Android Test Project后,你会发现HelloTest自动帮你创建了com.lsj.hello.tests的包名。关于Android单元测试相关包、类、方法的命名方式如下:

包名:com.lsj.example————com.lsj.example.tests//对应包名+".tests"
类名:Hello.java————HelloTest.java//对应类名+"Test"
方法名:Hello()————testHello()//"test"+对应方法名

  2、在com.lsj.hello.tests包下建立MainActivityTest.java类,MainActivityTest继承自ActivityInstrumentationTestCase2,关于Android测试类可以看文章末尾的链接

  3、编辑MainActivityTest,添加单元测试代码

 package com.lsj.hello.test;

 import android.app.Instrumentation;
import android.test.ActivityInstrumentationTestCase2;
import android.view.KeyEvent;
import android.widget.EditText;
import android.widget.TextView; import com.lsj.hello.MainActivity; /**
* ActivityInstrumentationTestCase2继承于TestCase, TestCase类位于junit.framework包下
* 查阅Android API文档,可以发现Android的测试类全部继承自TestCase。 创建一个单元测试大致需要以下步骤:
*
* <pre>
* 1、继承TestCase类或其子类
* 2、定义要使用到的实例变量
* 3、使用setUp()方法,在测试前的对变量和测试环境进行初始化
* ....测试
* 4、在测试完成后进行垃圾回收等善后工作
* </pre>
*
* @author Lion
*/
public class MainActivityTest extends
ActivityInstrumentationTestCase2<MainActivity> { private MainActivity mActivity;
private TextView mTextView;
private EditText mEditText;
private Instrumentation mInstrumentation; /**
* 重写MainActivityTest的构造方法,注意super内必须为<>内的泛型类,否则会报错。
* 根据Google官方给的示例,其构造函数为午餐,而且测试的时候发现有参的构造函数会导致单元测试失败。
*/
public MainActivityTest() {
super(MainActivity.class);
} @Override
protected void setUp() throws Exception {
/* 执行对变量和测试环境的初始化 */
super.setUp();
// 关闭touch模式,否则key事件会被忽略
setActivityInitialTouchMode(false); mInstrumentation = getInstrumentation(); // 获取被测试的MainActivity
mActivity = this.getActivity();
// 获取被测试的TextView控件
mTextView = (TextView) mActivity.findViewById(com.lsj.hello.R.id.text);
// 获取被测试的EditText控件
mEditText = (EditText) mActivity.findViewById(com.lsj.hello.R.id.edit);
} /**
* 测试数据初始化是否为空
*/
public void testInit() {
// 断言mActivity是否为空
assertNotNull(mActivity);
// 断言mTextView是否为空
assertNotNull(mTextView);
// 断言mEditText是否为空
assertNotNull(mEditText);
} /**
* 测试文本框字符串是否相等
*/
public void testTextViewString() {
// 断言mTextView显示的文本是否与String.xml中的hello_world相等
assertEquals(
mActivity.getResources().getString(
com.lsj.hello.R.string.hello_world), mTextView
.getText().toString());
} /**
* 测试输入
*/
public void testEditTextInput() {
input();
assertEquals("hello", mEditText.getText().toString());
} /**
* 模拟输入
*/
public void input() {
/* UI组件的相关操作需要在UI线程上进行,所以用Activity的runOnUiThread方法 */
mActivity.runOnUiThread(new Runnable() {
@Override
public void run() {
mEditText.requestFocus();
mEditText.performClick();
}
});
/*
* 由于测试用例在单独的线程上执行,所以此处需要同步application,
* 调用waitForIdleSync等待测试线程和UI线程同步,才能进行输入操作。
* waitForIdleSync和sendKeys不允许在UI线程里运行
*/
mInstrumentation.waitForIdleSync();
// 调用sendKeys方法,输入
sendKeys(KeyEvent.KEYCODE_H, KeyEvent.KEYCODE_E, KeyEvent.KEYCODE_L,
KeyEvent.KEYCODE_L, KeyEvent.KEYCODE_O);
} @Override
protected void tearDown() throws Exception {
/* 在测试完成后进行垃圾回收等工作 */
super.tearDown();
}
}

  这样,一个关于用户输入的单元测试就写完了,关于单元测试相关类的介绍可以查看这篇博客:Android Instrumentation

源码下载:百度云盘

作者:登天路

转载请说明出处:http://www.cnblogs.com/travellife/

Android随笔之——Android单元测试的更多相关文章

  1. Android随笔之——Android时间、日期相关类和方法

    今天要讲的是Android里关于时间.日期相关类和方法.在Android中,跟时间.日期有关的类主要有Time.Calendar.Date三个类.而与日期格式化输出有关的DateFormat和Simp ...

  2. Android随笔之——Android ADB详解

    ADB全称Android Debug Bridge, 是android sdk里的一个工具, 用这个工具可以直接操作管理android模拟器或者真实的andriod设备.它主要有以下几个功能: 1.运 ...

  3. Android随笔之——Android广播机制Broadcast详解

    在Android中,有一些操作完成以后,会发送广播,比如说发出一条短信,或打出一个电话,如果某个程序接收了这个广播,就会做相应的处理.这个广播跟我们传统意义中的电台广播有些相似之处.之所以叫做广播,就 ...

  4. Android随笔之——闹钟制作铺垫之AlarmManager详解

    说实话,之前写的两篇博客Android广播机制Broadcast详解.Android时间.日期相关类和方法以及现在要写的,都算是为之后要写的闹钟应用做铺垫,有兴趣的话,大家可以去看看前两篇博客. 一. ...

  5. [Android]Android MVP&依赖注入&单元测试

    以下内容为原创,欢迎转载,转载请注明 来自天天博客:http://www.cnblogs.com/tiantianbyconan/p/5422443.html Android MVP&依赖注入 ...

  6. Android随笔之——模拟按键操作的几种方式

    前几天转过一篇Android上模拟按键操作.触屏事件的博客,昨天又去找了百度.谷歌了一下,写了一点简单的测试代码,留待不时之需.有需要看之前转载的那篇博客的请看这里→_→转:Android随笔之——使 ...

  7. Android随笔之——静默安装、卸载

    随笔之所以叫随笔,就是太随意了,说起来,之前的闹钟系列随笔还没写完,争取在十月结束之前找时间把它给写了吧.今天要讲的Android APK的静默安装.卸载.网上关于静默卸载的教程有很多,更有说要调用隐 ...

  8. Android随笔之——PackageManager详解

    参考:http://www.cnblogs.com/xingfuzzhd/p/3374504.html 今天要讲的是PackageManager.Android系统为我们提供了很多服务管理的类,包括A ...

  9. [转载] Android随笔之——PackageManager详解

    本文转载自: http://www.cnblogs.com/travellife/p/3932823.html 参考:http://www.cnblogs.com/xingfuzzhd/p/33745 ...

随机推荐

  1. Log4Net异常日志记录在asp.net mvc3.0的应用

    前言 log4net是.Net下一个非常优秀的开源日志记录组件.log4net记录日志的功能非常强大.它可以将日志分不同的等级,以不同的格式,输出到不同的媒介.本文主要是简单的介绍如何在Visual ...

  2. 谈 CSS 模块化

    以前看过模块化的相关资料以及解释,对模块化有了一个表皮的了解,自己也做了一些相关的实践,由于接触到的项目交小,所以也没能更好的去体现和理解模块化,但总体还是有那么一些感悟,但是如果要说怎么才能算是好的 ...

  3. AJax登录。。转

    AJAX即“Asynchronous Javascript And XML”(异步JavaScript和XML),是指一种创建交互式网页应用的网页开发技术.        AJAX 是一种用于创建快速 ...

  4. *HDU 2451 数学

    Simple Addition Expression Time Limit: 5000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Ja ...

  5. Git分布式版本控制系统学习笔记

    Git是一个开源的分布式版本控制系统,用以有效.高速的处理从很小到非常大的项目版本管理.[4]  Git 是 Linus Torvalds 为了帮助管理 Linux 内核开发而开发的一个开放源码的版本 ...

  6. Jquery 系列(1) 基本认识

    本系列Jquery所用测试Demo版本是<uncompressed,development jQuery 1.11.3> 最新的jquery包可以从官网下载请参照http://jquery ...

  7. 使用Powershell收集服务器信息

    function Get-OSInfo         ([string]$Server) {           $object = Get-WmiObject  win32_computersys ...

  8. XMPP iOS客户端实现二:xcode项目配置

    1.下载XMPPFramework,下载地址:https://github.com/robbiehanson/XMPPFramework 2.创建项目并将XMPP库引入: 3.添加需要的库文件: 4. ...

  9. Android内存泄漏分享

    内容概述 内存泄漏和内存管理相关基础. Android中的内存使用. 内存分析工具和实践. 以下内容不考虑非引用类型的数据,或者将其等同为对应的引用类型看待--一切皆对象. 内存泄漏概念 不再使用的对 ...

  10. .Net客户端监听ZooKeeper节点数据变化

    一个很简单的例子,用途是监听zookeeper中某个节点数据的变化,具体请参见代码中的注释 using System; using System.Collections.Generic; using ...