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

如何用Gradle与Kotlin实现单元/集成测试独立运行与源码分离?

在Gradle 4.5 Kotlin项目中配置独立的集成测试

先快速理清你提到的单元测试和集成测试的区别:单元测试聚焦隔离验证单个类/函数的逻辑,不依赖外部服务、数据库等;集成测试则是验证多个组件协作,或者代码与外部依赖(比如数据库、第三方API)的交互,通常会涉及真实或模拟的外部环境。

回到你的问题:之前尝试Java项目的配置没生效,后来的方案出现NO-SOURCE提示,核心原因是Kotlin项目的源集配置需要明确指定Kotlin源码目录,而且要确保测试类的位置和命名符合Gradle的默认检测规则。下面是完整的解决方案:

步骤1:搭建集成测试目录结构

先创建对应的目录,遵循Gradle约定俗成的结构:

src/
├── main/
│   └── kotlin/       // 主代码目录
├── test/
│   └── kotlin/       // 单元测试目录
└── integTest/
    └── kotlin/       // 集成测试目录
    └── resources/    // 集成测试资源文件(可选,比如配置文件)

步骤2:修改build.gradle配置

把你的build.gradle替换成下面的内容,每部分都做了注释说明:

buildscript {
    ext.kotlin_version = '1.2.21'
    repositories {
        mavenCentral()
    }
    dependencies {
        classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
    }
}

apply plugin: 'kotlin'
apply plugin: 'application'

mainClassName = 'xyz.bobdudan.myproject.AppKt'

repositories {
    maven { url "http://maven.stardog.com" }
    mavenCentral()
}

// 1. 配置集成测试的源集,指定Kotlin源码和资源目录
sourceSets {
    integTest {
        kotlin {
            // 让集成测试可以访问主代码和单元测试的代码(可选,如果你需要复用测试工具类)
            compileClasspath += main.output + test.output
            runtimeClasspath += main.output + test.output
            // 明确指定集成测试的Kotlin源码路径
            srcDir file('src/integTest/kotlin')
        }
        // 集成测试的资源文件目录(如果有需要的话)
        resources.srcDir file('src/integTest/resources')
    }
}

// 2. 创建integTest任务,继承Test类型,关联集成测试源集
task integTest(type: Test) {
    description = '运行集成测试'
    group = 'Verification' // 把任务归到Verification组,和test任务同组
    // 指定测试类的输出目录和类路径
    testClassesDirs = sourceSets.integTest.kotlin.classesDirs
    classpath = sourceSets.integTest.runtimeClasspath
    // 可选:自定义测试类匹配规则,默认是**/*Test.kt,如果你用*IntegrationTest.kt命名可以改这里
    // include '**/*IntegrationTest.kt'
    
    // 可选:让集成测试在单元测试执行完成后再运行(如果需要依赖单元测试通过)
    dependsOn test
}

// 3. 给集成测试添加依赖,和单元测试保持一致即可
dependencies {
    compile "org.jetbrains.kotlin:kotlin-stdlib-jdk8:$kotlin_version"
    // 单元测试依赖
    testCompile 'io.kotlintest:kotlintest:2.0.7'
    // 集成测试依赖
    integTestCompile 'io.kotlintest:kotlintest:2.0.7'
    integTestCompile "org.jetbrains.kotlin:kotlin-stdlib-jdk8:$kotlin_version"
}

步骤3:编写测试示例验证

在src/integTest/kotlin/xyz/bobdudan/myproject下创建测试类AppIntegrationTest.kt:

package xyz.bobdudan.myproject

import io.kotlintest.shouldBe
import io.kotlintest.specs.StringSpec

class AppIntegrationTest : StringSpec({
    "集成测试应该执行并故意失败" {
        1 shouldBe 2 // 这个断言一定会失败,用来验证测试是否被执行
    }
})

步骤4:运行集成测试

执行命令:

gradle clean integTest

现在你会看到测试失败的输出,说明集成测试已经被正确识别并执行了。

为什么之前会出现NO-SOURCE?

之前的配置没有明确指定集成测试的Kotlin源码目录,Gradle默认只会去src/integTest/java查找测试类,但你的测试是用Kotlin写的,所以Gradle找不到任何可编译的源码,就输出了NO-SOURCE提示。上面的配置通过sourceSets.integTest.kotlin.srcDir指定了正确的Kotlin源码路径,就能解决这个问题。

内容的提问来源于stack exchange,提问作者Bob Dudan

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 06:42:57