文档章节

Android UnitTest

柳絮飘飞
 柳絮飘飞
发布于 2015/03/11 11:39
字数 1247
阅读 502
收藏 40

Android 的单元测试感觉比java的单元测试更难一些(可能是因为我比较菜...),我想很多小伙伴也是这么认为的吧, 现在做Android开发,大部分的人都是直接就开搞, 不管它三七二十一,先把功能实现再说, 什么文档,单元测试都是浮云.

下面我想带大家了解一下Android里面的单元测试(比较简单的功能方法的测试).比如在我的Android项目中, 有一个对一些数据进行特殊的分组处理, 那么我想测试我写的这个分组处理的方法是不是正常的,那么在Android中就可以利用单元测试进来测试.

要想在Android 中使用单元测试, 那么一件事情是绝对不对忽视的

在Android 中简单的单元测试可以分"四部曲"来完成

  1. 先新建一个Android 工程

  2. 在AndroidManifest.xml文件中进行注册.这一步非常之关键,

  3.  (1) < uses-library android:name ="android.test.runner" />
     (2) <instrumentation
                 android:name="android.test.InstrumentationTestRunner"
                 android:targetPackage="com.example.androidjunittest"
                 android:label="@string/app_name"
             />

a. 在这段代码中 与application 标签同级添加instrumentation标签,其中 targetPackage 是填写当前项目的包名,label就填写项目名称.

b. 在application标签里面添加先要给这个项目加上一个library库, uses-library (注意是application的子标签)

4. 在Android 中 , 我们可能会涉及到很复杂的业务逻辑, 如果你不确定我们的逻辑代码是否有问题, 那么我们可以使用单元测试来验证, 比如,我写了一个分组的Util工具类(判断一串数字是否连续,连续就分一组,否则另起一组) , 里面有很些方法,比较复杂,那么要测试我们写的方法,,那么如何做呢?

现在我就带大家一起来体验一下

package com.example.androidunittest.uitl;

import java.util.ArrayList;
import java.util.List;

/**
 * 该类是对标签进行排序分组,判断标签之间是否连续,如果连续,就将标签分在同一组,
 * 否则,为另一组
 * @author DELL
 *
 */
public class TagsGroupUtil {
	
	/**
	 * 1. 将得到的序列号截取字符后,转换为Long类型数据
	 * @param seq
	 * @return
	 */
	public static long transformSeqToInteger(String seq){ 
		return Long.parseLong(seq.substring(1));
	}
	
	/**
	 * 2. 转换为long类型后对数组进行排序
	 * @return
	 */
	public static long[] sortSeq(long[] arr){
		
		for (int i = 0; i < arr.length; i++) {
			for (int j = 0; j < arr.length - i - 1; j++) {
				if (arr[j] > arr[j + 1]) {
					long temp = arr[j]; 
					arr[j] = arr[j + 1];
					arr[j + 1] = temp;
				}
			}
		}
		return arr;
	}
	
	/**
	 * 3. 对排序后的数组进行分组,判断 是否为连续数,是连续数就分为一组
	 * @param arr
	 * @return
	 */
	public static List<List<Long>> doGroupBySeries(long[] arr){
		List<List<Long>> myGroup = new ArrayList<List<Long>>();
		List<Long> group = new ArrayList<Long>();
		//对其进行分组
		for (int i = 0; i < arr.length; i++) {
			//TODO 对排序后的数据进行判断,是否连续
			if (i < arr.length - 1 && arr[i] + 1 == arr[i + 1]) {
				group.add(arr[i]);
			}else {
				group.add(arr[i]);
				myGroup.add(group);
				group = new ArrayList<Long>();
			}
		}
		return myGroup;
	}

	/**
	 * 4. 将分组后的long类型数据按分组格式转换为String 类型
	 * @param myGroup
	 * @return
	 */
	public static List<List<String>> recoverToString(List<List<Long>> myGroup){
		List<List<String>> myStrGroup = new ArrayList<List<String>>();
		for (int i = 0; i < myGroup.size(); i++) {
			List<String> strList = new ArrayList<String>();
			List<Long> longList = myGroup.get(i);
			for (int j = 0; j < longList.size(); j++) {
				strList.add(String.valueOf(longList.get(j)));
			}
			myStrGroup.add(strList);
		}
		return myStrGroup;
	}
	
	/**
	 * 5. 将String 还原为原来的序列号格式 形式
	 * @param myStrGroup
	 * @return
	 */
	public static List<List<String>> recoverStringToSeq(List<List<String>> myStrGroup){
		List<List<String>> recoverGroup = new ArrayList<List<String>>(); //还原后的集合
		for (int i = 0; i < myStrGroup.size(); i++) {
			List<String> list = new ArrayList<String>();
			List<String> mystrList = myStrGroup.get(i);
			String str = ""; 
			for (int j = 0; j < mystrList.size(); j++) {
				String myStr = mystrList.get(j);
				//不足9位拼接9位
				StringBuffer apStr = new StringBuffer("X");
				for (int l = 0; l < 9 - myStr.length(); ++l) {
					apStr.append("0");
				}
				str = mystrList.get(j); 
				str = apStr.toString() + str; 
//				for (int k = 0; k < 9; k++) {
//					if (myStr.length() < 9) {
////						myStr = "0" + myStr;
//						myStr.insert(0, "0");
//					} else {
//						break;
//					}
//				}
//				myStr = "X" + myStr; //还原序列号
				list.add(str);
			}
			recoverGroup.add(list);
		}
		return recoverGroup;
	}

}


