概述
本文是關(guān)于android studio利用Junit4進(jìn)行單元測(cè)試的一篇文章,通過本文章可以大致了解單元測(cè)試的相關(guān)信息、junit4單元測(cè)試的相關(guān)流程以及使用和簡單的junit4參數(shù)化測(cè)試應(yīng)用
前言
什么是單元測(cè)試?
單元測(cè)試是開發(fā)者編寫的一小段代碼,用于檢驗(yàn)被測(cè)代碼的一個(gè)很小的、很明確的功能是否正確。通常而言,一個(gè)單元測(cè)試是用于判斷某個(gè)特定條件(或者場(chǎng)景)下某個(gè)特定函數(shù)的行為。
具體這個(gè)單元是什么,要根據(jù)實(shí)際情況判斷。對(duì)于java來講,它可能是一個(gè)類、一個(gè)函數(shù)。
什么是Junit?
JUnit是一個(gè)Java語言的單元測(cè)試框架。它由Kent Beck和Erich Gamma建立,逐漸成為源于Kent Beck的sUnit的xUnit家族中為最成功的一個(gè)。 JUnit有它自己的JUnit擴(kuò)展生態(tài)圈。
實(shí)際上,大部分java開發(fā)IDE都集成了junit,常見的Eclipse、idea都是如此,當(dāng)然,我們今天的主角——脫胎于idea的android studio也不例外。
為什么要進(jìn)行單元測(cè)試?
個(gè)人認(rèn)為單元測(cè)試主要是利用自動(dòng)化手段通過不同的測(cè)試用例、盡可能覆蓋的邊際條件、異常錯(cuò)誤處理等來驗(yàn)證代碼單元的正確性和實(shí)現(xiàn)邏輯的正確與否。
當(dāng)然,也并不是所有代碼都需要單元測(cè)試。實(shí)際上,編寫單元測(cè)試的過程是比較繁瑣的,可能很多程序員都沒有怎么關(guān)注過單元測(cè)試(害,其實(shí)本人也一樣,項(xiàng)目里基本沒用過),都是通過簡單的手動(dòng)的編寫測(cè)試用例、打log以及斷點(diǎn)的方式來進(jìn)行簡單的測(cè)試(我檢討,我檢討.....)。
正文
1.添加依賴
要進(jìn)行junit單元測(cè)試,先要確認(rèn)對(duì)應(yīng)的module下有沒有添加相關(guān)依賴。在創(chuàng)建工程時(shí),系統(tǒng)默認(rèn)在build.gradle(Module:app)中添加了相關(guān)依賴,如下圖所示:

2.編寫需要單元測(cè)試的用例
我們這里以經(jīng)典的三角形邊長問題為例。這個(gè)類應(yīng)該放在正常的代碼目錄中。
public class Triangle {
public boolean isTriangle(int a , int b, int c){
if(a<=0|b<=0|c<=0)//任意一邊應(yīng)大于0
return false;
if((a+b)<=c|(a+c)<=b|(b+c)<=a)//任意兩邊之和大于第三邊
return false;
return true;
}
}
3.測(cè)試
(1)添加測(cè)試

(2)配置所需要的條件,注意選擇Junit

(3)選擇目錄為test
注意:test和AndroidTest是有區(qū)別的,test對(duì)應(yīng)于單元測(cè)試,是運(yùn)行于本地Jvm的;androidTest對(duì)應(yīng)插樁測(cè)試,是要運(yùn)行于硬件設(shè)備或虛擬機(jī)上的。不少博客都對(duì)這一點(diǎn)沒有涉及甚至直接選擇androidTest,這是不符合規(guī)范的,請(qǐng)注意

