返回
决战单元测试(四):用 Spring Boot 按条件执行
后端
2023-10-29 22:10:39
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