返回

决战单元测试(四):用 Spring Boot 按条件执行

后端

Spring Boot 单元测试(四)按条件执行

Spring Boot 单元测试(四)按条件执行

Spring Boot 可以控制测试在一定条件下执行,同@Tag按标签过滤不同。

一、Java 环境

  • @EnabledOnJre:指定多个 JRE 版本,只有当前测试环境 JRE 版本在此范围内才执行

二、Linux 环境

  • @EnabledOnOs:只在当前测试环境为 Linux 时执行测试

三、系统属性条件

  • @EnabledOnProperty:只在系统属性满足一定条件时执行测试

四、自定义条件

  • @EnabledIf:可以自定义条件执行,可谓覆盖面极广

本文对它们一一进行说明和示例。

1. Java 环境

@EnabledOnJre 控制测试按 Java 版本执行。

引入依赖

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-test-autoconfigure</artifactId>
    <scope>test</scope>
</dependency>

编写测试

import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit.jupiter.EnabledOnJre;
import java.lang.reflect.Field;

import static org.junit.jupiter.api.Assertions.assertEquals;

/**
 * @author jackie
 */
@SpringBootTest
class AppTest {
    @Test
    @EnabledOnJre(JRE.JAVA_8) // 指定java8环境执行
    void testOnJava8() {
        assertEquals(8, Runtime.version().feature());
    }

    @Test
    @EnabledOnJre(JRE.JAVA_11) // 指定java11环境执行
    void testOnJava11() {
        assertEquals(11, Runtime.version().feature());
    }

    // 指定多个java环境
    @Test
    @EnabledOnJre({JRE.JAVA_8, JRE.JAVA_11})
    void testOnJava8Or11() {
        int feature = Runtime.version().feature();
        assertEquals(8, feature || 11, feature);
    }

    // 反射获取jre版本
    @Test
    @EnabledOnJre(matches = ".*11.*") // 匹配jre版本,只运行java11环境
    void testOnJava11WithReflection() {
        int feature = 0;
        try {
            Field field = Runtime.class.getDeclaredField("version");
            field.setAccessible(true);
            feature = (int) field.get(null).toString().split("\\.")[1];
        } catch (Exception e) {
            e.printStackTrace();
        }
        assertEquals(11, feature);
    }
}

2. Linux 环境

@EnabledOnOs 控制测试按操作系统版本执行。

引入依赖

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-test-autoconfigure</artifactId>
    <scope>test</scope>
</dependency>

编写测试

import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit.jupiter.EnabledOnOs;

import static org.junit.jupiter.api.Assertions.assertTrue;

/**
 * @author jackie
 */
@SpringBootTest
class AppTest {

    @Test
    @EnabledOnOs(OS.LINUX) // 只在Linux环境执行
    void testOnLinux() {
        assertTrue(System.getProperty("os.name").toLowerCase().contains("linux"));
    }
}

3. 系统属性条件

@EnabledOnProperty 控制测试按系统属性条件执行。

引入依赖

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-test-autoconfigure</artifactId>
    <scope>test</scope>
</dependency>

编写测试

import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit.jupiter.EnabledOnProperty;

import static org.junit.jupiter.api.Assertions.assertEquals;

/**
 * @author jackie
 */
@SpringBootTest
class AppTest {
    // 只在满足系统属性时执行
    @Test
    @EnabledOnProperty(value = "java.version", matches = ".*11.*")
    void testOnJava11() {
        assertEquals(11, Runtime.version().feature());
    }

    // 只在满足系统属性条件时执行
    @Test
    @EnabledOnProperty(value = "user.dir", matches = ".*spring-boot-testing.*")
    void testOnProjectDir() {
        assertTrue(System.getProperty("user.dir").contains("spring-boot-testing"));
    }
}

4. 自定义条件

@EnabledIf 可以自定义条件执行测试。

引入依赖

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-test-autoconfigure</artifactId>
    <scope>test</scope>
</dependency>

编写测试

import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit.jupiter.EnabledIf;

import static org.junit.jupiter.api.Assertions.assertTrue;

/**
 * @author jackie
 */
@SpringBootTest
class AppTest {

    // 自定义条件执行
    @Test
    @EnabledIf(expression = "#{systemProperties['os.name'].toLowerCase().contains('linux')}",
            loadContext = true) // 是否加载spring context
    void testOnLinux() {
        assertTrue(System.getProperty("os.name").toLowerCase().contains("linux"));
    }

    // 自定义条件执行,并且不加载spring context
    @Test
    @EnabledIf(expression = "#{systemProperties['java.version'].matches('.*11.*')}",
            loadContext = false)
    void testOnJava11() {
        assertTrue(System.getProperty("java.version").matches(".*11.*"));
    }
}

测试结果:

onJava8
onJava11
onJava8Or11
onJava11WithReflection
onLinux
testOnJava11()

Process finished with exit code 0