Junit5快速上手指南

Junit5是Junit一個(gè)非常大的改進(jìn)版本磷账,根據(jù)Junit5官方文檔上的描述:

JUnit 5 = JUnit Platform + JUnit Jupiter + JUnit Vintage

  • JUnit Platform:提供了在JVM上啟動(dòng)測(cè)試框架的基礎(chǔ),包括Junit核心的API等等闽坡。
  • JUnit Jupiter:提供了用于編寫測(cè)試代碼的新的編程和擴(kuò)展模型。
  • JUnit Vintage:提供了使用JUnit3和4編寫測(cè)試方法的兼容流码。

相比于之前Junit4行施,個(gè)人感覺在使用上比較大的一個(gè)改進(jìn)是在參數(shù)化測(cè)試這塊,本來很多的測(cè)試場(chǎng)景要寫的重復(fù)場(chǎng)景就比較多若锁,通過參數(shù)化測(cè)試搁骑,可以大量減少測(cè)試的編寫斧吐。

比如用經(jīng)典的FizzBuzz來進(jìn)行練習(xí).

@Data
public class FizzBuzz {

    public String say(int number) {

        if (isMultiple(number, 3) && isMultiple(number, 5)) {
            return "fizzbuzz";
        }

        if (isMultiple(number, 3)) {
            return "fizz";
        }

        if (isMultiple(number, 5)) {
            return "buzz";
        }

        return "hello";
    }

    private boolean isMultiple(int number, int i) {
        return number % i == 0;
    }

}

如果想寫一個(gè)測(cè)試來覆蓋所有的邏輯又固,按照原來Junit4的方法仲器,要寫四個(gè)方法來覆蓋這些邏輯,但是再Junit5中可以用注解來解決這個(gè)問題仰冠。

public class Junit5Test {

    @DisplayName("FizzBuzz Practice")
    @ParameterizedTest(name = "number {0} say {1}")
    @CsvSource({
            " '1', 'hello' ",
            " '3', 'fizz' ",
            " '5', 'buzz' ",
            " '15', 'fizzbuzz' "
    })
    public void test(int number, String result) {

        FizzBuzz fizzBuzz = new FizzBuzz();

        String say = fizzBuzz.say(number);

        Assertions.assertEquals(result, say);

    }

}

通過@CsvSource注解(還有其他的XXXXSource注解)來進(jìn)行參數(shù)化的測(cè)試乏冀,這個(gè)函數(shù)會(huì)根據(jù)參數(shù)進(jìn)行多次執(zhí)行,確保將代碼邏輯的分支都盡量覆蓋到洋只。

好用的Junit插件和測(cè)試工具

這里介紹幾個(gè)我平時(shí)會(huì)用到的Junit5擴(kuò)展插件辆沦,在這些插件的加持下,測(cè)試代碼會(huì)寫的簡(jiǎn)單很多识虚。

  1. https://github.com/junit-pioneer/junit-pioneer
  2. https://github.com/joshka/junit-json-params
  3. https://github.com/j-easy/easy-random

第一個(gè)介紹的是junit-pioneer肢扯,在測(cè)試中經(jīng)常會(huì)碰到使用一些對(duì)入?yún)⑴帕薪M合使用的情況,使用junit-pioneer這個(gè)插件担锤,可以幫助我們比較輕松地應(yīng)對(duì)這種情況蔚晨。

public class CombinationTest {

    @CartesianProductTest
    @CartesianValueSource(strings = {"type1", "type2"})
    @CartesianValueSource(strings = {"action A", "action B"})
    public void combinationTest(String type, String action) {
        System.out.printf("%s --> %s \n", type, action);
    }

}

執(zhí)行的效果:

type1 --> action A 
type1 --> action B 
type2 --> action A
type2 --> action B 

junit-pioneer包含了很多對(duì)Junit5的擴(kuò)展,有興趣的話肛循,可以在它的文檔中繼續(xù)探索他的一些功能:https://junit-pioneer.org/docs/

第二個(gè)插件是junit-json-params, 這個(gè)插件

public class JsonTest {
    @ParameterizedTest
    @JsonSource("[{\"key\":\"value1\"},{\"key\":\"value2\"}]")
    @DisplayName("provides an array of objects")
    void arrayOfObjects(JsonObject object) {
        Assertions.assertTrue(object.getString("key").startsWith("value"));
    }
}

第三個(gè)推薦的是一個(gè)對(duì)象生成器框架Easy Random铭腕,在編寫測(cè)試過程中,組裝對(duì)象通常是一個(gè)非常費(fèi)勁的事情多糠,很多參數(shù)也用不到累舷,通過Easy Random可以快速組裝出一個(gè)隨機(jī)對(duì)象。

public class ObjectRandomTest {

    @Test
    public void test(){

        Book book = new EasyRandom().nextObject(Book.class);

        Assertions.assertNotNull(book.getBookName());
        Assertions.assertNotNull(book.getAuthor());

    }

    @Data
    static class Book {

        private String bookName;

