You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何默认禁用所有JUnit5测试,仅执行符合特定条件的测试

方案实现

完全可以实现,以下是两种常用的落地方式:

方式一:配合JUnit5内置配置实现(改造成本最低)

  • 第一步:先定义prod环境专用的启用注解
@EnabledIfSystemProperty(named = "profile", matches = "prod")
annotation class ProdOnly
  • 第二步:调整JUnit5配置和启动参数
    1. 默认在src/test/resources/junit-platform.properties中设置全局测试默认启用,适配dev、preview全量跑的需求:
    junit.jupiter.test.enabled.default = true
    
    1. 执行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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.07 15:15:02