Android随笔之——Android单元测试

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

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

一、创建Android Test Project

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

 1 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
 2     xmlns:tools="http://schemas.android.com/tools"
 3     android:layout_width="match_parent"
 4     android:layout_height="match_parent"
 5     android:orientation="vertical" >
 6
 7     <TextView
 8         android:id="@+id/text"
 9         android:layout_width="match_parent"
10         android:layout_height="wrap_content"
11         android:text="@string/hello_world" />
12
13     <!-- 这样直接写字符串是不好的,建议写在strings.xml中 -->
14     <EditText
15         android:id="@+id/edit"
16         android:layout_width="match_parent"
17         android:layout_height="wrap_content"
18         android:hint="请输入" />
19
20 </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多,具体不同请看下面的代码:

 1 <?xml version="1.0" encoding="utf-8"?>
 2 <manifest xmlns:android="http://schemas.android.com/apk/res/android"
 3     package="com.lsj.hello.test"
 4     android:versionCode="1"
 5     android:versionName="1.0" >
 6
 7     <uses-sdk android:minSdkVersion="8" />
 8
 9     <!-- 代表配置单元测试框架的启动装置,启动装置有好几个类,可以选择,一般情况下我们使用上面这个 -->
10     <!-- targetPackage与Hello的package相同,代表单元测试框架和当前应用是处于同一个进程中 -->
11     <instrumentation
12         android:name="android.test.InstrumentationTestRunner"
13         android:targetPackage="com.lsj.hello" />
14
15     <application
16         android:icon="@drawable/ic_launcher"
17         android:label="@string/app_name" >
18         <!-- 代表把单元测试框架中的一些依赖库引入进来 -->
19         <uses-library android:name="android.test.runner" />
20     </application>
21
22 </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,添加单元测试代码

  1 package com.lsj.hello.test;
  2
  3 import android.app.Instrumentation;
  4 import android.test.ActivityInstrumentationTestCase2;
  5 import android.view.KeyEvent;
  6 import android.widget.EditText;
  7 import android.widget.TextView;
  8
  9 import com.lsj.hello.MainActivity;
 10
 11 /**
 12  * ActivityInstrumentationTestCase2继承于TestCase, TestCase类位于junit.framework包下
 13  * 查阅Android API文档,可以发现Android的测试类全部继承自TestCase。 创建一个单元测试大致需要以下步骤:
 14  *
 15  * <pre>
 16  * 1、继承TestCase类或其子类
 17  * 2、定义要使用到的实例变量
 18  * 3、使用setUp()方法,在测试前的对变量和测试环境进行初始化
 19  * ....测试
 20  * 4、在测试完成后进行垃圾回收等善后工作
 21  * </pre>
 22  *
 23  * @author Lion
 24  */
 25 public class MainActivityTest extends
 26         ActivityInstrumentationTestCase2<MainActivity> {
 27
 28     private MainActivity mActivity;
 29     private TextView mTextView;
 30     private EditText mEditText;
 31     private Instrumentation mInstrumentation;
 32
 33     /**
 34      * 重写MainActivityTest的构造方法,注意super内必须为<>内的泛型类,否则会报错。
 35      * 根据Google官方给的示例,其构造函数为午餐,而且测试的时候发现有参的构造函数会导致单元测试失败。
 36      */
 37     public MainActivityTest() {
 38         super(MainActivity.class);
 39     }
 40
 41     @Override
 42     protected void setUp() throws Exception {
 43         /* 执行对变量和测试环境的初始化 */
 44         super.setUp();
 45         // 关闭touch模式,否则key事件会被忽略
 46         setActivityInitialTouchMode(false);
 47
 48         mInstrumentation = getInstrumentation();
 49
 50         // 获取被测试的MainActivity
 51         mActivity = this.getActivity();
 52         // 获取被测试的TextView控件
 53         mTextView = (TextView) mActivity.findViewById(com.lsj.hello.R.id.text);
 54         // 获取被测试的EditText控件
 55         mEditText = (EditText) mActivity.findViewById(com.lsj.hello.R.id.edit);
 56     }
 57
 58     /**
 59      * 测试数据初始化是否为空
 60      */
 61     public void testInit() {
 62         // 断言mActivity是否为空
 63         assertNotNull(mActivity);
 64         // 断言mTextView是否为空
 65         assertNotNull(mTextView);
 66         // 断言mEditText是否为空
 67         assertNotNull(mEditText);
 68     }
 69
 70     /**
 71      * 测试文本框字符串是否相等
 72      */
 73     public void testTextViewString() {
 74         // 断言mTextView显示的文本是否与String.xml中的hello_world相等
 75         assertEquals(
 76                 mActivity.getResources().getString(
 77                         com.lsj.hello.R.string.hello_world), mTextView
 78                         .getText().toString());
 79     }
 80
 81     /**
 82      * 测试输入
 83      */
 84     public void testEditTextInput() {
 85         input();
 86         assertEquals("hello", mEditText.getText().toString());
 87     }
 88
 89     /**
 90      * 模拟输入
 91      */
 92     public void input() {
 93         /* UI组件的相关操作需要在UI线程上进行,所以用Activity的runOnUiThread方法 */
 94         mActivity.runOnUiThread(new Runnable() {
 95             @Override
 96             public void run() {
 97                 mEditText.requestFocus();
 98                 mEditText.performClick();
 99             }
100         });
101         /*
102          * 由于测试用例在单独的线程上执行,所以此处需要同步application,
103          * 调用waitForIdleSync等待测试线程和UI线程同步,才能进行输入操作。
104          * waitForIdleSync和sendKeys不允许在UI线程里运行
105          */
106         mInstrumentation.waitForIdleSync();
107         // 调用sendKeys方法,输入
108         sendKeys(KeyEvent.KEYCODE_H, KeyEvent.KEYCODE_E, KeyEvent.KEYCODE_L,
109                 KeyEvent.KEYCODE_L, KeyEvent.KEYCODE_O);
110     }
111
112     @Override
113     protected void tearDown() throws Exception {
114         /* 在测试完成后进行垃圾回收等工作 */
115         super.tearDown();
116     }
117 }

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

