【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>>
Android 的单元测试感觉比java的单元测试更难一些(可能是因为我比较菜...),我想很多小伙伴也是这么认为的吧, 现在做Android开发,大部分的人都是直接就开搞, 不管它三七二十一,先把功能实现再说, 什么文档,单元测试都是浮云.
下面我想带大家了解一下Android里面的单元测试(比较简单的功能方法的测试).比如在我的Android项目中, 有一个对一些数据进行特殊的分组处理, 那么我想测试我写的这个分组处理的方法是不是正常的,那么在Android中就可以利用单元测试进来测试.
要想在Android 中使用单元测试, 那么一件事情是绝对不对忽视的
在Android 中简单的单元测试可以分"四部曲"来完成
先新建一个Android 工程
在AndroidManifest.xml文件中进行注册.这一步非常之关键,
(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进行单元测试, 这就有点复杂,希望大家一起进步,共同学习
来源:oschina
链接:https://my.oschina.net/u/1018305/blog/385197