Android Studio之利用Jnuit進(jìn)行單元測(cè)試

概述

本文是關(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)依賴,如下圖所示:

QQ圖片20200601230015.png

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è)試

image.png

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

(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)注意

image.png

(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)行一下看看


image.png

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é)果:


image.png

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

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容