Springboot集成JUnit5優(yōu)雅進(jìn)行單元測試
點(diǎn)擊上方藍(lán)色字體,選擇“標(biāo)星公眾號(hào)”
優(yōu)質(zhì)文章,第一時(shí)間送達(dá)
? 作者?|??海向
來源 |? urlify.cn/bMJj2q
66套java從入門到精通實(shí)戰(zhàn)課程分享
為什么使用JUnit5
JUnit4被廣泛使用,但是許多場景下使用起來語法較為繁瑣,JUnit5中支持lambda表達(dá)式,語法簡單且代碼不冗余。
JUnit5易擴(kuò)展,包容性強(qiáng),可以接入其他的測試引擎。
功能更強(qiáng)大提供了新的斷言機(jī)制、參數(shù)化測試、重復(fù)性測試等新功能。
ps:開發(fā)人員為什么還要測試,單測寫這么規(guī)范有必要嗎?其實(shí)單測是開發(fā)人員必備技能,只不過很多開發(fā)人員開發(fā)任務(wù)太重導(dǎo)致調(diào)試完就不管了,沒有系統(tǒng)化得單元測試,單元測試在系統(tǒng)重構(gòu)時(shí)能發(fā)揮巨大的作用,可以在重構(gòu)后快速測試新的接口是否與重構(gòu)前有出入。
簡介

如圖,JUnit5結(jié)構(gòu)如下:
JUnit Platform:這是Junit提供的平臺(tái)功能模塊,通過它,其它的測試引擎都可以接入Junit實(shí)現(xiàn)接口和執(zhí)行。
JUnit JUpiter:這是JUnit5的核心,是一個(gè)基于JUnit Platform的引擎實(shí)現(xiàn),它包含許多豐富的新特性來使得自動(dòng)化測試更加方便和強(qiáng)大。
JUnit Vintage:這個(gè)模塊是兼容JUnit3、JUnit4版本的測試引擎,使得舊版本的自動(dòng)化測試也可以在JUnit5下正常運(yùn)行。
依賴引入
我們以SpringBoot2.3.1為例,引入如下依賴,防止使用舊的junit4相關(guān)接口我們將其依賴排除。
????????
????????????org.springframework.boot
????????????spring-boot-starter-test
????????????test
????????????
????????????????
????????????????????org.junit.vintage
????????????????????junit-vintage-engine
????????????????
????????????
????????
常用注解
@BeforeEach:在每個(gè)單元測試方法執(zhí)行前都執(zhí)行一遍
@BeforeAll:在每個(gè)單元測試方法執(zhí)行前執(zhí)行一遍(只執(zhí)行一次)
@DisplayName("商品入庫測試"):用于指定單元測試的名稱
@Disabled:當(dāng)前單元測試置為無效,即單元測試時(shí)跳過該測試
@RepeatedTest(n):重復(fù)性測試,即執(zhí)行n次
@ParameterizedTest:參數(shù)化測試,
@ValueSource(ints = {1, 2, 3}):參數(shù)化測試提供數(shù)據(jù)
斷言
JUnit Jupiter提供了強(qiáng)大的斷言方法用以驗(yàn)證結(jié)果,在使用時(shí)需要借助java8的新特性lambda表達(dá)式,均是來自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用來判斷執(zhí)行拋出的異常是否符合預(yù)期,并可以使用異常類型接收返回值進(jìn)行其他操作
????@Test
????@DisplayName("測試斷言拋異常")
????void?testThrows()?{
????????ArithmeticException?arithExcep?=?assertThrows(ArithmeticException.class,?()?->?{
????????????int?m?=?5/0;
????????});
????????assertEquals("/?by?zero",?arithExcep.getMessage());
????}
assertTimeout用來判斷執(zhí)行過程是否超時(shí)
????@Test
????@DisplayName("測試斷言超時(shí)")
????void?testTimeOut()?{
????????String?actualResult?=?assertTimeout(ofSeconds(2),?()?->?{
????????????Thread.sleep(1000);
????????????return?"a?result";
????????});
????????System.out.println(actualResult);
????}
assertAll是組合斷言,當(dāng)它內(nèi)部所有斷言正確執(zhí)行完才算通過
????@Test
????@DisplayName("測試組合斷言")
????void?testAll()?{
????????assertAll("測試item商品下單",
????????????????()?->?{
????????????????????//模擬用戶余額扣減
????????????????????assertTrue(1?2,?"余額不足");
????????????????},
????????????????()?->?{
????????????????????//模擬item數(shù)據(jù)庫扣減庫存
????????????????????assertTrue(3?4);
????????????????},
????????????????()?->?{
????????????????????//模擬交易流水落庫
????????????????????assertNotNull(new?Object());
????????????????}
????????);
????}
重復(fù)性測試
在許多場景中我們需要對同一個(gè)接口方法進(jìn)行重復(fù)測試,例如對冪等性接口的測試。
JUnit Jupiter通過使用@RepeatedTest(n)指定需要重復(fù)的次數(shù)
????@RepeatedTest(3)
????@DisplayName("重復(fù)測試")
????void?repeatedTest()?{
????????System.out.println("調(diào)用");
????}
參數(shù)化測試
參數(shù)化測試可以按照多個(gè)參數(shù)分別運(yùn)行多次單元測試這里有點(diǎn)類似于重復(fù)性測試,只不過每次運(yùn)行傳入的參數(shù)不用。需要使用到@ParameterizedTest,同時(shí)也需要@ValueSource提供一組數(shù)據(jù),它支持八種基本類型以及String和自定義對象類型,使用極其方便。
????@ParameterizedTest
????@ValueSource(ints?=?{1,?2,?3})
????@DisplayName("參數(shù)化測試")
????void?paramTest(int?a)?{
????????assertTrue(a?>?0?&&?a?4);
????}
內(nèi)嵌測試
JUnit5提供了嵌套單元測試的功能,可以更好展示測試類之間的業(yè)務(wù)邏輯關(guān)系,我們通常是一個(gè)業(yè)務(wù)對應(yīng)一個(gè)測試類,有業(yè)務(wù)關(guān)系的類其實(shí)可以寫在一起。這樣有利于進(jìn)行測試。而且內(nèi)聯(lián)的寫法可以大大減少不必要的類,精簡項(xiàng)目,防止類爆炸等一系列問題。
@SpringBootTest
@AutoConfigureMockMvc
@DisplayName("Junit5單元測試")
public?class?MockTest?{
????//....
????@Nested
????@DisplayName("內(nèi)嵌訂單測試")
????class?OrderTestClas?{
????????@Test
????????@DisplayName("取消訂單")
????????void?cancelOrder()?{
????????????int?status?=?-1;
????????????System.out.println("取消訂單成功,訂單狀態(tài)為:"+status);
????????}
????}
}
粉絲福利:108本java從入門到大神精選電子書領(lǐng)取
???
?長按上方鋒哥微信二維碼?2 秒 備注「1234」即可獲取資料以及 可以進(jìn)入java1234官方微信群
感謝點(diǎn)贊支持下哈?
