TDD 專案中測試案例隨開發增長,全量執行耗時過長。傳統 TestSuite 依賴 Package/Class 結構組織,無法對應業務功能,缺乏彈性。
JUnit 4 引入 Annotation、Runner 體系(ParentRunner、BlockJUnit4ClassRunner 等),提供擴展切入點。核心類關係圖:

圖 1. JUnit 4 核心類調用關係

圖 2. 核心類結構
對應業務屬性:
| Annotation | 參數 | 作用域 |
|---|---|---|
| @Product | 產品名稱 | Class |
| @Release | 版本號 | Class/Method |
| @Component | 子模組 | Class |
| @Feature | 功能/需求 | Class/Method |
| @Defect | 缺陷編號 | Class/Method |
| @UseCaseID | 用例編號 | Class/Method |
範例:
@Target({TYPE, METHOD}) @Retention(RUNTIME)
public @interface Feature { String value(); }
使用者輸入格式:"Release=9.9,Feature=Test Add Feature",解析為條件物件。

每個條件產生一個 Filter,測試方法需通過所有過濾器才執行。工廠模式動態建立過濾器:
public interface Filter { boolean shouldRun(IntentionObject obj); }
public class FilterFactory { ... }
繼承 BlockJUnit4ClassRunner,覆寫 getFilteredChildren() 整合過濾邏輯:
public class ExtensionRunner extends BlockJUnit4ClassRunner {
protected List getFilteredChildren() { ... }
protected boolean shouldRun(FrameworkMethod method) { ... }
}
繼承關係:

測試類標註 Annotation:
@Test @Feature("Test Add Feature") @Release("9.9") public void testAdd() { ... }
@Test @Release("9.9") public void testMinus() { ... }
執行條件 "Release=9.9,Feature=Test Add Feature" 僅執行 testAdd;條件 "Release=9.9" 則兩者皆執行。結果截圖:


業務屬性驅動的細粒度測試組織,大幅提升 TDD 實踐效率,讓開發者快速聚焦相關測試。