JUnit5學習之二:Assumptions類

歡迎訪問個人GitHub

https://github.com/zq2599/blog_demosjava

內容:全部原創文章分類彙總及配套源碼,涉及Java、Docker、Kubernetes、DevOPS等;git

關於《JUnit5學習》系列

《JUnit5學習》系列旨在經過實戰提高SpringBoot環境下的單元測試技能,一共八篇文章,連接以下:程序員

  1. 基本操做
  2. Assumptions類
  3. Assertions類
  4. 按條件執行
  5. 標籤(Tag)和自定義註解
  6. 參數化測試(Parameterized Tests)基礎
  7. 參數化測試(Parameterized Tests)進階
  8. 綜合進階(終篇)

本篇概覽

本文是《JUnit5學習》系列的第二篇,學習一個重要的知識點:Assumptions類,只有瞭解了它們,纔好繼續後面的學習,全篇章節以下:github

  1. Assertions和Assumptions簡介
  2. 寫一段代碼對比效果
  3. Assumptions編碼
  4. 查看執行結果

源碼下載

  1. 若是您不想編碼,能夠在GitHub下載全部源碼,地址和連接信息以下表所示:
名稱 連接 備註
項目主頁 https://github.com/zq2599/blog_demos 該項目在GitHub上的主頁
git倉庫地址(https) https://github.com/zq2599/blog_demos.git 該項目源碼的倉庫地址,https協議
git倉庫地址(ssh) git@github.com:zq2599/blog_demos.git 該項目源碼的倉庫地址,ssh協議
  1. 這個git項目中有多個文件夾,本章的應用在junitpractice文件夾下,以下圖紅框所示:

在這裏插入圖片描述

  1. junitpractice是父子結構的工程,本篇的代碼在assertassume子工程中,以下圖:

在這裏插入圖片描述

Assertions和Assumptions簡介

Assumptions和Assertions容易混淆,所以這裏經過對比它們來學習:spring

  1. Assertions即斷言類,裏面提供了不少靜態方法,例如assertTrue,若是assertTrue的入參爲false,就會拋出AssertionFailedError異常,Junit對拋出此異常的方法斷定爲失敗;
  2. Assumptions即假設類,裏面提供了不少靜態方法,例如assumeTrue,若是assumeTrue的入參爲false,就會拋出TestAbortedException異常,Junit對拋出此異常的方法斷定爲跳過;
  3. 簡單的說,Assertions的方法拋出異常意味着測試不經過,Assumptions的方法拋出異常意味着測試被跳過(爲何稱爲"跳過"?由於mvn test的執行結果被標記爲Skipped);

寫一段代碼對比效果

  1. 用代碼來驗證的效果最好,以下所示,一共四個方法,assertSuccess不拋出AssertionFailedError異常,assertFail拋出AssertionFailedError異常,assumpSuccess不拋出TestAbortedException異常,assumpFail拋出TestAbortedException異常
package com.bolingcavalry.assertassume.service.impl;

import lombok.extern.slf4j.Slf4j;
import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assumptions.assumeTrue;

@SpringBootTest
@Slf4j
public class AssertAssumpTest {

    /**
     * 最簡單的成功用例
     */
    @Test
    void assertSuccess() {
        assertEquals(2, Math.addExact(1,1));
    }

    /**
     * 最簡單的失敗用例
     */
    @Test
    void assertFail() {
        assertEquals(3, Math.addExact(1,1));
    }

    /**
     * assumeTrue不拋出異常的用例
     */
    @Test
    void assumpSuccess() {
        // assumeTrue方法的入參若是爲true,就不會拋出異常,後面的代碼纔會繼續執行
        assumeTrue(true);
        // 若是打印出此日誌,證實assumeTrue方法沒有拋出異常
        log.info("assumpSuccess的assumeTrue執行完成");
        // 接下來是常規的單元測試邏輯
        assertEquals(2, Math.addExact(1,1));
    }

    /**
     * assumeTrue拋出異常的用例
     */
    @Test
    void assumpFail() {
        // assumeTrue方法的入參若是爲false,就會拋出TestAbortedException異常,後面就不會執行了
        assumeTrue(false, "未經過assumeTrue");
        // 若是打印出此日誌,證實assumpFail方法沒有拋出異常
        log.info("assumpFail的assumeTrue執行完成");
        // 接下來是常規的單元測試邏輯,但由於前面拋出了異常,就再也不執行了
        assertEquals(2, Math.addExact(1,1));
    }
}
  1. 點擊下圖紅框位置執行單元測試:

在這裏插入圖片描述
3. 執行結果以下:shell

在這裏插入圖片描述
4. 另外,在target目錄,能夠看到surefire插件生成的單元測試報告TEST-com.bolingcavalry.assertassume.service.impl.AssertAssumpTest.xml,以下圖所示,testcase節點中出現了skipped節點:數據庫

在這裏插入圖片描述

  • 上述對比驗證再次說明Assertions和Assumptions的區別:都用來對比預期值和實際值,當預期值和實際值不一致時,Assertions的測試結果是執行失敗,Assumptions的測試結果是跳過(或者忽略);

