來源:https://www.cnblogs.com/haixiang/p/13812363.html
爲什麼使用JUnit5
JUnit4被廣泛使用,但是許多場景下使用起來語法較爲繁瑣,JUnit5中支持lambda表達式,語法簡單且代碼不冗餘。
JUnit5易擴展,包容性強,可以接入其他的測試引擎。
功能更強大提供了新的斷言機制、參數化測試、重複性測試等新功能。
ps:開發人員爲什麼還要測試,單測寫這麼規範有必要嗎?其實單測是開發人員必備技能,只不過很多開發人員開發任務太重導致調試完就不管了,沒有系統化得單元測試,單元測試在系統重構時能發揮巨大的作用,可以在重構後快速測試新的接口是否與重構前有出入。
簡介
-
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}):參數化測試提供數據
斷言
org.junit.jupiter.api.Assertions
包的
static
方法。
與
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());
}
);
}
重複性測試
@RepeatedTest(n)
指定需要重複的次數
@RepeatedTest(3)
@DisplayName("重複測試")
void repeatedTest() {
System.out.println("調用");
}
參數化測試
@ParameterizedTest
,同時也需要
@ValueSource
提供一組數據,它支持八種基本類型以及
String
和自定義對象類型,使用極其方便。
@ParameterizedTest
@ValueSource(ints = {1, 2, 3})
@DisplayName("參數化測試")
void paramTest(int a) {
assertTrue(a > 0 && a < 4);
}
內嵌測試
Copy@SpringBootTest
@AutoConfigureMockMvc
@DisplayName("Junit5單元測試")
public class MockTest {
//....
@Nested
@DisplayName("內嵌訂單測試")
class OrderTestClas {
@Test
@DisplayName("取消訂單")
void cancelOrder() {
int status = -1;
System.out.println("取消訂單成功,訂單狀態爲:"+status);
}
}
}
有道無術,術可成;有術無道,止於術
歡迎大家關注Java之道公衆號
好文章,我在看❤️
本文分享自微信公衆號 - Hollis(hollischuang)。
如有侵權,請聯繫 [email protected] 刪除。
本文參與“OSC源創計劃”,歡迎正在閱讀的你也加入,一起分享。