下面我们就对doGroupBySeries() 方法进行单元测试, 要继承AndroidTestCase类,

package com.example.androidunittest.test;

import java.util.List;

import junit.framework.Assert;
import android.test.AndroidTestCase;

import com.example.androidunittest.uitl.TagsGroupUtil;

public class TestFunc extends AndroidTestCase{

	
	public void testDoGroupBySeries(){
		long[] arr = new long[]{1,2,3,4,7,8,9,11,16}; //当然,这里你可以随意定义
		List<List<Long>> list = TagsGroupUtil.doGroupBySeries(arr);
		//实际应该分为四组 1234 , 789 , 11 , 16
		Assert.assertEquals(5, list.size());
		//断言返回的集合大小是否为4, 如果是4,证明我们的方法是正确的逻辑,
	}
	
	
}
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.androidunittest"
    android:versionCode="1"
    android:versionName="1.0" >

    <uses-sdk
        android:minSdkVersion="8"
        android:targetSdkVersion="17" />
    
   

    <application
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
        
         <uses-library android:name ="android.test.runner" />
         
        <activity
            android:name="com.example.androidunittest.MainActivity"
            android:label="@string/app_name" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>
    
    <instrumentation
             android:name="android.test.InstrumentationTestRunner"
             android:targetPackage="com.example.androidunittest"
             android:label="@string/app_name"
         />

</manifest>


运行时, 选择项目工程: run as --> Android JUnit Test 就可以了, 然后切换到JUnit视图查看运行结果

这只是简单的功能方法的单元测试, 如何对一个Activity进行单元测试, 这就有点复杂,希望大家一起进步,共同学习


© 著作权归作者所有

共有 人打赏支持
柳絮飘飞
粉丝 3
博文 8
码字总数 7488
作品 0
浦东
私信 提问
Android使用Java反射机制,被调用的类多出一个未定义的field

用Android Studio开发项目,用到Java反射机制,写了一个解析json方法如下 被调用的类 运行的时候总是报错,debug显示fields的length是3,除了id和itemName还有一个 一直报错找不到“$change...

yuewawa
2016/03/26
880
1
android自动化测试[一]

1、安装JDK 6、Android SDK 2.3 2、安装Eclipse 3.5.2、ADT8.0.1 https://dl-ssl.google.com/android/eclipse/ 3、HelloAndroid E:/Program Files/Android/android-sdk-windows/docs/resour......

eric_zhang
2012/05/23
0
1
android设置layout的时候为什么大小颠倒了啊

我最后两个layout明明设置的是3:2但是到手机上显示的时候成了2:3了,求教。下面是我的布局文件:

找到组织
2013/01/25
278
0
viewPage中嵌套listView结果 listView挤到一块去了 求大神

效果图如上,listView没有布满下面的空间 下面呈上XML代码 (主界面) (lisView的) (listView的Item) 按理说布局应该没限制到listView的高度 怎么会出现这种情况呢 难道是java文件上的错误...

Just-the-CJ
2013/08/26
1K
4
安卓开发 各种布局xml代码示例 【原创】

垂直线性布局: <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layoutwidth......

bluecoffee
2014/05/18
0
0

没有更多内容

加载失败,请刷新页面

加载更多

redis&memcached&SQL&NoSQL

Why 一个应用肯定有两部分逻辑:数据逻辑和业务逻辑。 数据逻辑包括各种I/O,和内部的数据的处理,也就是在内部如何组织数据结构,变量也属于这一部分。 当一个应用变成一个进程,它负责数据逻...

backbye
今天
2
0
什么时候使用字节流、什么时候使用字符流,二者的区别

在程序中所有的数据都是以流的方式进行传输或保存的,程序需要数据的时候要使用输入流读取数据,而当程序需要将一些数据保存起来的时候,就要使用输出流完成。 InputStream 和OutputStream,...

watermelon11
今天
6
0
Alpakka Kafka,反应式Kafka客户端

Alpakka Kafka 是一个要用于 Java 和 Scala 语言的开源的流感知和反应式集成数据线项目。它建立在 Akka Stream之上,提供了 DSL 来支持反应式和流式编程,内置回压功能。Akka Streams 是 Re...

羊八井
今天
5
0
PHP7源码编译安装详解

$ yum groupinstall "development tools"$ yum install -y gcc gcc-c++ autoconf libjpeg libjpeg-devel libpng libpng-devel freetype \freetype-devel libpng libpng-devel libxml2 ......

问题终结者
今天
5
0
Django学习笔记-从创建虚拟环境到启用服务

1 前置条件 windows系统下,目前已经完成anaconda3或miniconda3的安装,这也意味着已经完成了python3的安装。 2 创建虚拟环境 1、通过Anaconda Prompt,使用conda命令创建虚拟环境(base) e...

davidwbnu
昨天
7
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部