源码下载:百度云盘

作者:登天路

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

时间: 11-17

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

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

今天要讲的是Android里关于时间.日期相关类和方法.在Android中,跟时间.日期有关的类主要有Time.Calendar.Date三个类.而与日期格式化输出有关的DateFormat和SimpleDateFormat,今天会稍微提到关于这两个类的用法,下次会找个时间细讲. 一.Time类 在官方的API中,有建议说使用Time代替Calendar,原因不明,据说用Time对CPU的负荷比较小. 在Time中,年月日时分秒的转义字符分别对应%Y%m%d%H%M%S,切记,大小写千万不能写错

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

在Android中,有一些操作完成以后,会发送广播,比如说发出一条短信,或打出一个电话,如果某个程序接收了这个广播,就会做相应的处理.这个广播跟我们传统意义中的电台广播有些相似之处.之所以叫做广播,就是因为它只负责“说”而不管你“听不听”,也就是不管你接收方如何处理.另外,广播可以被不只一个应用程序所接收,当然也可能不被任何应用程序所接收. 一.Android广播机制三要素: 1.广播(Broadcast):用于发送广播.是一种广泛应用的在应用间传输信息的机制 2.广播接收器(Broadcast

Android随笔之——Android ADB详解

ADB全称Android Debug Bridge, 是android sdk里的一个工具, 用这个工具可以直接操作管理android模拟器或者真实的andriod设备.它主要有以下几个功能: 1.运行设备的shell(命令行) 2.管理模拟器戒设备的端口映射   3.计算机和设备之间上传/下载文件 4.将本地apk软件安装至模拟器戒android设备 adb工具位置:<path-to-sdk>/tools/adb adb源码位置:<path-to-sourcecode>/syst

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

说实话,之前写的两篇博客Android广播机制Broadcast详解.Android时间.日期相关类和方法以及现在要写的,都算是为之后要写的闹钟应用做铺垫,有兴趣的话,大家可以去看看前两篇博客. 一.AlarmManager简介 对于一个闹钟应用的实现,个人觉得最主要的应该要属于AlarmManager了.AlarmManager称为全局定时器,字面意思就是闹钟管理(请原谅我蹩脚的英语),是Android中常用的一种系统级别的提示服务,在特定的时刻为我们广播一个指定的Intent.简单的说就是我

【Android进阶】Junit单元测试环境搭建以及简单实用

单元测试的目的 首先,Junit单元测试要实现的功能,就是用来测试写好的方法是否能够正确的执行,一般多用于对业务方法的测试. 单元测试的环境配置 1.在AndroidManifest清单文件的Application节点下,引入单元测试使用的库 2.在AndroidManifest清单文件与Application节点平行的节点中,添加instrumentation节点 下面是一个完整的配置的代码 <manifest xmlns:android="http://schemas.android.

[Android学习十一]Android开发单元测试

网上关于Android单元测试的文字帖子不胜枚举,看完之后能解决问题是好事,不能解决问题那就是浪费时间和经历.大多数文章来自于这篇文章:http://rexstjohn.com/unit-testing-with-android-studio/       自从投入到Android Studio IDE之后基本上就赖着不走了.这里仅讨论AS(Android Studio)中Android单元测试.           开发一个Android应用单元测试这种程序员的自我修养和基本道德测试是必不可少

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

随笔之所以叫随笔,就是太随意了,说起来,之前的闹钟系列随笔还没写完,争取在十月结束之前找时间把它给写了吧.今天要讲的Android APK的静默安装.卸载.网上关于静默卸载的教程有很多,更有说要调用隐藏API,在源码下用MM命令编译生成APK的,反正我能力有限,没一一研究过,这里选择一种我试验成功的来讲. 静默安装.卸载的好处就是你可以偷偷摸摸,干点坏事什么的,哈哈~ 一.准备工作 要实现静默安装.卸载,首先你要有root权限,能把你的静默安装.卸载程序移动到system/app目录下. 1.用

Android studio 怎么使用单元测试(不需要device)

关于单元测试的使用,写代码过程中有时候需要检测下代码逻辑的可行性与正确性,又不想通过设备运行,那么就可以通过单元测试跑下代码~ 1.首先建立一个Android studio的Android项目: 2. 可以看到有3个不同类别的代码文件夹 第一个是真正的项目文件夹,第二个是基于Android设备单元测试的文件夹,第三个是基于java虚拟机的单元测试文件夹 3.添加测试代码,用于测试 选中[test]文件夹,直接 Ctrl + shift + F10 运行(或者进入ExampleUnitTest类,

在Android studio中进行单元测试和ui测试

1.配置支持单元测试的工程 在写测试之前,让我们做下简单的检查,确保工程配置正确. 首先,确认在Build Variants窗口内的Test Artifact中选择了"Unit Tests". 然后,在工程的src文件夹内创建test和test/java文件夹.需要注意的是,你不能在Android视图下进行这些操作,要么在系统的文件管理器内创建,要么在工程窗口左上方点击下拉菜单选择Project视图.最终的工程结构应该是这样的: (在codelab的剩余部分,你可以返回继续使用Andr