2.7、条件测试
JUnit Jupiter
得ExecutionCondition
扩展API
机制允许开发者们使用条件编码得方式来启动或者禁用一个容器或测试类。一个简单条件测试就是支持@Disable
得DisabledCondition
。JUnit Jupiter
在org.junit.jupiter.api.condition
包下提供了除了@Disabled
之外得其他注解,这些注解允许开发者们以声明得方式启动或关闭容器和测试。详情参见下面得章节。
请注意,以下部分中列出的任何条件注释也可以用作元注释,以便创建自定义组合注释。比如: @EnabledOnOs demo 例子中得
@TestOnMac
是由@Test
和@EnabledOnOs
组合而成得。下面所有列出的注解只能在测试接口、测试类、测试方法上定义一次。如果一个条件注释在一个给定的元素上直接、间接或元出现多次,则只使用
JUnit
发现的第一个这样的注释;任何附加的声明都将被忽略。然而,请注意每个条件注解都可以与org.junit.jupiter.api.condition
包下其他条件注解结合使用。
2.7.1、判断操作系统
可以通过@EnabledOnOs
和@DisabledOnOs
注解让容器和测试在特定得操作系统启动或者禁用。
@Test
@EnabledOnOs(MAC)
void onlyOnMacOs() {
// ...
}
@TestOnMac
void testOnMac() {
// ...
}
@Test
@EnabledOnOs({ LINUX, MAC })
void onLinuxOrMac() {
// ...
}
@Test
@DisabledOnOs(WINDOWS)
void notOnWindows() {
// ...
}
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
@Test
@EnabledOnOs(MAC)
@interface TestOnMac {
}
2.7.2、判断Java运行环境
可以通过@EnabledOnJre
和@DisabledOnJre
让容器或者测试在特定JRE
得版本启用或者禁用。
@Test
@EnabledOnJre(JAVA_8)
void onlyOnJava8() {
// ...
}
@Test
@EnabledOnJre({ JAVA_9, JAVA_10 })
void onJava9Or10() {
// ...
}
@Test
@DisabledOnJre(JAVA_9)
void notOnJava9() {
// ...
}
2.7.3、判断系统属性
通过@EnabledIfSystemProperty
和@DisabledIfSystemProperty
注解根据指定的JVM
系统属性的值启用或禁用容器或测试。其值通过matches
属性所提供的值,将作为正则表达式。
@Test
@EnabledIfSystemProperty(named = "os.arch", matches = ".*64.*")
void onlyOn64BitArchitectures() {
// ...
}
@Test
@DisabledIfSystemProperty(named = "ci-server", matches = "true")
void notOnCiServer() {
// ...
}
2.7.4、判断环境变量
通过@EnabledIfEnvironmentVariable
和@DisabledIfEnvironmentVariable
注解得named
属性提供得值作为环境变量来启动或者禁用容器或测试。其环境属性得值通过matches
属性提供,且支持正则表达式。
@Test
@EnabledIfEnvironmentVariable(named = "ENV", matches = "staging-server")
void onlyOnStagingServer() {
// ...
}
@Test
@DisabledIfEnvironmentVariable(named = "ENV", matches = ".*development.*")
void notOnDeveloperWorkstation() {
// ...
}
2.7.5、根据脚本判断
在未来得
JUnit Jupiter
发行版,@EnabledIf
和@DisabledIf
将会被废弃移除。
JUnit Jupiter
通过@EnabledIf
或DisabledIf
注解中的执行脚本来启动或者禁止一个容器或者测试。其
脚本可以用JavaScript
、Groovy
或任何其他支持Java
脚本API
(由JSR 223
定义)的脚本语言编写。
如果你想写关注于指定操作系统、
JRE
版本、JVM
系统变量和特定得环境变量得脚本,你应该使用专注于这个目的得注解。详细信息可以从之前得章节可以看到。如果您发现您在多次使用相同脚本,您应该考虑写一个专注条件执行扩展插件,这样可以更块、类型更安全、更容易维护。
@Test // Static JavaScript expression.
@EnabledIf("2 * 3 == 6")
void willBeExecuted() {
// ...
}
@RepeatedTest(10) // Dynamic JavaScript expression.
@DisabledIf("Math.random() < 0.314159")
void mightNotBeExecuted() {
// ...
}
@Test // Regular expression testing bound system property.
@DisabledIf("/32/.test(systemProperty.get('os.arch'))")
void disabledOn32BitArchitectures() {
assertFalse(System.getProperty("os.arch").contains("32"));
}
@Test
@EnabledIf("'CI' == systemEnvironment.get('ENV')")
void onlyOnCiServer() {
assertTrue("CI".equals(System.getenv("ENV")));
}
@Test // Multi-line script, custom engine name and custom reason.
@EnabledIf(value = {
"load('nashorn:mozilla_compat.js')",
"importPackage(java.time)",
"",
"var today = LocalDate.now()",
"var tomorrow = today.plusDays(1)",
"tomorrow.isAfter(today)"
},
engine = "nashorn",
reason = "Self-fulfilling: {result}")
void theDayAfterTomorrow() {
LocalDate today = LocalDate.now();
LocalDate tomorrow = today.plusDays(1);
assertTrue(tomorrow.isAfter(today));
}
脚本绑定
以下名称绑定到每个脚本上下文,因此可以在脚本中使用。访问器通过简单的String get(String name)
方法提供对类似于映射的结构的访问。
名称 | 类型 | 描述 |
---|---|---|
systemEnvironment | accessor | 操作系统环境变量访问器 |
systemProperty | accessor | JVM系统属性访问器 |
junitConfigurationParameter | accessor | 配置参数访问器 |
junitDisplayName | String | 显示测试或者容器得名称 |
junitTags | Set |
所有标志测试或者容器得tag |
junitUniqueId | String | 测试或容器得唯一ID |