為什么使用JUnit5
- JUnit4被廣泛使用,但是許多場景下使用起來語法較為繁瑣,JUnit5中支持lambda運算式,語法簡單且代碼不冗余,
- JUnit5易擴展,包容性強,可以接入其他的測驗引擎,
- 功能更強大提供了新的斷言機制、引數化測驗、重復性測驗等新功能,
- ps:開發人員為什么還要測驗,單測寫這么規范有必要嗎?其實單測是開發人員必備技能,只不過很多開發人員開發任務太重導致除錯完就不管了,沒有系統化得單元測驗,單元測驗在系統重構時能發揮巨大的作用,可以在重構后快速測驗新的介面是否與重構前有出入,
簡介

structer
如圖,JUnit5結構如下:
- JUnit Platform: 這是Junit提供的平臺功能模塊,通過它,其它的測驗引擎都可以接入Junit實作介面和執行,
- JUnit JUpiter:這是JUnit5的核心,是一個基于JUnit Platform的引擎實作,它包含許多豐富的新特性來使得自動化測驗更加方便和強大,
- JUnit Vintage:這個模塊是兼容JUnit3、JUnit4版本的測驗引擎,使得舊版本的自動化測驗也可以在JUnit5下正常運行,
依賴引入
我們以SpringBoot2.3.1為例,引入如下依賴,防止使用舊的junit4相關介面我們將其依賴排除,
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> <exclusions> <exclusion> <groupId>org.junit.vintage</groupId> <artifactId>junit-vintage-engine</artifactId> </exclusion> </exclusions> </dependency>
常用注解
-
@BeforeEach:在每個單元測驗方法執行前都執行一遍
-
@BeforeAll:在每個單元測驗方法執行前執行一遍(只執行一次)
-
@DisplayName("商品入庫測驗"):用于指定單元測驗的名稱
-
@Disabled:當前單元測驗置為無效,即單元測驗時跳過該測驗
-
@RepeatedTest(n):重復性測驗,即執行n次
-
@ParameterizedTest:引數化測驗,
-
@ValueSource(ints = {1, 2, 3}):引數化測驗提供資料
斷言
JUnit Jupiter提供了強大的斷言方法用以驗證結果,在使用時需要借助java8的新特性lambda運算式,均是來自org.junit.jupiter.api.Assertions包的static方法,
assertTrue與assertFalse用來判斷條件是否為true或false
@Test @DisplayName("測驗斷言equals") void testEquals() { assertTrue(3 < 4); }
assertNull與assertNotNull用來判斷條件是否為·null
@Test @DisplayName("測驗斷言NotNull") void testNotNull() { assertNotNull(new Object()); }
assertThrows用來判斷執行拋出的例外是否符合預期,并可以使用例外型別接識訓傳值進行其他操作
@Test @DisplayName("測驗斷言拋例外") void testThrows() { ArithmeticException arithExcep = assertThrows(ArithmeticException.class, () -> { int m = 5/0; }); assertEquals("/ by zero", arithExcep.getMessage()); }
assertTimeout用來判斷執行程序是否超時
@Test @DisplayName("測驗斷言超時") void testTimeOut() { String actualResult = assertTimeout(ofSeconds(2), () -> { Thread.sleep(1000); return "a result"; }); System.out.println(actualResult); }
assertAll是組合斷言,當它內部所有斷言正確執行完才算通過
@Test @DisplayName("測驗組合斷言") void testAll() { assertAll("測驗item商品下單", () -> { //模擬用戶余額扣減 assertTrue(1 < 2, "余額不足"); }, () -> { //模擬item資料庫扣減庫存 assertTrue(3 < 4); }, () -> { //模擬交易流水落庫 assertNotNull(new Object()); } ); }
重復性測驗
在許多場景中我們需要對同一個介面方法進行重復測驗,例如對冪等性介面的測驗,
JUnit Jupiter通過使用@RepeatedTest(n)指定需要重復的次數
@RepeatedTest(3)
@DisplayName("重復測驗")
void repeatedTest() {
System.out.println("呼叫");
}

repeat
引數化測驗
引數化測驗可以按照多個引數分別運行多次單元測驗這里有點類似于重復性測驗,只不過每次運行傳入的引數不用,需要使用到@ParameterizedTest,同時也需要@ValueSource提供一組資料,它支持八種基本型別以及String和自定義物件型別,使用極其方便,
@ParameterizedTest @ValueSource(ints = {1, 2, 3}) @DisplayName("引數化測驗") void paramTest(int a) { assertTrue(a > 0 && a < 4); }
內嵌測驗
JUnit5提供了嵌套單元測驗的功能,可以更好展示測驗類之間的業務邏輯關系,我們通常是一個業務對應一個測驗類,有業務關系的類其實可以寫在一起,這樣有利于進行測驗,而且行內的寫法可以大大減少不必要的類,精簡專案,防止類爆炸等一系列問題,
@SpringBootTest @AutoConfigureMockMvc @DisplayName("Junit5單元測驗") public class MockTest { //.... @Nested @DisplayName("內嵌訂單測驗") class OrderTestClas { @Test @DisplayName("取消訂單") void cancelOrder() { int status = -1; System.out.println("取消訂單成功,訂單狀態為:"+status); } } }
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/141679.html
標籤:其他
上一篇:701二叉搜索樹中的插入操作
