Android單元測試(一):初識單元測試

timg.jpeg

什么是單元測試

首先介紹一下什么是單元測試,Wikipedia給出的定義是:在計算機編程中,單元測試是一種軟件測試方法,通過該方法,對單個源代碼單元,一套或多套計算機程序模塊以及相關的控制數據,使用過程和操作過程進行測試,以確定它們是否適合使用。

通俗來說,單元測試是為了測試某一個代碼單元而寫的測試代碼。但是什么叫“一個代碼單元”呢?是一個模塊、還是一個類、還是一個方法(函數)呢?不同的人、不同的語言,都有不同的理解。一般的定義,尤其是是在OOP領域,是一個類的一個方法。在此,我們也這樣理解:單元測試,是為了測試某一個類的某一個方法能否正常工作,而寫的測試代碼。

如何進行單元測試

一般來說,我們寫單元測試,會用到一些單元測試框架。常見的Java單元測試框架有JUnit、TestNG等,在Android中會用到JUnit4、Mockito、Robolectric等。在這里,我們先通過JUnit4進行簡單單元測試編寫,關于JUnit4后面會有專門的文章進行介紹,這里只是進行單元測試演示。

針對某功能類進行測試,假設現在有個計算整數相加的類Calculator,如下:

public class Calculator {

    public static int add(int a, int b) {
        return a + b;
    }
}

相信之前對沒有使用過單元測試的開發者來說,下面的代碼是測試此功能類的一種方式:

public class CalculatorTest {

    public static void main(String[] args) {
        int result = Calculator.add(1, 2);
        System.out.println(result);
    }
}

這樣沒錯,但是如果要測試的方法很多,又或者結果互相影響,大量的測試類或者main方法集中大量測試方法,造成項目代碼結構以及可讀性降低,Android Studio 創建新項目默認有專門的包結構用來進行單元測試,這個往往被大部分沒有進行單元測試的開發者忽略。

test1.png

androidTest
運行在真機或者模擬器上,而不是運行在本地環境下的虛擬機中。如果在測試時,需要使用Android框架組件(例如Activity)、Android framework api 和 supporting api,或者Android特定的環境因素(例如Context),這時候你就要創建一個專門的測試類放置與此目錄下。

test
如果你的單元測試不依賴Android環境,那么你需要使用一個本地的單元測試,運行在本地的JVM上,這樣的話,就有利于你的測試速度,因為加載物理設備是很耗費時間的。

開始Unit Test

1.配置項目

在app/build.gradle中添加

testCompile ‘junit:junit:4.12’ 

2.生成測試類

代碼中選中需要測試的類,右鍵Go To —> Test選擇Create New Test

test2.png

勾選需要測試的方法->OK

test3.png

然后是提示選擇測試類需要放置的包文件夾,選擇test文件夾—>OK

test4.png

這時,我們會發現我們項目的test目錄下會多了一個和Calculator類相同包文件結構的CalculatorTest測試類

當然上面的這些創建測試類的步驟也可以手動實現,不過建議測試類的文件包結構和需要測試的類相同。

3.編寫測試代碼

public class CalculatorTest {

    @Test
    public void testAdd() {
        int sum = Calculator.add(1, 2);
        Assert.assertEquals(3, sum);
    }
}

這里的CalculatorTest是Calculator對應的測試類。而這里的testAdd()就是add()這個方法對應的測試方法。所以,寫單元測試,就是給你的每個類的每個public方法寫對于的測試方法。非public方法我們一般是不測試的,雖然可以通過反射等手段去做,但是一般看來,非public方法是這個類的實現細節,我們并不關心,我們只關心某一個public方法的輸入、輸出。

一般來說,一個方法對應的測試方法主要分為3部分,以上面的測試方法為例:

1.setup。一般是new出你要測試的那個類,以及其他一些前提條件的設置:Calculator calculator = new Calculator();

2.執行操作。一般是調用你要測試的那個方法,獲得運行結果:
int sum = calculator.add(1, 2);

3.驗證結果。驗證得到的結果跟預期中是一樣的:Assert.assertEquals(3, sum);

4.運行單元測試

打開CalculatorTest,用鼠標右鍵點擊testAdd()方法,選擇Run testAdd(),或者點擊testAdd()方法前的箭頭,運行結果如下圖所示:

test5.png

除了在AndroidStudio里面運行,你還可以在命令行通過gradle testDebugUnitTest,或者是gradle testReleaseUnitTest,分別運行debug和release版本的unit testing,這種方式可以一次性運行所有測試類的所有測試方法。 運行后,每個test case的報告可以在project_root/app/build/reports/tests/debug/index.html 這個xml里面看到。大致如下圖:

test6.png

5.分析單元測試結果

上圖可以看到,測試方法執行完后無異常信息顯示,且方法呈綠色表示測試預期與測試結果一致,測試通過。

另外還可能有兩種測試不通過情況發生:

1.代碼錯誤,測試方法方法呈紅色,并報錯相關代碼錯誤信息,如圖:

test7.png

2.測試結果與預期不一致,測試方法呈橙色,并展示測試代碼的預期結果與實際結果,如圖:

test8.png

小結

上面主要講述了單元測試的定義,以及在android studio 上如何編寫單元測試類以及代碼,并分析單元測試結果的幾種情況。

后面我們會持續更新單元測試的必要性,使用Mockito等框架在Android上進行單元測試的方法,以及對在實際項目中進行單元測試的實踐。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 173,138評論 25 708
  • afinalAfinal是一個android的ioc,orm框架 https://github.com/yangf...
    wgl0419閱讀 6,341評論 1 9
  • 我有一個表哥,身高一米七不到,而我身高其實也不算高,剛好180。每逢節日的時候,親戚伙兒聚到一起都會拿我們倆的身高...
    呵_卑劣的我閱讀 452評論 0 0
  • -簡書新增歷史版本恢復功能 進入文章編輯界面,在編輯欄左上角有一個時鐘模樣的按鈕,點擊進入歷史版本恢復界面。 點擊...
    簡書閱讀 735評論 4 9
  • 之前看了一篇響應式編程的文章,準備應用到項目中,所以學習下rxjava的使用方式 官方文檔 響應式編程 rxjav...
    最美下雨天閱讀 274評論 0 0