1. 程式人生 > >Junit幾個實用功能

Junit幾個實用功能

Junit有不少實用的功能,如組合(SuiteClasses)、分類(Category)、排序(FixMethodOrder),可以通過使用這些功能,靈活的組合單元測試,按照自己的需求批量、分類、有序的進行執行,下面來看下具體的用法。

以下示例是在spring-boot的基礎上跑的,原始碼地址rest-base.

一、Junit依賴

要使用上述全部功能,版本建議選擇4.12(spring 2.5.6確定不能使用了,該版本只能使用junit4.4).

二、實現方式

以下為一個具體示例:

// 1
@RunWith(Categories.class)
@Suite.SuiteClasses({OrderServiceTest.class,OrderServiceTest.class})
@IncludeCategory(UnifiedOrderTaskTests.class)
public class OrderServiceTestSuit {

}

// 2
/**
 * 單元測試分類標記,用於標記統一訂單改造相關方法
 */
public interface UnifiedOrderTaskTests {

}

// 3
@RunWith(SpringJUnit4ClassRunner.class)
@SpringBootTest(classes=BaseApplication.class)
@FixMethodOrder(MethodSorters.NAME_ASCENDING)
public class OrderServiceTest {

    @Category(UnifiedOrderTaskTests.class)
    @Test
    public void testInsert(){
        System.err.println("test insert");
    }

    @Category(UnifiedOrderTaskTests.class)
    @Test
    public void testQuery(){
        System.err.println("test query");
    }

    @Test
    public void testQuery2(){
        System.err.println("test query 2");
    }
}

@RunWith(SpringJUnit4ClassRunner.class)
@SpringBootTest(classes=BaseApplication.class)
@FixMethodOrder(MethodSorters.NAME_ASCENDING)
public class OrderService2Test {

    @Category(UnifiedOrderTaskTests.class)
    @Test
    public void testInsert(){
        System.err.println("OrderService2 test insert");
    }

    @Test
    public void testQuery(){
        System.err.println("OrderService2 test query");
    }

    @Category(UnifiedOrderTaskTests.class)
    @Test
    public void testQuery2(){
        System.err.println("OrderService2 test query 2");
    }
}

當在OrderServiceTestSuit上執行單元測試時,控制檯輸出結果如下:
test insert
test query
OrderService2 test insert
OrderService2 test query 2

通過控制檯結果可以看出:
* 兩個單元測試同時執行,實現了組合效果
* 添加了Category註解的方法才會執行,實現了分類效果
* 單元測試方法有序執行,實現了有序執行的效果

下面來看下其具體實現。

組合

主要依賴 @Suite.SuiteClasses 註解,其引數是一個Class陣列,用於指定組合執行的多個單元測試類。

分類

一個場景:某個service方法的單元測試裡已經有了10個方法,新增業務時添加了10個方法,執行單元測試時只想執行新的部分,那就可以通過宣告一個介面作為型別,只執行該介面標記的單元測試方法,具體步驟如下:
1. 宣告標識介面,如上例中的UnifiedOrderTaskTests
2. 在對應的方法上添加註解@Category(UnifiedOrderTaskTests.class)
3. 在組合類上新增@RunWith(Categories.class)
4. 在類上新增@IncludeCategory(UnifiedOrderTaskTests.class)指明只有標記為UnifiedOrderTaskTests的方法才執行。

有序

主要是通過@FixMethodOrder註解指定,其引數有三種選擇:
1. MethodSorters.JVM 根據JVM獲取順序執行,我在jdk1.7上執行,並不是方法宣告的順序
2. MethodSorters.DEFAULT Sorts the test methods in a deterministic, but not predictable, order() (以確定但不可預期的順序執行)
3. MethodSorters.NAME_ASCENDING 按方法名字母順序執行,有先後依賴的方法,可以適當調整方法名稱來達到先後執行的目的