(4)編寫測(cè)試函數(shù)
隨之,系統(tǒng)為我們自動(dòng)生成了測(cè)試類
public class TriangleTest {
@Before
public void setUp() throws Exception {
}
@Test
public void isTriangle() {
}
}
我們對(duì)測(cè)試函數(shù)進(jìn)行編寫,利用斷言函數(shù)進(jìn)行簡單測(cè)試。
import org.junit.Before;
import org.junit.Test;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertTrue;
public class TriangleTest {
private Triangle triangle;
@Before
public void setUp() throws Exception {
triangle =new Triangle();
}
@Test
public void isTriangle1AboutLength() throws Exception {
assertEquals(triangle.isTriangle(1,2,3),false);
}
@Test
public void isTriangleAboutNegative() throws Exception {
assertTrue(triangle.isTriangle(-1, 2, 3));//簡化寫法
}
}
(5)運(yùn)行并產(chǎn)生結(jié)果
顯然,第2個(gè)測(cè)試用例isTriangleAboutNegative() 應(yīng)該為錯(cuò)誤結(jié)果,我們來運(yùn)行一下看看

ok,系統(tǒng)提示了相應(yīng)的錯(cuò)誤。
4.參數(shù)化測(cè)試
到這里,其實(shí)本文題目——Android Studio之利用Jnuit進(jìn)行單元測(cè)試的相關(guān)內(nèi)容已經(jīng)結(jié)束了。但是好奇的同學(xué)肯定想問,那如果我的測(cè)試需要大量的用例呢,一個(gè)個(gè)填充數(shù)據(jù)好累。
害,懶惰的我也有這樣的想法。所以,參數(shù)化測(cè)試就要登場(chǎng)嘍。
我直接引用了不少博客里的原話(由于關(guān)于很多博客里開頭都是這句話,也不知道誰抄誰的,也就沒法注明來源了...害)
@RunWith
當(dāng)類被@RunWith注解修飾,或者類繼承了一個(gè)被該注解修飾的類,JUnit將會(huì)使用這個(gè)注解所指明的運(yùn)行器(runner)來運(yùn)行測(cè)試,而不使用JUnit默認(rèn)的運(yùn)行器。
要進(jìn)行參數(shù)化測(cè)試,需要在類上面指定如下的運(yùn)行器:
@RunWith (Parameterized.class)
然后,在提供數(shù)據(jù)的方法上加上一個(gè)@Parameters注解,這個(gè)方法必須是靜態(tài)static的,并且返回一個(gè)集合Collection。>
JUnit4中參數(shù)化測(cè)試要點(diǎn):
1. 測(cè)試類必須由Parameterized測(cè)試運(yùn)行器修飾
2. 準(zhǔn)備數(shù)據(jù)。數(shù)據(jù)的準(zhǔn)備需要在一個(gè)方法中進(jìn)行,該方法需要滿足一定的要求:
1)該方法必須由Parameters注解修飾
2)該方法必須為public static的
3)該方法必須返回Collection類型
4)該方法的名字不做要求
5)該方法沒有參數(shù)
....還是直接上例子吧,不然云里霧里的。
對(duì)之前的例子進(jìn)行了修改:
@RunWith(Parameterized.class)
public class TriangleTest {
private Triangle triangle;
private int lengthA;
private int lengthB;
private int lengthC;
private boolean excepted;
@Parameterized.Parameters
@SuppressWarnings("unchecked")
public static Collection prepareData(){
Object [][] object = {{-1,2,3,false},{0,2,2,false},{1,3,1,false},{1,2,2,true}};
return Arrays.asList(object);
}
public TriangleTest(int lengthA, int lengthB, int lengthC,boolean excepted){
this.lengthA=lengthA;
this.lengthB=lengthB;
this.lengthC=lengthC;
this.excepted=excepted;
}
@Before
public void setUp() throws Exception {
triangle =new Triangle();
}
@Test
public void isTriangle() throws Exception {
assertEquals(excepted,triangle.isTriangle(lengthA,lengthB,lengthC));
}
}
運(yùn)行結(jié)果:

ok,junit4的參數(shù)化測(cè)試的簡單嘗試完成了。其實(shí)junit5參數(shù)化測(cè)試得到了更多優(yōu)化和提升,有興趣的小伙伴可以關(guān)注一下。