JUnit5教程(4): JUnit5假設、測試套件和條件測試

你好啊,我是大陽。

這是專欄《SpringBoot自動化單元測試教程》的第四篇文章。本文我們將討論JUnit5的假設、測試套件和條件測試。

1. JUnit5 假設

JUnit 5假設類提供靜態(tài)方法來支持基于假設的條件測試執(zhí)行。假設失敗會導致測試中止。

當繼續(xù)執(zhí)行給定的測試方法沒有意義時,通常使用假設。在測試報告中,這些測試將被標記為通過。

JUnit Assumptions(假設)類有以下方法:

  • Assumptions.assumeTrue()
  • Assumptions.assumeFalse()
  • Assumptions.assumingThat()

1.1 Assumptions.assumeTrue()

該方法驗證給定假設為,如果假設為,則測試繼續(xù)進行,否則,測試執(zhí)行將中止。

它具有以下重載方法:

public static void assumeTrue(boolean assumption) throws TestAbortedException
public static void assumeTrue(boolean assumption, Supplier<String> messageSupplier) throws TestAbortedException
public static void assumeTrue(boolean assumption, String message) throws TestAbortedException

public static void assumeTrue(BooleanSupplier assumptionSupplier) throws TestAbortedException
public static void assumeTrue(BooleanSupplier assumptionSupplier, String message) throws TestAbortedException
public static void assumeTrue(BooleanSupplier assumptionSupplier, Supplier<String> messageSupplier) throws TestAbortedException

示例:

package cn.dayangshuo.junit5.tests;
import org.junit.jupiter.api.Assumptions;
import org.junit.jupiter.api.Test;
/**
 * @author DAYANG
 */
public class AssumeTests {
    @Test
    void testOnDev() {
        System.setProperty("ENV", "DEV");
        Assumptions.assumeTrue("DEV".equals(System.getProperty("ENV")));
        System.out.println("測試繼續(xù)執(zhí)行...");
    }
    /**
     * 測試失敗,打印出失敗消息
     */
    @Test
    void testOnProd() {
        System.setProperty("ENV", "PROD");
        Assumptions.assumeTrue("DEV".equals(System.getProperty("ENV")), AssumeTests::message);
        System.out.println("測試不會繼續(xù)執(zhí)行,不會打印此行...");
    }
    private static String message() {
        return "測試失敗...";
    }
}

1.2 Assumptions.assumeFalse()

該方法驗證給定假設為,如果假設為,則測試繼續(xù),否則,測試執(zhí)行被中止。

它具有以下重載方法:

public static void assumeFalse(boolean assumption) throws TestAbortedException
public static void assumeFalse(boolean assumption, Supplier<String> messageSupplier) throws TestAbortedException
public static void assumeFalse(boolean assumption, String message) throws TestAbortedException

public static void assumeFalse(BooleanSupplier assumptionSupplier) throws TestAbortedException
public static void assumeFalse(BooleanSupplier assumptionSupplier, String message) throws TestAbortedException
public static void assumeFalse(BooleanSupplier assumptionSupplier, Supplier<String> messageSupplier) throws TestAbortedException

示例:

package cn.dayangshuo.junit5.tests;
import org.junit.jupiter.api.Assumptions;
import org.junit.jupiter.api.Test;
/**
 * @author DAYANG
 */
public class AssumeTests {
    @Test
    void testOnDev() {
        System.setProperty("ENV", "DEV");
        Assumptions.assumeFalse("DEV".equals(System.getProperty("ENV")), AssumeTests::message);
        System.out.println("測試不會繼續(xù)執(zhí)行,不會打印此行...");
    }
    /**
     * 測試失敗,打印出失敗消息
     */
    @Test
    void testOnProd() {
        System.setProperty("ENV", "PROD");
        Assumptions.assumeFalse("DEV".equals(System.getProperty("ENV")));
        System.out.println("測試繼續(xù)執(zhí)行...");
    }
    private static String message() {
        return "測試失敗...";
    }
}

1.3 Assertions.assumingThat()

該方法執(zhí)行提供的可執(zhí)行文件,但前提是提供的假設有效。與其他假設方法不同,此方法不會中止測試。

如果該假設無效,則該方法不起任何作用。如果假設有效且可執(zhí)行文件拋出異常,則它將被視為常規(guī)測試失敗。拋出的異常將按原樣重新拋出,但被掩蓋為未經檢查的異常。

它有以下重載方法:

public static void assumingThat(boolean assumption, Executable executable)
public static void assumingThat(BooleanSupplier assumptionSupplier, Executable executable)

示例:

@Test
    void testInAllEnvironments() {
        System.setProperty("ENV", "DEV");
        Assumptions.assumingThat("DEV".equals(System.getProperty("ENV")),
                () -> {
                    //僅在DEV服務器上執(zhí)行這些斷言和打印
                    //即System.setProperty("ENV", "DEV")才會執(zhí)行
                    Assertions.assertEquals(3, Calculator.add(4, 2));
                });

        // 在所有環(huán)境中執(zhí)行這些斷言
        Assertions.assertEquals(13, Calculator.add(6, 7));
    }

2. JUnit5測試套件

