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

為什么使用JUnit5

  • JUnit4被廣泛使用黔酥,但是許多場(chǎng)景下使用起來語法較為繁瑣洪橘,JUnit5中支持lambda表達(dá)式,語法簡單且代碼不冗余熄求。
  • 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)前有出入。

簡介

如圖便斥,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("商品入庫測(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方法鸠信。

assertTrueassertFalse用來判斷條件是否為truefalse

    @Test
    @DisplayName("測(cè)試斷言equals")
    void testEquals() {
        assertTrue(3 < 4);
    }

assertNullassertNotNull用來判斷條件是否為·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ù)庫扣減庫存
                    assertTrue(3 < 4);
                },
                () -> {
                    //模擬交易流水落庫
                    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)的寫法可以大大減少不必要的類策彤,精簡項(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);
        }
    }
}
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末必指,一起剝皮案震驚了整個(gè)濱河市塔橡,隨后出現(xiàn)的幾起案子霜第,更是在濱河造成了極大的恐慌,老刑警劉巖癞谒,帶你破解...
    沈念sama閱讀 221,576評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件弹砚,死亡現(xiàn)場(chǎng)離奇詭異枢希,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)茅诱,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,515評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來瑟俭,“玉大人秀睛,你說我怎么就攤上這事蹂安。” “怎么了田盈?”我有些...
    開封第一講書人閱讀 168,017評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵,是天一觀的道長简软。 經(jīng)常有香客問我述暂,道長,這世上最難降的妖魔是什么畦韭? 我笑而不...
    開封第一講書人閱讀 59,626評(píng)論 1 296
  • 正文 為了忘掉前任察郁,我火速辦了婚禮转唉,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘麦轰。我一直安慰自己,他們只是感情好原朝,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,625評(píng)論 6 397
  • 文/花漫 我一把揭開白布喳坠。 她就那樣靜靜地躺著壕鹉,像睡著了一般。 火紅的嫁衣襯著肌膚如雪晾浴。 梳的紋絲不亂的頭發(fā)上牍白,一...
    開封第一講書人閱讀 52,255評(píng)論 1 308
  • 那天,我揣著相機(jī)與錄音切省,去河邊找鬼帕胆。 笑死,一個(gè)胖子當(dāng)著我的面吹牛芙盘,可吹牛的內(nèi)容都是我干的脸秽。 我是一名探鬼主播,決...
    沈念sama閱讀 40,825評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼贷盲,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼巩剖!你這毒婦竟也來了钠怯?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,729評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤鞠鲜,失蹤者是張志新(化名)和其女友劉穎贤姆,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體霞捡,經(jīng)...
    沈念sama閱讀 46,271評(píng)論 1 320
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡碧信,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,363評(píng)論 3 340
  • 正文 我和宋清朗相戀三年砰碴,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了板丽。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,498評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡猖辫,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情瓮具,我是刑警寧澤,帶...
    沈念sama閱讀 36,183評(píng)論 5 350
  • 正文 年R本政府宣布叹阔,位于F島的核電站传睹,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏睛藻。R本人自食惡果不足惜店印,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,867評(píng)論 3 333
  • 文/蒙蒙 一倒慧、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧炫贤,春花似錦付秕、人聲如沸兰珍。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,338評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽有滑。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間苛秕,已是汗流浹背艇劫。 一陣腳步聲響...
    開封第一講書人閱讀 33,458評(píng)論 1 272
  • 我被黑心中介騙來泰國打工店煞, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留风钻,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,906評(píng)論 3 376
  • 正文 我出身青樓鸣个,卻偏偏與公主長得像布朦,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子阁将,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,507評(píng)論 2 359

推薦閱讀更多精彩內(nèi)容