禁用测试
若在执行测试时,某些测试类或者测试方法不需要执行时,就需要禁用 整个测试类或者单个测试方法。
禁用测试的方式
@Disabled注解条件测试执行的相关注解- 自定义
ExecutionCondition
@Disabled
@Disabled注解用于注解测试类或者单个测试方法。若测试类或者单个测试方法被@Disabled注解,表明整个测试类或者单个测试方法已禁用且不再执行。
在使用@Disabled注解,通过value来给出禁用测试类或者测试方法的理由。
如果通过@Disabled注解禁用整个测试类,该类中的所有测试方法也会自动被禁用。如果通过@Disabled注解禁用单个方法,此注解不会阻止测试类被实例化。但是,它会阻止执行测试方法和方法级生命周期回调,例如@BeforeEach方法,@AfterEach方法和相应的扩展API。
示例
禁用单个方法
class DisabledMethodTest {
@Disabled
@Test
fun testWillBeSkipped() {
print("testWillBeSkipped")
}
@Test
fun testWillBeExecuted() {
print("testWillBeExecuted")
}
}

条件测试执行
JUnit Jupiter中的ExecutionCondition扩展API允许开发人员以编程的方式基于某些条件启用或禁用容器或测试。例如,用于支持@Disabled,注解的DisabledCondition.除了@Disabled,在org.junit.jupiter.api.condition中定义了一系列的注解,用于启用或禁用容器或测试。
- 操作系统条件:可以通过
@EnabledOnOs和@DisabledOnOs注解在特定操作系统上启用或禁用容器或测试 - Java运行时环境条件:可以通过
@EnabledOnJre和@DisabledOnJre注解在特定版本的Java运行时环境(JRE)上启用或禁用容器或测试 - 系统属性条件:可以通过
@EnabledIfSystemProperty和@DisabledIfSystemProperty注解根据指定的JVM系统属性的值启用或禁用容器或测试。通过matches属性提供的值将被解释为正则表达式 - 环境变量条件:通过
@EnabledIfEnvironmentVariable和@DisabledIfEnvironmentVariable注解,可以根据来自底层操作系统的命名环境变量的值启用或禁用容器或测试。通过matches属性提供的值将被解释为正则表达式。 - 脚本依赖条件:根据对通过
@EnabledIf或@DisabledIf注解配置的脚本的评估,JUnit Jupiter提供了启用或禁用容器或测试的功能。脚本可以用JavaScript,Groovy或任何其他支持Java脚本API的脚本语言编写,由JSR 223定义。
操作系统条件
操作系统条件基于@EnabledOnOs和@DisabledOnOs注解,用于指定测试在哪种操作系统中启用或禁用容器或者测试。
在org.junit.jupiter.api.condition.OS中,定义了当前常用的操作系统,包括:
- LINUX
- MAC
- SOLARIS
- WINDOWS
- OTHER
@Test
@EnabledOnOs(OS.MAC)
void onlyOnMacOs() {
println("该测试只能在MAC中执行")
}
@Test
@EnabledOnOs({ OS.LINUX, OS.MAC })
void onLinuxOrMac() {
println("该测试只能在MAC中执行")
}
@Test
@DisabledOnOs(OS.WINDOWS)
fun disableWindows() {
println("该测试在Windows系统中将被禁用")
}
在示例中:
onlyOnMacOs方法使用@EnabledOnOs注解,并指定操作系统为OS.MAC,表明只能在MAC系统中执行该测试用例,在其他系统将被禁用。disableWindows方法使用@DisabledOnOs注解,并指定操作系统为OS.WINDOWS,表明其将在WINDOWS系统中被禁用,在其他系统中正常启用。
Java运行时环境条件
Java运行时环境条件基于@EnabledOnJre和@DisabledOnJre指定该测试在哪个JRE版本中启用或禁用。
@Test
@EnabledOnJre(JRE.JAVA_8)
fun onlyOnJava8() {
println("该测试在JDK 8中启用")
}
@Test
@DisabledOnJre(JRE.JAVA_9, JRE.JAVA_10)
fun disabledJava9Or10() {
println("该测试在JDK 9 和 JDK 10中将被禁用")
}
在示例中:
onlyOnJava8方法通过@EnabledOnJre注解指定该测试可启用的JDK版本为8,在其他JDK版本中将被禁用。disabledJava9Or10方法通过@DisabledOnJre注解指定该测试在JDK 9或10中将被禁用,在其他JDK版本中启用。
系统属性条件
系统属性条件通过@EnabledIfSystemProperty和@DisabledIfSystemProperty注解根据指定的JVM系统属性的值启用或禁用容器或测试。通过matches属性提供的值将被解释为正则表达式。
@Test
@EnabledIfSystemProperty(named = "os.arch", matches = ".*64.*")
void onlyOn64BitArchitectures() {
// ...
}
@Test
@DisabledIfSystemProperty(named = "ci-server", matches = "true")
void notOnCiServer() {
// ...
}
环境变量条件
环境变量条件通过@EnabledIfEnvironmentVariable和@DisabledIfEnvironmentVariable主机,依据底层操作系统中命名的环境变量值来启用或禁用容器或方法。其中,matches属性提供的值,将被解释成正则表达式,用于匹配环境变量值。
@Test
@EnabledIfEnvironmentVariable(named = "ENV", matches = "staging-server")
void onlyOnStagingServer() {
// ...
}
@Test
@DisabledIfEnvironmentVariable(named = "ENV", matches = ".*development.*")
void notOnDeveloperWorkstation() {
// ...
}
脚本依赖条件
脚本依赖条件通过@EnabledIf或@DisabledIf注解配置的脚本的评估,JUnit Jupiter提供了启用或禁用容器或测试的功能。
脚本可以用JavaScript,Groovy或任何其他支持Java脚本API的脚本语言编写,由JSR 223定义。
⚠️警告
@EnabledIf或@DisabledIf注解目前处于实现阶段,谨慎使用
注意
- 如果脚本的逻辑仅依赖于当前的操作系统、当前的Java运行时环境版本、特定的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 | 测试或者容器的所有标签信息 |
| junitUniqueId | String | 测试或者容器的唯一标识 |
本文介绍了如何在JUnit 5中禁用测试,包括使用@Disabled注解禁用测试类和方法,以及如何根据操作系统、Java运行时环境、系统属性、环境变量和脚本条件来有条件地执行测试。还展示了各种条件注解如@EnabledIfSystemProperty、@DisabledIfSystemProperty等的使用示例。
865

被折叠的 条评论
为什么被折叠?



