什么是單元測試
首先介紹一下什么是單元測試,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 創建新項目默認有專門的包結構用來進行單元測試,這個往往被大部分沒有進行單元測試的開發者忽略。
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
勾選需要測試的方法->OK
然后是提示選擇測試類需要放置的包文件夾,選擇test文件夾—>OK
這時,我們會發現我們項目的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()方法前的箭頭,運行結果如下圖所示:
除了在AndroidStudio里面運行,你還可以在命令行通過gradle testDebugUnitTest,或者是gradle testReleaseUnitTest,分別運行debug和release版本的unit testing,這種方式可以一次性運行所有測試類的所有測試方法。 運行后,每個test case的報告可以在project_root/app/build/reports/tests/debug/index.html 這個xml里面看到。大致如下圖:
5.分析單元測試結果
上圖可以看到,測試方法執行完后無異常信息顯示,且方法呈綠色表示測試預期與測試結果一致,測試通過。
另外還可能有兩種測試不通過情況發生:
1.代碼錯誤,測試方法方法呈紅色,并報錯相關代碼錯誤信息,如圖:
2.測試結果與預期不一致,測試方法呈橙色,并展示測試代碼的預期結果與實際結果,如圖:
小結
上面主要講述了單元測試的定義,以及在android studio 上如何編寫單元測試類以及代碼,并分析單元測試結果的幾種情況。
后面我們會持續更新單元測試的必要性,使用Mockito等框架在Android上進行單元測試的方法,以及對在實際項目中進行單元測試的實踐。