如何用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
相关产品推荐
相关产品推荐

