如何默认禁用所有JUnit5测试,仅执行符合特定条件的测试
方案实现
完全可以实现,以下是两种常用的落地方式:
方式一:配合JUnit5内置配置实现(改造成本最低)
- 第一步:先定义prod环境专用的启用注解
@EnabledIfSystemProperty(named = "profile", matches = "prod") annotation class ProdOnly
- 第二步:调整JUnit5配置和启动参数
- 默认在
src/test/resources/junit-platform.properties中设置全局测试默认启用,适配dev、preview全量跑的需求:
junit.jupiter.test.enabled.default = true- 执行prod环境测试时,额外传入启动参数覆盖默认配置,让prod环境默认禁用所有测试,仅标注了
@ProdOnly的测试会执行:
-Djunit.jupiter.test.enabled.default=false -Dprofile=prod - 默认在
如果用构建工具管理测试任务,可以直接把参数预设到prod测试任务中,无需每次手动输入:
- Gradle配置示例:
tasks.register('testProd', Test) { useJUnitPlatform() systemProperty 'profile', 'prod' systemProperty 'junit.jupiter.test.enabled.default', 'false' }
- Maven配置示例(在surefire插件对应prod的profile中添加):
<plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-surefire-plugin</artifactId> <configuration> <systemPropertyVariables> <profile>prod</profile> <junit.jupiter.test.enabled.default>false</junit.jupiter.test.enabled.default> </systemPropertyVariables> </configuration> </plugin>
方式二:自定义全局扩展实现(无需改构建配置)
如果不想修改启动参数,可以通过JUnit5扩展能力实现全局过滤逻辑:
- 第一步:先定义
@ProdOnly注解(和方式一一致) - 第二步:实现自定义执行条件扩展
import org.junit.jupiter.api.extension.ConditionEvaluationResult import org.junit.jupiter.api.extension.ExecutionCondition import org.junit.jupiter.api.extension.ExtensionContext class ProdTestFilterCondition : ExecutionCondition { override fun evaluateExecutionCondition(context: ExtensionContext): ConditionEvaluationResult { val profile = System.getProperty("profile") ?: "dev" // 非prod环境直接放行所有测试 if (profile != "prod") { return ConditionEvaluationResult.enabled("非prod环境默认执行全量测试") } // prod环境仅放行标注了@ProdOnly的测试类/方法 val isProdAllowed = context.testClass .map { it.isAnnotationPresent(ProdOnly::class.java) } .orElseGet { context.testMethod .map { it.isAnnotationPresent(ProdOnly::class.java) } .orElse(false) } return if (isProdAllowed) { ConditionEvaluationResult.enabled("prod环境允许执行的测试") } else { ConditionEvaluationResult.disabled("prod环境仅执行标注@ProdOnly的测试") } } }
- 第三步:注册全局扩展
在src/test/resources/META-INF/services/org.junit.jupiter.api.extension.Extension文件中添加扩展类的全限定名即可全局生效,不需要额外修改任何构建参数或测试代码。
内容的提问来源于stack exchange,提问作者u6f6o
相关产品推荐
相关产品推荐

