你好啊,我是大阳。
这是专栏《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 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("测试继续执行...");
}
/**
* 测试失败,打印出失败音讯
*/
@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 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("测试不会继续执行,不会打印此行...");
}
/**
* 测试失败,打印出失败音讯
*/
@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 让单元测试更便当的参数化测试,并且基于参数化测试咱们能够更加灵便的配置咱们的参数。