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

如何为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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.01 09:15:23