欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Springboot集成JUnit5優(yōu)雅進(jìn)行單元測(cè)試的示例

 更新時(shí)間:2020年10月14日 15:34:14   作者:Hai Xiang  
這篇文章主要介紹了Springboot集成JUnit5優(yōu)雅進(jìn)行單元測(cè)試的示例,幫助大家更好的理解和使用springboot框架,感興趣的朋友可以了解下

為什么使用JUnit5

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

簡(jiǎn)介

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

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

依賴引入

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

    <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:在每個(gè)單元測(cè)試方法執(zhí)行前都執(zhí)行一遍
  • @BeforeAll:在每個(gè)單元測(cè)試方法執(zhí)行前執(zhí)行一遍(只執(zhí)行一次)
  • @DisplayName("商品入庫(kù)測(cè)試"):用于指定單元測(cè)試的名稱
  • @Disabled:當(dāng)前單元測(cè)試置為無效,即單元測(cè)試時(shí)跳過該測(cè)試
  • @RepeatedTest(n):重復(fù)性測(cè)試,即執(zhí)行n次
  • @ParameterizedTest:參數(shù)化測(cè)試,
  • @ValueSource(ints = {1, 2, 3}):參數(shù)化測(cè)試提供數(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("測(cè)試斷言equals")
  void testEquals() {
    assertTrue(3 < 4);
  }

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

  @Test
  @DisplayName("測(cè)試斷言NotNull")
  void testNotNull() {
    assertNotNull(new Object());
  }

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

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

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

  @Test
  @DisplayName("測(cè)試斷言超時(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("測(cè)試組合斷言")
  void testAll() {
    assertAll("測(cè)試item商品下單",
        () -> {
          //模擬用戶余額扣減
          assertTrue(1 < 2, "余額不足");
        },
        () -> {
          //模擬item數(shù)據(jù)庫(kù)扣減庫(kù)存
          assertTrue(3 < 4);
        },
        () -> {
          //模擬交易流水落庫(kù)
          assertNotNull(new Object());
        }
    );
  }

重復(fù)性測(cè)試

在許多場(chǎng)景中我們需要對(duì)同一個(gè)接口方法進(jìn)行重復(fù)測(cè)試,例如對(duì)冪等性接口的測(cè)試。

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

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

參數(shù)化測(cè)試

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

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

內(nèi)嵌測(cè)試

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

@SpringBootTest
@AutoConfigureMockMvc
@DisplayName("Junit5單元測(cè)試")
public class MockTest {
  //....
  @Nested
  @DisplayName("內(nèi)嵌訂單測(cè)試")
  class OrderTestClas {
    @Test
    @DisplayName("取消訂單")
    void cancelOrder() {
      int status = -1;
      System.out.println("取消訂單成功,訂單狀態(tài)為:"+status);
    }
  }
}

以上就是Springboot集成JUnit5優(yōu)雅進(jìn)行單元測(cè)試的示例的詳細(xì)內(nèi)容,更多關(guān)于Springboot 單元測(cè)試的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • Java生成pdf文件或jpg圖片的案例講解

    Java生成pdf文件或jpg圖片的案例講解

    這篇文章主要介紹了Java生成pdf文件或jpg圖片的案例講解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2021-01-01
  • spring使用WebSocket注入service層失敗問題及解決

    spring使用WebSocket注入service層失敗問題及解決

    這篇文章主要介紹了spring使用WebSocket注入service層失敗問題及解決,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-07-07
  • springboot配置文件屬性變量引用方式${}和@@用法及區(qū)別說明

    springboot配置文件屬性變量引用方式${}和@@用法及區(qū)別說明

    這篇文章主要介紹了springboot配置文件屬性變量引用方式${}和@@用法及區(qū)別說明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-03-03
  • 淺談SpringMVC HandlerInterceptor詭異問題排查

    淺談SpringMVC HandlerInterceptor詭異問題排查

    這篇文章主要介紹了淺談SpringMVC HandlerInterceptor詭異問題排查,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2019-05-05
  • Java編程經(jīng)典小游戲設(shè)計(jì)-打磚塊小游戲源碼

    Java編程經(jīng)典小游戲設(shè)計(jì)-打磚塊小游戲源碼

    這篇文章主要介紹了Java編程經(jīng)典小游戲設(shè)計(jì)-打磚塊小游戲源碼,還是挺不錯(cuò)的,具有一定參考價(jià)值,需要的朋友可以了解下。
    2017-11-11
  • java設(shè)計(jì)模式之工廠方法模式

    java設(shè)計(jì)模式之工廠方法模式

    這篇文章主要為大家詳細(xì)介紹了java設(shè)計(jì)模式之工廠方法模式,什么是java工廠方法模式,感興趣的小伙伴們可以參考一下
    2016-08-08
  • maven?grpc整合springboot?demo

    maven?grpc整合springboot?demo

    這篇文章主要為大家介紹了基于maven?grpc整合springboot?demo,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-04-04
  • mybatis整合springboot報(bào)BindingException:Invalid?bound?statement?(not?found)異常解決

    mybatis整合springboot報(bào)BindingException:Invalid?bound?stateme

    這篇文章主要給大家介紹了關(guān)于mybatis整合springboot報(bào)BindingException:Invalid?bound?statement?(not?found)異常的解決辦法,這個(gè)錯(cuò)誤通常是由于Mapper文件中的statement?id與Java代碼中的方法名不一致導(dǎo)致的,需要的朋友可以參考下
    2024-01-01
  • Springboot 跨域配置無效及接口訪問報(bào)錯(cuò)的解決方法

    Springboot 跨域配置無效及接口訪問報(bào)錯(cuò)的解決方法

    這篇文章主要介紹了Springboot 跨域配置無效及接口訪問報(bào)錯(cuò)的解決方法,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-12-12
  • java Runtime如何執(zhí)行多條命令

    java Runtime如何執(zhí)行多條命令

    這篇文章主要介紹了java Runtime如何執(zhí)行多條命令,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-11-11

最新評(píng)論