https://github.com/zq2599/blog_demosjava
內容:全部原創文章分類彙總及配套源碼,涉及Java、Docker、Kubernetes、DevOPS等;git
《JUnit5學習》系列旨在經過實戰提高SpringBoot環境下的單元測試技能,一共八篇文章,連接以下:程序員
本文是《JUnit5學習》系列的第二篇,學習一個重要的知識點:Assumptions類,只有瞭解了它們,纔好繼續後面的學習,全篇章節以下: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協議 |
Assumptions和Assertions容易混淆,所以這裏經過對比它們來學習:spring
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)); } }
3. 執行結果以下:shell
4. 另外,在target目錄,能夠看到surefire插件生成的單元測試報告TEST-com.bolingcavalry.assertassume.service.impl.AssertAssumpTest.xml,以下圖所示,testcase節點中出現了skipped節點:數據庫
弄清楚的Assertions和Assumptions的區別,接下來趁熱打鐵,學習Assumptions類中幾個重要的靜態方法:assumeTrue、assumingThatapi
@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"); }
效果以下圖: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"); }
2. application-test.properties內容以下:
envType:CI
envType:PRODUCTION
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"); } }
微信搜索「程序員欣宸」,我是欣宸,期待與您一同暢遊Java世界...
https://github.com/zq2599/blog_demos