單元測試及Junit的學習
首先需要明白什麼是單元,一般來說,一個單元是指類中的一個方法,而且是公開的方法。因為我們認為非公開的方法是類的實現細節,不需要關心,我們只關心向這些公開方法傳入引數後它能否正常工作,得到正確的結果。所以單元測試也就是對方法的測試。
再來說說為什麼要進行單元測試, 如果不進行單元測試,我們需要將一個功能的整套邏輯編寫完畢並執行後才能知道邏輯是否正確,如果不正確還要進行反覆的修改執行的重複,非常耗時。通過單元測試,我們確保每一個方法的正確性,雖然這也不能確保這個工作流程不會出問題,但是可以大大降低出現bug的機率。
接下來再來看看Junit,這是一個在JAVA中最常見也是最基礎的測試框架。一般來說,我們進行單元測試,在類中寫一個main方法然後執行也可以實現,但是效率太低。藉助這個框架和他便利的API我們可以快速實現一個或多個方法的測試。
使用方法:
1.新建測試類:在我的專案結構目錄(AS2.3.1)下可以看到三個名稱相同的包,其中一個標記為test,這就是包含測試類的包。在下面新建一個類檔案。
2.編寫測試方法:一般來說,測試方法包括三個部分,初始化物件、呼叫方法、比較執行結果。舉例說明:
@Test public void testAdd() throws Exception { Calculator calculator = new Calculator(); int sum = calculator.add(1, 2); Assert.assertEquals(3, sum); }
如上,首先例項化了一個物件,然後呼叫這個物件的方法並獲得返回值,最後比較這個返回值和期望值,相同的話則測試通過。這些比較方法由Assert提供,不過我在最新的框架版本中已經不需要寫這個類名了,可以直接呼叫。實際上,JUNIT主要測試的就是有返回值的方法。
方法前的Test註解就表示這是個測試方法,框架就是根據這個註解來識別執行這個方法的。
3.全部的比較方法:
assertEquals(expected, actual)
驗證expected的值跟actual是一樣的,如果傳入的是object,那麼這裡的對比用的是equals()
assertEquals(expected, actual, tolerance)
這裡傳入的expected和actual是float或double型別的,針對浮點數,如果兩個數的差異在這個偏差值之內,則測試通過,否者測試失敗。(浮點數偏差性)
assertTrue(boolean condition)
驗證contidion的值是true
assertFalse(boolean condition)
驗證contidion的值是false
assertNull(Object obj)
驗證obj的值是null
assertNotNull(Object obj)
驗證obj的值不是null
assertSame(expected, actual)
驗證expected和actual指向同一個物件
assertNotSame(expected, actual)
驗證expected和actual指向不同的物件
fail()
讓測試方法失敗
fail也是有用的,它可以讓你知道這個測試方法確實被呼叫了。
4.測試優化:
如果我們要測試一個類中的多個方法的話,不難發現我們需要在多個方法裡重複同一個例項化過程,為了消除這個過程,我們可以藉助標籤@Before:
Calculator mCalculator;
@Before
public void setup() {
mCalculator = new Calculator();
}
如上所示,首先在類中定義一個全域性變數,然後在一個有BEFORE標籤的方法中將他例項化。被這個標籤修飾後,每個測試方法開始執行前都需要呼叫一次這個方法。與它對應的標籤是@After
另外一組對應的標籤是@BeforeClass,@AfterClass,這兩個修飾的方法會分別在類所有方法測試前後執行。
忽略:如果我們想要執行一個測試類中全部方法而忽略幾個方法的時候可以直接在方法前加標籤@Ignore。
測試異常:如果我們想要測試一個方法能否正常丟擲異常可以設定標籤的expected:
@Test(expected = IllegalArgumentException.class)
public void test() {
mCalculator.divide(4, 0);
}
如上,只有方法丟擲指定的這個異常類才能通過測試。
5.執行測試:
在最新版的AS上,測試方法和測試類前面都有執行按鈕,當然也可以通過右鍵快捷鍵進行執行。這個執行過程是比較快的,完成後控制檯會顯示結果。
如圖,左側顯示結果,綠色表示通過,紅色或黃色失敗,中間的那個表示忽略。右側有詳細失敗資訊,如期望值和實際值等。