測試套件其實就是JUnit5允許我們運行多個包或者類中的測試方法,也就是分組測試。JUnit5中使用@Suite注解來聲明測試套件。

在開始分組測試之前,我們先了解幾個注解:

  • @Tag:測試類和方法可以通過此注解進行標記。這些標簽以后可用于過濾測試發(fā)現(xiàn)和執(zhí)行。
  • @Disabled:整個測試類或單個測試方法可以通過此注解禁止測試。

我們直接來看分組測試的代碼示例:

package cn.dayangshuo.junit5;
import cn.dayangshuo.junit5.assertt.AssertTest;
import cn.dayangshuo.junit5.tests.LifeCycleTests;
import org.junit.platform.suite.api.*;
/**
 * @author DAYANG
 */
//將LifeCycleTests和AssertTest這兩個類合并在一個分組中進行測試
@SelectClasses({LifeCycleTests.class, AssertTest.class})
//也可以直接將多個包合并一個組中測試
//@SelectPackages({"cn.dayangshuo.junit5.tests"})
//這個注解代表只測試含有DEV標簽的測試類或者方法
//@IncludeTags("DEV")
@Suite
@SuiteDisplayName("測試套件,分組測試")
public class SuiteTests {
}

其中LifeCycleTests和AssertTest的代碼如下,直接運行SuiteTests類,下面我們來看一下LifeCycleTests和AssertTest類中哪些方法會被執(zhí)行:

package cn.dayangshuo.junit5.tests;

import cn.dayangshuo.junit5.Calculator;
import org.junit.jupiter.api.*;

/**
 * @author DAYANG
 */
public class LifeCycleTests {
    //執(zhí)行了
    @Tag("DEV")
    @DisplayName("生命周期測試")
    @Test
    void testCalcOne() {
        System.out.println("======測試1執(zhí)行了=======");
        Assertions.assertEquals(4, Calculator.add(2, 2));
    }
    //執(zhí)行了,但是如果SuiteTests類有@IncludeTags("DEV")注解則不會執(zhí)行
    @Tag("PROD")
    @Test
    void testCalcThree() {
        System.out.println("======測試3執(zhí)行了=======");
        Assertions.assertEquals(6, Calculator.add(2, 4));
    }
    //不會執(zhí)行,因為被禁用了
    @Disabled
    @Test
    void testCalcTwo() {
        System.out.println("======測試2執(zhí)行了=======");
        Assertions.assertEquals(6, Calculator.add(2, 4));
    }
}

package cn.dayangshuo.junit5.assertt;
import cn.dayangshuo.junit5.Calculator;
import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.Tag;
import org.junit.jupiter.api.Test;

import java.util.function.Supplier;

/**
 * @author DAYANG
 */
public class AssertTest {
    //執(zhí)行了
    @Test
    @Tag("DEV")
    void assertTest() {
        //測試通過
        Assertions.assertNotEquals(3, Calculator.add(2, 2));
        //測試失敗
        Assertions.assertNotEquals(4, Calculator.add(2, 2), "Calculator.add(2, 2) test failed");
        //測試失敗
        Supplier<String> messageSupplier  = () -> "Calculator.add(2, 2) test failed";
        Assertions.assertNotEquals(4, Calculator.add(2, 2), messageSupplier);
    }
}

執(zhí)行結果如圖:

suite_result.png

套件測試中更多注解如下,可以使用他們包含或者排除某些類,某些包或者某些標簽:

  • @SelectClasses
  • @SelectPackages
  • @IncludePackages
  • @ExcludePackages
  • @IncludeClassNamePatterns
  • @ExcludeClassNamePatterns
  • @IncludeTags
  • @ExcludeTags

3. 條件測試

JUnit Jupiter 中的ExecutionCondition擴展 API 允許開發(fā)人員以編程方式基于特定條件啟用禁用容器或測試。這種條件的最簡單示例是支持注釋 的內置函數(shù) 。

如操作系統(tǒng)條件測試:@EnabledOnOs可以通過和@DisabledOnOs注釋在特定操作系統(tǒng)上啟用或禁用容器或測試 。

package cn.dayangshuo.junit5.tests;

import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.condition.DisabledOnOs;
import org.junit.jupiter.api.condition.EnabledOnOs;
import org.junit.jupiter.api.condition.OS;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

/**
 * @author DAYANG
 */
public class ConditionsTests {

    @Test
    @EnabledOnOs(OS.MAC)
    void onlyOnMacOs() {
        // ...
    }

    @TestOnMac
    void testOnMac() {
        // ...
    }

    @Test
    @EnabledOnOs({ OS.LINUX, OS.MAC })
    void onLinuxOrMac() {
        // ...
    }

    @Test
    @DisabledOnOs(OS.WINDOWS)
    void notOnWindows() {
        // ...
    }

    @Target(ElementType.METHOD)
    @Retention(RetentionPolicy.RUNTIME)
    @Test
    @EnabledOnOs(OS.MAC)
    @interface TestOnMac {
    }
}

下一篇我們將討論JUnit5讓單元測試更便利的參數(shù)化測試,并且基于參數(shù)化測試我們可以更加靈活的配置我們的參數(shù)。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

友情鏈接更多精彩內容