如何为Kotlin项目配置Gradle JVM集成测试套件?
如何让Gradle的JVM Test Suites集成测试继承常规测试的依赖?
我想用Gradle的JVM Test Suites为Kotlin项目添加集成测试套件,但测试因依赖缺失无法编译。项目结构由gradle init生成,新增了src/intTest目录,结构如下:
. ├── app │ ├── build.gradle.kts │ └── src │ ├── intTest │ │ └── kotlin │ │ └── SomeTest.kt │ ├── main │ │ ├── kotlin │ │ │ └── mcve │ │ │ └── App.kt │ │ └── resources │ └── test │ ├── kotlin │ │ ├── SomeTest.kt │ │ └── mcve │ │ └── AppTest.kt │ └── resources ├── gradle │ ├── libs.versions.toml │ └── wrapper │ ├── gradle-wrapper.jar │ └── gradle-wrapper.properties ├── gradle.properties ├── gradlew ├── gradlew.bat └── settings.gradle.kts
app/src/test/kotlin/SomeTest.kt和app/src/intTest/kotlin/SomeTest.kt内容一致:
import kotlinx.coroutines.* import kotlin.test.assertEquals import kotlin.test.Test class SomeTest { @Test fun someTest() { assertEquals(1, 1) } }
当前app/build.gradle.kts配置:
plugins { alias(libs.plugins.jvm) application } repositories { mavenCentral() } dependencies { implementation("org.jetbrains.kotlinx:kotlinx-coroutines-core:1.7.3") implementation("org.jetbrains.kotlinx:kotlinx-coroutines-android:1.7.3") } testing { suites { val test by getting(JvmTestSuite::class) { useKotlinTest("1.9.20") } // 新增的测试套件 val intTest by registering(JvmTestSuite::class) { dependencies { implementation(project()) } } } } java { toolchain { languageVersion.set(JavaLanguageVersion.of(21)) } } application { mainClass.set("mcve.AppKt") }
运行./gradlew test正常,但./gradlew intTest失败,报错找不到生产依赖(协程)和测试依赖(kotlin-test):
> Task :app:compileIntTestKotlin FAILED e: file:///Users/robert/mcve/app/src/intTest/kotlin/SomeTest.kt:1:8 Unresolved reference: kotlinx e: file:///Users/robert/mcve/app/src/intTest/kotlin/SomeTest.kt:1:15 Unresolved reference: test e: file:///Users/robert/mcve/app/src/intTest/kotlin/SomeTest.kt:2:15 Unresolved reference: test e: file:///Users/robert/mcve/app/src/intTest/kotlin/SomeTest.kt:5:6 Unresolved reference: Test e: file:///Users/robert/mcve/app/src/intTest/kotlin/SomeTest.kt:7:9 Unresolved reference: assertEquals FAILURE: Build failed with an exception. * What went wrong: Execution failed for task ':app:compileIntTestKotlin'. > A failure occurred while executing org.jetbrains.kotlin.compilerRunner.GradleCompilerRunnerWithWorkers$GradleKotlinCompilerWorkAction > Compilation error. See log for more details
解决方案
要解决依赖缺失问题,需要从测试框架依赖引入和依赖继承两个维度调整配置:
1. 为集成测试套件添加测试框架依赖
当前intTest套件仅依赖主项目代码,缺少测试框架(kotlin-test)的依赖。直接在intTest配置中调用useKotlinTest,Gradle会自动引入测试框架相关依赖:
val intTest by registering(JvmTestSuite::class) { // 指定集成测试的源码目录 sources { kotlin { setSrcDirs(listOf("src/intTest/kotlin")) } resources { setSrcDirs(listOf("src/intTest/resources")) } } // 自动引入kotlin-test依赖 useKotlinTest("1.9.20") dependencies { // 依赖主项目编译产物,获取业务代码及依赖 implementation(project()) } }
2. 继承常规测试的自定义依赖(可选)
如果常规测试test有额外自定义依赖,希望集成测试复用,可以通过配置继承实现:
val test by getting(JvmTestSuite::class) { useKotlinTest("1.9.20") } val intTest by registering(JvmTestSuite::class) { sources { kotlin.srcDir("src/intTest/kotlin") resources.srcDir("src/intTest/resources") } useKotlinTest("1.9.20") // 继承常规测试的编译、运行时依赖配置 configurations { compileClasspath.extendsFrom(test.configurations.compileClasspath.get()) runtimeClasspath.extendsFrom(test.configurations.runtimeClasspath.get()) } dependencies { implementation(project()) } }
完整配置示例
修改后的app/build.gradle.kts测试套件部分:
testing { suites { val test by getting(JvmTestSuite::class) { useKotlinTest("1.9.20") } val intTest by registering(JvmTestSuite::class) { sources { kotlin { setSrcDirs(listOf("src/intTest/kotlin")) } resources { setSrcDirs(listOf("src/intTest/resources")) } } useKotlinTest("1.9.20") dependencies { implementation(project()) } } } }
配置完成后,运行./gradlew intTest即可正常编译并执行集成测试。
内容的提问来源于stack exchange,提问作者Robert
相关产品推荐
相关产品推荐

