JUnit 5學習心得

JUnit 5學習心得

JUnit 5簡介

與之前的版本不同,JUnit 5 由三個不同的模塊組成规婆。第一個模塊是 JUnit 平臺泽裳,其主要作用是在 JVM 上啟動測試框架。它定義了一個抽象的 TestEngine API 來定義運行在平臺上的測試框架黔酥,同時還支持通過命令行藻三、Gradle 和 Maven 來運行平臺。
JUnit 5 對 Java 運行環(huán)境的最低要求是 Java 8跪者】妹保可以在 Eclipse 和 IntelliJ IDEA 上運行 JUnit 5 測試。

JUnit 5新更新

JUnit 5允許在斷言中使用Lambda表達式(Lambda表達式是Java SE 8中一個重要的新特性渣玲。lambda表達式允許你通過表達式來代替功能接口逗概。 lambda表達式就和方法一樣,它提供了一個正常的參數(shù)列表和一個使用這些參數(shù)的主體(body,可以是一個表達式或一個代碼塊。Lambda表達式還增強了集合庫 )忘衍。
JUnit 5不再是單個庫逾苫,而是模塊化結構的集合,整個API分成了:自己的模塊枚钓,引擎铅搓,launcher,針對Gradle和Surefire的集成模塊搀捷。
JUnit 5還提供了全新的一套注釋集合星掰,斷言方法從JUnit4的org.junit.Assert包移動到JUnit5的org.junit.gen5.api.Assertions包。
JUnit 5有分組斷言這個新功能(分組斷言允許執(zhí)行一組斷言嫩舟,且會一起報告)氢烘。

JUnit 5基本注解

以下只簡單的介紹幾種常用的基本注解
@Test(表明一個測試方法)
@BeforeAll(執(zhí)行一次,執(zhí)行時機是在所有測試和 @BeforeEach 注解方法之前)
@BeforeEach(在每個測試執(zhí)行之前執(zhí)行)
@AfterEach(在每個測試之后執(zhí)行)
@AfterAll(只執(zhí)行一次家厌,執(zhí)行時機是在所有測試和@AfterEach注解方法之后)
@Disabled(禁止測試類或方法)
@Displayname(測試類或方法的顯示名稱)

JUnit 5斷言

用來對滿足的條件進行驗證播玖,斷言方法都是靜態(tài)方法。
一下介紹幾個常用的基本斷言方法
assertEquals(判斷兩個對象或兩個原始類型是否相等)
assertNotEquals(判斷兩個對象或兩個原始類型是否不相等)
assertSame(判斷兩個對象引用是否指向同一個對象)
assertNotSame(判斷兩個對象引用是否指向不同的對象)
assertTrue(判斷給定的布爾值是否為 true)
assertFalse(判斷給定的布爾值是否為 false)
assertNull (判斷給定的對象引用是否為 null)
assertNotNull(判斷給定的對象引用是否不為 null)

注:以上介紹的這些斷言方法都有多個重載方法饭于。

JUnit 5前置條件

JUnit 5 中的前置條件(assumptions)類似于斷言蜀踏,不同之處在于不滿足的斷言會使得測試方法失敗维蒙,而不滿足的前置條件只會使得測試方法的執(zhí)行終止。前置條件可以看成是測試方法執(zhí)行的前提脓斩,當該前提不滿足時木西,就沒有繼續(xù)執(zhí)行的必要。在如下案例中随静,assumeTrue 和 assumFalse 確保給定的條件為 true 或 false八千,不滿足條件會使得測試執(zhí)行終止。assumingThat 的參數(shù)是表示條件的布爾值和對應的 Executable 接口的實現(xiàn)對象燎猛。只有條件滿足時恋捆,Executable 對象才會被執(zhí)行;當條件不滿足時重绷,測試執(zhí)行并不會終止沸停。

@DisplayName("Assumptions")
public class AssumptionsTest {
 private final String environment = "DEV";
 
 @Test
 @DisplayName("simple")
 public void simpleAssume() {
    assumeTrue(Objects.equals(this.environment, "DEV"));
    assumeFalse(() -> Objects.equals(this.environment, "PROD"));
 }
 
 @Test
 @DisplayName("assume then do")
 public void assumeThenDo() {
    assumingThat(
       Objects.equals(this.environment, "DEV"),
       () -> System.out.println("In DEV")
    );
 }
}

擴展機制

JUnit 5 提供了標準的擴展機制來允許開發(fā)人員對 JUnit 5 的功能進行增強。JUnit 5 提供了很多的標準擴展接口昭卓,第三方可以直接實現(xiàn)這些接口來提供自定義的行為愤钾。通過@ExtendWith 注解可以聲明在測試方法和類的執(zhí)行中啟用相應的擴展。
擴展的啟用是繼承的候醒,這既包括測試類本身的層次結構能颁,也包括測試類中的測試方法。也就是說倒淫,測試類會繼承其父類中的擴展伙菊,測試方法會繼承其所在類中的擴展。除此之外敌土,在一個測試上下文中镜硕,每一個擴展只能出現(xiàn)一次。

創(chuàng)建擴展

JUnit 5 中的擴展非常容易創(chuàng)建返干,只是實現(xiàn)了特定接口的 Java 類兴枯。JUnit 5 的擴展都需要實現(xiàn) org.junit.jupiter.api.extension.Extension 接口,不過該接口只是一個標記接口矩欠,并沒有任何需要實現(xiàn)的具體方法念恍。真正起作用的是 Extension 的子接口,作為 JUnit 5 提供的擴展點晚顷。

測試執(zhí)行條件

ContainerExecutionCondition 和 TestExecutionCondition 接口用來配置是否啟用測試類或測試方法。前面提到的@Disabled 注解也是通過這樣的機制來實現(xiàn)的疗疟。ContainerExecutionCondition 接口對應的是測試類该默,而 TestExecutionCondition 接口對應的是測試方法。
ContainerExecutionCondition 接口的 evaluate 方法接受 ContainerExtensionContext 接口作為參數(shù)策彤,并返回 ConditionEvaluationResult 類的對象作為結果栓袖。通過 ContainerExtensionContext 接口可以獲取到當前測試類的上下文信息匣摘,而 ConditionEvaluationResult 類則表示該測試類是否被啟用。
TestExecutionCondition 接口也是包含一個 evaluate 方法裹刮,只不過參數(shù)類型是 TestExtensionContext音榜,其返回結果也是 ConditionEvaluationResult 類的對象。
通過擴展的方式禁用的測試類和方法捧弃,可以通過 JVM 參數(shù) junit.conditions.deactivate 來重新啟用赠叼,只需要把相應的條件類禁用即可。

支持Hamcrest匹配和AssertJ斷言庫

JUnit 5支持Hamcrest匹配和AssertJ斷言庫违霞,可以用它們來代替JUnit 5的方法嘴办。

動態(tài)測試

目前所介紹的 JUnit 5 測試方法的創(chuàng)建都是靜態(tài)的,在編譯時刻就已經(jīng)存在买鸽。JUnit 5 新增了對動態(tài)測試的支持涧郊,可以在運行時動態(tài)創(chuàng)建測試并執(zhí)行。通過動態(tài)測試眼五,可以滿足一些靜態(tài)測試無法解的需求妆艘,也可以完成一些重復性很高的測試。比如看幼,有些測試用例可能依賴運行時的變量批旺,有時候會需要生成上百個不同的測試用例。這些場景都是動態(tài)測試可以發(fā)揮其長處的地方桌吃。動態(tài)測試是通過新的@TestFactory 注解來實現(xiàn)的朱沃。測試類中的方法可以添加@TestFactory 注解的方法來聲明其是創(chuàng)建動態(tài)測試的工廠方法。這樣的工廠方法需要返回 org.junit.jupiter.api.DynamicTest 類的集合茅诱,可以是 Stream逗物、Collection、Iterable 或 Iterator 對象瑟俭。每個表示動態(tài)測試的 DynamicTest 對象由顯示名稱和對應的 Executable 接口的實現(xiàn)對象來組成翎卓。

@TestFactory
public Collection<DynamicTest> simpleDynamicTest() {
 return Collections.singleton(dynamicTest("simple dynamic test", () -> assertTrue(2 > 1)));
}
DynamicTest 提供了一個靜態(tài)方法 stream 來根據(jù)輸入生成動態(tài)測試,如清單 14 所示摆寄。

@TestFactory
public Stream<DynamicTest> streamDynamicTest() {
 return stream(
       Stream.of("Hello", "World").iterator(),
       (word) -> String.format("Test - %s", word),
       (word) -> assertTrue(word.length() > 4)
 );
}

嵌套測試

在嵌套的類上添加 @Nested 注解失暴,類中的所有方法即會被引擎執(zhí)行

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市微饥,隨后出現(xiàn)的幾起案子逗扒,更是在濱河造成了極大的恐慌,老刑警劉巖欠橘,帶你破解...
    沈念sama閱讀 216,744評論 6 502
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件矩肩,死亡現(xiàn)場離奇詭異,居然都是意外死亡肃续,警方通過查閱死者的電腦和手機黍檩,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,505評論 3 392
  • 文/潘曉璐 我一進店門叉袍,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人刽酱,你說我怎么就攤上這事喳逛。” “怎么了棵里?”我有些...
    開封第一講書人閱讀 163,105評論 0 353
  • 文/不壞的土叔 我叫張陵润文,是天一觀的道長。 經(jīng)常有香客問我衍慎,道長转唉,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,242評論 1 292
  • 正文 為了忘掉前任稳捆,我火速辦了婚禮赠法,結果婚禮上,老公的妹妹穿的比我還像新娘乔夯。我一直安慰自己砖织,他們只是感情好,可當我...
    茶點故事閱讀 67,269評論 6 389
  • 文/花漫 我一把揭開白布末荐。 她就那樣靜靜地躺著侧纯,像睡著了一般。 火紅的嫁衣襯著肌膚如雪甲脏。 梳的紋絲不亂的頭發(fā)上眶熬,一...
    開封第一講書人閱讀 51,215評論 1 299
  • 那天,我揣著相機與錄音块请,去河邊找鬼娜氏。 笑死,一個胖子當著我的面吹牛墩新,可吹牛的內容都是我干的贸弥。 我是一名探鬼主播,決...
    沈念sama閱讀 40,096評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼海渊,長吁一口氣:“原來是場噩夢啊……” “哼绵疲!你這毒婦竟也來了?” 一聲冷哼從身側響起臣疑,我...
    開封第一講書人閱讀 38,939評論 0 274
  • 序言:老撾萬榮一對情侶失蹤盔憨,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后讯沈,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體郁岩,經(jīng)...
    沈念sama閱讀 45,354評論 1 311
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,573評論 2 333
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了驯用。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,745評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡儒老,死狀恐怖蝴乔,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情驮樊,我是刑警寧澤薇正,帶...
    沈念sama閱讀 35,448評論 5 344
  • 正文 年R本政府宣布,位于F島的核電站囚衔,受9級特大地震影響挖腰,放射性物質發(fā)生泄漏。R本人自食惡果不足惜练湿,卻給世界環(huán)境...
    茶點故事閱讀 41,048評論 3 327
  • 文/蒙蒙 一猴仑、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧肥哎,春花似錦辽俗、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,683評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至杈女,卻和暖如春朱浴,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背达椰。 一陣腳步聲響...
    開封第一講書人閱讀 32,838評論 1 269
  • 我被黑心中介騙來泰國打工翰蠢, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人砰碴。 一個月前我還...
    沈念sama閱讀 47,776評論 2 369
  • 正文 我出身青樓躏筏,卻偏偏與公主長得像,于是被迫代替她去往敵國和親呈枉。 傳聞我的和親對象是個殘疾皇子趁尼,可洞房花燭夜當晚...
    茶點故事閱讀 44,652評論 2 354

推薦閱讀更多精彩內容

  • Spring Cloud為開發(fā)人員提供了快速構建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務發(fā)現(xiàn)猖辫,斷路器酥泞,智...
    卡卡羅2017閱讀 134,652評論 18 139
  • Spring Boot 參考指南 介紹 轉載自:https://www.gitbook.com/book/qbgb...
    毛宇鵬閱讀 46,806評論 6 342
  • 1. Java基礎部分 基礎部分的順序:基本語法,類相關的語法啃憎,內部類的語法芝囤,繼承相關的語法,異常的語法,線程的語...
    子非魚_t_閱讀 31,624評論 18 399
  • spring官方文檔:http://docs.spring.io/spring/docs/current/spri...
    牛馬風情閱讀 1,670評論 0 3
  • 蒹葭蒼蒼悯姊,白露為霜羡藐,所謂伊人,在水一方悯许。這是撩動心弦的遇見仆嗦。 這位妹妹我曾經(jīng)見過。這是寶玉和黛玉初初見面時歡喜的遇...
    斯嘉麗big閱讀 242評論 0 0