成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

Spring Boot 集成 JUnit5,更優(yōu)雅單元測試!

開發(fā) 后端
開發(fā)人員為什么還要測試,單測寫這么規(guī)范有必要嗎?其實單測是開發(fā)人員必備技能,只不過很多開發(fā)人員開發(fā)任務(wù)太重導(dǎo)致調(diào)試完就不管了,沒有系統(tǒng)化得單元測試,單元測試在系統(tǒng)重構(gòu)時能發(fā)揮巨大的作用。

 [[419620]]

為什么使用JUnit5

  •  JUnit4被廣泛使用,但是許多場景下使用起來語法較為繁瑣,JUnit5中支持lambda表達(dá)式,語法簡單且代碼不冗余。
  •  JUnit5易擴展,包容性強,可以接入其他的測試引擎。
  •  功能更強大提供了新的斷言機制、參數(shù)化測試、重復(fù)性測試等新功能。
  •  ps:開發(fā)人員為什么還要測試,單測寫這么規(guī)范有必要嗎?其實單測是開發(fā)人員必備技能,只不過很多開發(fā)人員開發(fā)任務(wù)太重導(dǎo)致調(diào)試完就不管了,沒有系統(tǒng)化得單元測試,單元測試在系統(tǒng)重構(gòu)時能發(fā)揮巨大的作用,可以在重構(gòu)后快速測試新的接口是否與重構(gòu)前有出入。

簡介

如圖,JUnit5結(jié)構(gòu)如下:

  •  JUnit Platform:這是Junit提供的平臺功能模塊,通過它,其它的測試引擎都可以接入Junit實現(xiàn)接口和執(zhí)行。
  •  JUnit JUpiter:這是JUnit5的核心,是一個基于JUnit Platform的引擎實現(xiàn),它包含許多豐富的新特性來使得自動化測試更加方便和強大。
  •  JUnit Vintage:這個模塊是兼容JUnit3、JUnit4版本的測試引擎,使得舊版本的自動化測試也可以在JUnit5下正常運行。

依賴引入

我們以SpringBoot2.3.1為例,引入如下依賴,防止使用舊的junit4相關(guān)接口我們將其依賴排除。 

  1. <dependency>  
  2.     <groupId>org.springframework.boot</groupId>  
  3.     <artifactId>spring-boot-starter-test</artifactId>  
  4.     <scope>test</scope>  
  5.     <exclusions>  
  6.         <exclusion>  
  7.             <groupId>org.junit.vintage</groupId>  
  8.             <artifactId>junit-vintage-engine</artifactId>  
  9.         </exclusion>  
  10.     </exclusions>  
  11. </dependency>  

常用注解

  •  @BeforeEach:在每個單元測試方法執(zhí)行前都執(zhí)行一遍
  •  @BeforeAll:在每個單元測試方法執(zhí)行前執(zhí)行一遍(只執(zhí)行一次)
  •  @DisplayName("商品入庫測試"):用于指定單元測試的名稱
  •  @Disabled:當(dāng)前單元測試置為無效,即單元測試時跳過該測試
  •  @RepeatedTest(n):重復(fù)性測試,即執(zhí)行n次
  •  @ParameterizedTest:參數(shù)化測試,
  •  @ValueSource(ints = {1, 2, 3}):參數(shù)化測試提供數(shù)據(jù)

斷言

JUnit Jupiter提供了強大的斷言方法用以驗證結(jié)果,在使用時需要借助java8的新特性lambda表達(dá)式,均是來自org.junit.jupiter.api.Assertions包的static方法。

