如何配置多Java toolchain执行Gradle测试 多JDK版本运行测试
问题根因
你创建的自定义Test任务仅继承了原test任务的类路径和测试类目录,没有继承测试框架的核心配置(包括测试引擎、测试发现规则、Kotest专用配置、测试筛选规则等),导致新任务无法识别项目中的测试用例,看起来任务执行成功但实际没有运行任何测试用例。
修正后的完整配置
val minimumJava = JavaLanguageVersion.of(8) val maximumJava = JavaLanguageVersion.of(16) java { // 全局编译使用最低Java版本,保证字节码向下兼容 toolchain { languageVersion.set(minimumJava) vendor.set(JvmVendorSpec.ADOPTOPENJDK) } // 显式指定字节码兼容版本,避免意外调用高版本Java API sourceCompatibility = JavaVersion.toVersion(minimumJava) targetCompatibility = JavaVersion.toVersion(minimumJava) } // 注册多版本测试任务 val allTestTasks = mutableListOf<TaskProvider<Test>>() // 默认test任务使用最低版本Java,直接加入测试任务列表 allTestTasks.add(tasks.test) // 生成其余JDK版本的测试任务 for (versionNum in minimumJava.asInt() + 1..maximumJava.asInt()) { val currentJavaVersion = JavaLanguageVersion.of(versionNum) val versionTestTask = tasks.register<Test>("testUnderJava$versionNum") { val baseTestTask = tasks.test.get() // 继承原test任务的所有通用配置 group = baseTestTask.group testClassesDirs = baseTestTask.testClassesDirs classpath = baseTestTask.classpath includes.addAll(baseTestTask.includes) excludes.addAll(baseTestTask.excludes) // 仅覆盖当前任务的JDK启动器 javaLauncher.set(javaToolchains.launcherFor { languageVersion.set(currentJavaVersion) vendor.set(JvmVendorSpec.ADOPTOPENJDK) }) // 独立配置测试结果和报告目录,避免不同版本结果互相覆盖 reports.html.outputLocation.set(layout.buildDirectory.dir("reports/tests/$name")) reports.junitXml.outputLocation.set(layout.buildDirectory.dir("test-results/$name")) } allTestTasks.add(versionTestTask) } // 可选:注册统一入口任务,一键运行所有版本测试 tasks.register("testAll") { group = "verification" description = "Run tests on all supported JDK versions" dependsOn(allTestTasks) }
验证方式
执行命令 ./gradlew testAll --rerun-tasks 即可触发所有JDK版本的测试执行,每个版本的测试结果会单独输出到build/reports/tests/testUnderJavaX目录下,可分别查看对应版本的测试运行情况。
内容的提问来源于stack exchange,提问作者Danilo Pianini
相关产品推荐
相关产品推荐

