Android UnitTest

北城余情 提交于 2020-01-08 10:30:42

【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>>

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进行单元测试, 这就有点复杂,希望大家一起进步,共同学习


易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!