assertTrue與assertFalse用來判斷條件是否為true或false 

  1. @Test  
  2. @DisplayName("測試斷言equals")  
  3. void testEquals() {  
  4.     assertTrue(3 < 4);  

assertNull與assertNotNull用來判斷條件是否為·null 

  1. @Test  
  2. @DisplayName("測試斷言NotNull")  
  3. void testNotNull() {  
  4.     assertNotNull(new Object());  

assertThrows用來判斷執(zhí)行拋出的異常是否符合預(yù)期,并可以使用異常類型接收返回值進行其他操作 

  1. @Test  
  2. @DisplayName("測試斷言拋異常")  
  3. void testThrows() {  
  4.     ArithmeticException arithExcep = assertThrows(ArithmeticException.class, () -> {  
  5.         int m = 5/0;  
  6.     });  
  7.     assertEquals("/ by zero", arithExcep.getMessage());  

assertTimeout用來判斷執(zhí)行過程是否超時 

  1. @Test  
  2. @DisplayName("測試斷言超時")  
  3. void testTimeOut() {  
  4.     String actualResult = assertTimeout(ofSeconds(2), () -> {  
  5.         Thread.sleep(1000);  
  6.         return "a result";  
  7.     });  
  8.     System.out.println(actualResult); 

assertAll是組合斷言,當(dāng)它內(nèi)部所有斷言正確執(zhí)行完才算通過 

  1. @Test  
  2. @DisplayName("測試組合斷言")  
  3. void testAll() {  
  4.     assertAll("測試item商品下單",  
  5.             () -> {  
  6.                 //模擬用戶余額扣減  
  7.                 assertTrue(1 < 2, "余額不足");  
  8.             },  
  9.             () -> {  
  10.                 //模擬item數(shù)據(jù)庫扣減庫存  
  11.                 assertTrue(3 < 4);  
  12.             },  
  13.             () -> {  
  14.                 //模擬交易流水落庫  
  15.                 assertNotNull(new Object());  
  16.             }  
  17.     );  
  18.  

重復(fù)性測試

在許多場景中我們需要對同一個接口方法進行重復(fù)測試,例如對冪等性接口的測試。

JUnit Jupiter通過使用@RepeatedTest(n)指定需要重復(fù)的次數(shù) 

  1. @RepeatedTest(3)  
  2. @DisplayName("重復(fù)測試")  
  3. void repeatedTest() {  
  4.     System.out.println("調(diào)用");  

 

參數(shù)化測試

參數(shù)化測試可以按照多個參數(shù)分別運行多次單元測試這里有點類似于重復(fù)性測試,只不過每次運行傳入的參數(shù)不用。需要使用到@ParameterizedTest,同時也需要@ValueSource提供一組數(shù)據(jù),它支持八種基本類型以及String和自定義對象類型,使用極其方便。 

  1. @ParameterizedTest  
  2. @ValueSource(ints = {1, 2, 3})  
  3. @DisplayName("參數(shù)化測試")  
  4. void paramTest(int a) {  
  5.     assertTrue(a > 0 && a < 4);  
  6.  

內(nèi)嵌測試

JUnit5提供了嵌套單元測試的功能,可以更好展示測試類之間的業(yè)務(wù)邏輯關(guān)系,我們通常是一個業(yè)務(wù)對應(yīng)一個測試類,有業(yè)務(wù)關(guān)系的類其實可以寫在一起。這樣有利于進行測試。而且內(nèi)聯(lián)的寫法可以大大減少不必要的類,精簡項目,防止類爆炸等一系列問題。 

  1. Copy@SpringBootTest  
  2. @AutoConfigureMockMvc  
  3. @DisplayName("Junit5單元測試")  
  4. public class MockTest {  
  5.     //....  
  6.     @Nested  
  7.     @DisplayName("內(nèi)嵌訂單測試")  
  8.     class OrderTestClas {  
  9.         @Test  
  10.         @DisplayName("取消訂單")  
  11.         void cancelOrder() {  
  12.             int status = -1;  
  13.             System.out.println("取消訂單成功,訂單狀態(tài)為:"+status);  
  14.         }  
  15.     }  
  16.  

 

 

責(zé)任編輯:龐桂玉 來源: Hollis
相關(guān)推薦

2021-01-07 14:06:30

Spring BootJUnit5Java

2023-12-28 17:36:10

JUnit5單元測試框架

2020-07-21 14:40:45

Spring Boot單元測試Java

2021-09-01 12:03:49

Spring單元測試

2017-01-16 12:12:29

單元測試JUnit

2017-01-14 23:26:17

單元測試JUnit測試

2020-07-07 07:33:12

Java單元集成

2011-08-11 13:02:43

Struts2Junit

2025-06-12 03:10:00

2011-11-18 15:18:41

Junit單元測試Java

2023-09-27 23:43:51

單元測試Spring

2013-06-04 09:49:04

Spring單元測試軟件測試

2017-01-14 23:42:49

單元測試框架軟件測試

2012-02-07 09:08:50

Feed4JUnitJava

2012-07-22 20:34:27

springMVCJUnit

2022-07-04 05:59:18

KotlinJUnit5數(shù)據(jù)庫

2023-12-24 10:00:35

Java單元測試

2014-02-25 10:25:52

單元測試測試

2009-06-08 19:59:09

EclipseJUnit單元測試

2009-06-08 19:57:29

EclipseJUnit4單元測試
點贊
收藏

51CTO技術(shù)棧公眾號

主站蜘蛛池模板: 超碰在线久 | 成年人免费在线视频 | 亚洲精品电影在线观看 | 9191在线播放 | 国产超碰人人爽人人做人人爱 | 国产精品国产精品 | 日韩欧美二区 | 亚洲欧美中文日韩在线 | 国产精品久久久亚洲 | 四虎海外 | 午夜精品久久久久久久久久久久 | 99精品欧美一区二区三区 | 久久99精品久久久久久秒播九色 | 久久精品一区二区三区四区 | 久久久99精品免费观看 | 日本激情视频在线播放 | 久久久久国产 | 在线中文字幕第一页 | 亚洲精品国产综合区久久久久久久 | 91在线精品秘密一区二区 | 99久久婷婷国产综合精品电影 | 中文字幕一区二区三区四区五区 | 国产二区在线播放 | 日本精品视频 | 欧美 日韩 视频 | 欧美日韩国产一区二区三区 | 免费黄色大片 | 欧美在线观看一区 | 日日操夜夜操天天操 | 国产亚洲精品久久久久动 | 欧美一级片在线播放 | 日韩久久中文字幕 | 一区 | av色站 | 91精品国产色综合久久不卡蜜臀 | 成人在线观看亚洲 | 99久久99久久精品国产片果冰 | 日韩精品一区二区三区在线播放 | 亚洲精品乱码久久久久久蜜桃91 | 亚洲精品国产成人 | 91视频精选 |