        private String author;

    }

}

Maven中的POM

以下是剛剛提到的這些框架在Maven中的配置夹孔,另外重復(fù)的注解這種寫法(junit-pioneer用到了)只有Java8以及以上的版本才支持被盈,所以maven中編譯的版本一定要在1.8以上。

<properties>
        <junit.jupiter.version>5.7.1</junit.jupiter.version>
        <junit.platform.version>1.7.1</junit.platform.version>
        <junit-pioneer.version>1.3.8</junit-pioneer.version>
        <junit-json-params.version>5.6.2-r0</junit-json-params.version>
        <javax.json.version>1.1.3</javax.json.version>
        <easy-random-core.version>4.3.0</easy-random-core.version>
        <lombok.version>1.18.20</lombok.version>
</properties>

<dependencies>
        <!--junit5-->
        <dependency>
            <groupId>org.junit.jupiter</groupId>
            <artifactId>junit-jupiter-engine</artifactId>
            <version>${junit.jupiter.version}</version>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.junit.platform</groupId>
            <artifactId>junit-platform-runner</artifactId>
            <version>${junit.platform.version}</version>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.junit-pioneer</groupId>
            <artifactId>junit-pioneer</artifactId>
            <version>${junit-pioneer.version}</version>
            <scope>test</scope>
        </dependency>
        <!--/junit5-->
        <!--json plugin dependency-->
        <dependency>
            <groupId>net.joshka</groupId>
            <artifactId>junit-json-params</artifactId>
            <version>${junit-json-params.version}</version>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>javax.json</groupId>
            <artifactId>javax.json-api</artifactId>
            <version>${javax.json.version}</version>
        </dependency>
        <dependency>
            <groupId>org.glassfish</groupId>
            <artifactId>javax.json</artifactId>
            <version>${javax.json.version}</version>
        </dependency>
        <!--/json plugin dependency-->
        <!--EasyRandom-->
        <dependency>
            <groupId>org.jeasy</groupId>
            <artifactId>easy-random-core</artifactId>
            <version>${easy-random-core.version}</version>
        </dependency>
        <!--/EasyRandom-->
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>${lombok.version}</version>
            <scope>provided</scope>
        </dependency>
</dependencies>
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末搭伤,一起剝皮案震驚了整個(gè)濱河市害捕,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌闷畸,老刑警劉巖尝盼,帶你破解...
    沈念sama閱讀 216,372評(píng)論 6 498
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異佑菩,居然都是意外死亡盾沫,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,368評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門殿漠,熙熙樓的掌柜王于貴愁眉苦臉地迎上來赴精,“玉大人,你說我怎么就攤上這事绞幌±儆矗” “怎么了?”我有些...
    開封第一講書人閱讀 162,415評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)谭确。 經(jīng)常有香客問我帘营,道長(zhǎng),這世上最難降的妖魔是什么逐哈? 我笑而不...
    開封第一講書人閱讀 58,157評(píng)論 1 292
  • 正文 為了忘掉前任芬迄,我火速辦了婚禮,結(jié)果婚禮上昂秃,老公的妹妹穿的比我還像新娘禀梳。我一直安慰自己,他們只是感情好肠骆,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,171評(píng)論 6 388
  • 文/花漫 我一把揭開白布算途。 她就那樣靜靜地躺著,像睡著了一般蚀腿。 火紅的嫁衣襯著肌膚如雪郊艘。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,125評(píng)論 1 297
  • 那天唯咬,我揣著相機(jī)與錄音纱注,去河邊找鬼。 笑死胆胰,一個(gè)胖子當(dāng)著我的面吹牛狞贱,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播蜀涨,決...
    沈念sama閱讀 40,028評(píng)論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼瞎嬉,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了厚柳?” 一聲冷哼從身側(cè)響起氧枣,我...
    開封第一講書人閱讀 38,887評(píng)論 0 274
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎别垮,沒想到半個(gè)月后便监,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,310評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡碳想,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,533評(píng)論 2 332
  • 正文 我和宋清朗相戀三年烧董,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片胧奔。...
    茶點(diǎn)故事閱讀 39,690評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡逊移,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出龙填,到底是詐尸還是另有隱情胳泉,我是刑警寧澤拐叉,帶...
    沈念sama閱讀 35,411評(píng)論 5 343
  • 正文 年R本政府宣布,位于F島的核電站扇商,受9級(jí)特大地震影響凤瘦,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜钳吟,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,004評(píng)論 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望窘拯。 院中可真熱鬧红且,春花似錦、人聲如沸涤姊。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,659評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)思喊。三九已至壁酬,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間恨课,已是汗流浹背舆乔。 一陣腳步聲響...
    開封第一講書人閱讀 32,812評(píng)論 1 268
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留剂公,地道東北人希俩。 一個(gè)月前我還...
    沈念sama閱讀 47,693評(píng)論 2 368
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像纲辽,于是被迫代替她去往敵國(guó)和親颜武。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,577評(píng)論 2 353

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