測試類別應具的基本特性
測試程式碼覆蓋率的高低,無法真實表示單元測試的品質:因為這些工具,並不會考慮測試程式是否有足以驗證程式正確性的斷言。但是撰寫底層工具元件(如UDE)、或是以TDD開發專案時,還是會盡可能追求100%的有效(有斷言的)覆蓋率,以突顯確實未測試到的邏輯部分。
許多類別有一些共通特性,若要逐一撰寫測試,會花費許多精力。部分情境,像是ENUM,有一些分支情況需要用特殊的技巧才能執行到。UDE-Testkit包裝了幾個方法,可以一次完成這些共用特性的測試。
GeneralCoverageUtils.doGeneralCoverage
doGeneralCoverage() 會測試一些Java Object 的基本條款,如hashcode()、equals()必須同時定義、clone method 測試。每一個專案,可以固定新增測試程式如下:UDECoverageTest
/**
* 只為補充基本 工具類別 / Constructor / Enumeration / JavaBean的覆蓋率,以便看 coverage report時,找到其它應完成測試的部分。
*/
public class UDECoverageTest {
@Rule
public TestInfo testInfo = new TestInfo();
@Test
public void test() {
GeneralCoverageUtils.doGeneralCoverage(this.testInfo.getTestClass());
}
}
測試對象為靜態工具類別
若 Class 有加上@UtilityClassAssertion,doGeneralCoverage 會增加驗證以下特性:
- 宣告為final class、
- 只有public static method、
- 建構子為private並且會抛出AssertionError。
// 標準工具類別範本
@UtilityClassAssertion
public final class UdeResourceUtils {
private UdeResourceUtils() {
throw new AssertionError();
}
}
測試對象為JavaBean
- 驗證getter / setter 是否為對等操作,即設定一個值後,getter是否會取回相同物件。
- 如果 accessor 有做額外處理的類別,就應該要另行撰寫測試。