Assumptions實戰

弄清楚的Assertions和Assumptions的區別,接下來趁熱打鐵,學習Assumptions類中幾個重要的靜態方法:assumeTrue、assumingThatapi

  1. 最簡單的用法以下,可見只有assumeTrue不拋出異常,後面的log.info纔會執行:
@Test
    @DisplayName("最普通的assume用法")
    void tryAssumeTrue() {
        assumeTrue("CI".equals(envType));

        log.info("CI環境纔會打印的assumeTrue");
    }
  1. assumeTrue能夠接受Supplier類型做爲第二個入參,若是assumeTrue失敗就會將第二個參數的內容做爲失敗提示:
@Test
    @DisplayName("assume失敗時帶自定義錯誤信息")
    void tryAssumeTrueWithMessage() {
        // 第二個入參是Supplier實現,返回的內容用做跳過用例時的提示信息
        assumeTrue("CI".equals(envType),
                () -> "環境不匹配而跳過,當前環境:" + envType);

        log.info("CI環境纔會打印的tryAssumeTrueWithMessage");
    }

效果以下圖:springboot

在這裏插入圖片描述
3. 還有個assumingThat方法,能夠接受Executable類型做爲第二個入參,若是第一個入參爲true就會執行Executable的execute方法,注意assumingThat方法的特色:不拋出異常,所以其所在的方法不會被跳過,這是和assumeTrue相比最大的區別(assumeTrue一旦入參爲false就會拋出異常,其所在方法就被標記爲跳過):微信

@Test
    @DisplayName("assume成功時執行指定邏輯")
    void tryAssumingThat() {
        // 第二個入參是Executable實現,
        // 當第一個參數爲true時,執行第二個參數的execute方法
        assumingThat("CI".equals(envType),
                () -> {
                    log.info("這一行內容只有在CI環境纔會打印");
                });

        log.info("不管什麼環境都會打印的tryAssumingThat");
    }
  • 接下來我們執行上述代碼,看看效果;

執行Assumptions代碼

  1. 先作準備工做,本次實戰的springboot工程名爲assertassume,我們在工程的resources目錄下添加兩個配置文件:application.properties和application-test.properties,位置以下圖:

在這裏插入圖片描述
2. application-test.properties內容以下:

envType:CI
  1. application.properties內容以下:
envType:PRODUCTION
  1. 完整的單元測試類以下,經過註解ActiveProfiles,指定了使用application-test.properties的配置,所以envType的值爲CI
package com.bolingcavalry.assertassume.service.impl;

import lombok.extern.slf4j.Slf4j;
import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.ActiveProfiles;
import static org.junit.jupiter.api.Assumptions.assumeTrue;
import static org.junit.jupiter.api.Assumptions.assumingThat;

@SpringBootTest
@Slf4j
@ActiveProfiles("test")
public class AssumptionsTest {

    @Value("${envType}")
    private String envType;

    @Test
    @DisplayName("最普通的assume用法")
    void tryAssumeTrue() {
        assumeTrue("CI".equals(envType));

        log.info("CI環境纔會打印的assumeTrue");
    }

    @Test
    @DisplayName("assume失敗時帶自定義錯誤信息")
    void tryAssumeTrueWithMessage() {
        // 第二個入參是Supplier實現,返回的內容用做跳過用例時的提示信息
        assumeTrue("CI".equals(envType),
                () -> "環境不匹配而跳過,當前環境:" + envType);

        log.info("CI環境纔會打印的tryAssumeTrueWithMessage");
    }

    @Test
    @DisplayName("assume成功時執行指定邏輯")
    void tryAssumingThat() {
        // 第二個入參是Executable實現,
        // 當第一個參數爲true時,執行第二個參數的execute方法
        assumingThat("CI".equals(envType),
                () -> {
                    log.info("這一行內容只有在CI環境纔會打印");
                });

        log.info("不管什麼環境都會打印的tryAssumingThat");
    }
}
  1. 執行結果以下圖,可見assume經過,全部信息都被打印出來了:

在這裏插入圖片描述

  1. 接下來把代碼中的ActiveProfiles註解那一行註釋掉,以下圖紅框:

在這裏插入圖片描述

  1. 執行結果以下,可見tryAssumingThat方法被標記爲成功,不過從日誌可見assumingThat的第二個入參executable沒有被執行:

在這裏插入圖片描述

  • 至此,Assumptions類的經常使用方法體驗完成,接下來的章節會繼續學習其餘經常使用類;

你不孤單,欣宸原創一路相伴

  1. Java系列
  2. Spring系列
  3. Docker系列
  4. kubernetes系列
  5. 數據庫+中間件系列
  6. DevOps系列

歡迎關注公衆號:程序員欣宸

微信搜索「程序員欣宸」,我是欣宸,期待與您一同暢遊Java世界...
https://github.com/zq2599/blog_demos

相關文章
相關標籤/搜索