你好啊,我是大阳。

这是专栏《SpringBoot自动化单元测试教程》的第四篇文章。本文咱们将探讨JUnit5的假如、测试套件和条件测试。

1. JUnit5 假如

JUnit 5假如类提供静态方法来反对基于假如的条件测试执行。假如失败会导致测试停止。

当继续执行给定的测试方法没有意义时,通常应用假如。在测试报告中,这些测试将被标记为通过。

JUnit Assumptions(假如)类有以下办法:

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

1.1 Assumptions.assumeTrue()

该办法验证给定假如为,如果假如为,则测试持续进行,否则,测试执行将停止。

它具备以下重载办法:

public static void assumeTrue(boolean assumption) throws TestAbortedExceptionpublic static void assumeTrue(boolean assumption, Supplier<String> messageSupplier) throws TestAbortedExceptionpublic static void assumeTrue(boolean assumption, String message) throws TestAbortedExceptionpublic static void assumeTrue(BooleanSupplier assumptionSupplier) throws TestAbortedExceptionpublic static void assumeTrue(BooleanSupplier assumptionSupplier, String message) throws TestAbortedExceptionpublic 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("测试继续执行...");    }    /**     * 测试失败,打印出失败音讯     */    @Test    void testOnProd() {        System.setProperty("ENV", "PROD");        Assumptions.assumeTrue("DEV".equals(System.getProperty("ENV")), AssumeTests::message);        System.out.println("测试不会继续执行,不会打印此行...");    }    private static String message() {        return "测试失败...";    }}

1.2 Assumptions.assumeFalse()

该办法验证给定假如为,如果假如为,则测试持续,否则,测试执行被停止。

它具备以下重载办法:

public static void assumeFalse(boolean assumption) throws TestAbortedExceptionpublic static void assumeFalse(boolean assumption, Supplier<String> messageSupplier) throws TestAbortedExceptionpublic static void assumeFalse(boolean assumption, String message) throws TestAbortedExceptionpublic static void assumeFalse(BooleanSupplier assumptionSupplier) throws TestAbortedExceptionpublic static void assumeFalse(BooleanSupplier assumptionSupplier, String message) throws TestAbortedExceptionpublic 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("测试不会继续执行,不会打印此行...");    }    /**     * 测试失败,打印出失败音讯     */    @Test    void testOnProd() {        System.setProperty("ENV", "PROD");        Assumptions.assumeFalse("DEV".equals(System.getProperty("ENV")));        System.out.println("测试继续执行...");    }    private static String message() {        return "测试失败...";    }}

1.3 Assertions.assumingThat()

该办法执行提供的可执行文件,但前提是提供的假如无效。与其余假如办法不同,此办法不会停止测试。

如果该假如有效,则该办法不起任何作用。如果假如无效且可执行文件抛出异样,则它将被视为惯例测试失败。抛出的异样将按原样从新抛出,但被覆盖为未经查看的异样。

它有以下重载办法:

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服务器上执行这些断言和打印                    //即System.setProperty("ENV", "DEV")才会执行                    Assertions.assertEquals(3, Calculator.add(4, 2));                });        // 在所有环境中执行这些断言        Assertions.assertEquals(13, Calculator.add(6, 7));    }

2. JUnit5测试套件

测试套件其实就是JUnit5容许咱们运行多个包或者类中的测试方法,也就是分组测试。JUnit5中应用@Suite注解来申明测试套件。

在开始分组测试之前,咱们先理解几个注解:

  • @Tag:测试类和办法能够通过此注解进行标记。这些标签当前可用于过滤测试发现和执行。
  • @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类中哪些办法会被执行:

package cn.dayangshuo.junit5.tests;import cn.dayangshuo.junit5.Calculator;import org.junit.jupiter.api.*;/** * @author DAYANG */public class LifeCycleTests {    //执行了    @Tag("DEV")    @DisplayName("生命周期测试")    @Test    void testCalcOne() {        System.out.println("======测试1执行了=======");        Assertions.assertEquals(4, Calculator.add(2, 2));    }    //执行了,然而如果SuiteTests类有@IncludeTags("DEV")注解则不会执行    @Tag("PROD")    @Test    void testCalcThree() {        System.out.println("======测试3执行了=======");        Assertions.assertEquals(6, Calculator.add(2, 4));    }    //不会执行,因为被禁用了    @Disabled    @Test    void testCalcTwo() {        System.out.println("======测试2执行了=======");        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 {    //执行了    @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);    }}

执行后果如图:

套件测试中更多注解如下,能够应用他们蕴含或者排除某些类,某些包或者某些标签:

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

3. 条件测试

JUnit Jupiter 中的ExecutionCondition扩大 API 容许开发人员以编程形式基于特定条件启用禁用容器或测试。这种条件的最简略示例是反对正文 的内置函数 。

如操作系统条件测试:@EnabledOnOs能够通过和@DisabledOnOs正文在特定操作系统上启用或禁用容器或测试 。

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让单元测试更便当的参数化测试,并且基于参数化测试咱们能够更加灵便的配置咱们的参数。