【问题标题】:How to create separate tests with Gradle and Kotlin?如何使用 Gradle 和 Kotlin 创建单独的测试?
【发布时间】:2026-01-04 13:20:02
【问题描述】:

我正在使用 Gradle 开发一个包含单元测试的 Kotlin 项目。我想添加一些集成测试(或功能测试,从来不理解两者之间的区别),但我希望能够独立运行它们。理想情况下,测试的来源位于不同的文件夹中。

我使用的是 Gradle 4.5,我的 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()
}
dependencies {
    compile "org.jetbrains.kotlin:kotlin-stdlib-jdk8:$kotlin_version"
    testCompile 'io.kotlintest:kotlintest:2.0.7'
}

我尝试了method described here for java,但它不起作用:任务也运行单元测试,但找不到它们,并且根本不执行集成测试。

我能做什么?

编辑:

这是gradle clean integTest 的结果与@lance-java 的解决方案:

:clean
:compileIntegTestKotlin
:compileIntegTestJava NO-SOURCE
:processIntegTestResources NO-SOURCE
:integTestClasses UP-TO-DATE
:integTest NO-SOURCE

Deprecated Gradle features were used in this build, making it incompatible with Gradle 5.0.
See https://docs.gradle.org/4.5/userguide/command_line_interface.html#sec:command_line_warnings

BUILD SUCCESSFUL in 1s
2 actionable tasks: 2 executed

所以什么都没有执行(我确保测试应该失败)

【问题讨论】:

    标签: unit-testing gradle kotlin integration-testing


    【解决方案1】:

    注意:我不是 kotlin 开发人员,所以会用 groovy 编写。

    您可以添加另一个SourceSet,它将自动为SourceSet 添加一个JavaCompile 任务以及一些Configuration 实例到模型(例如integTestCompile、integTestCompileOnly、integTestRuntime 等)

    sourceSets {
        integTest {
            java.srcDir 'src/integTest/java'
            resources.srcDir 'src/integTest/resources'
        }
    }
    configurations {
        integTestCompile.extendsFrom compile
    }
    

    然后你可以添加另一个Test任务

    task integTest(type: Test) {  
        testClassesDir = sourceSets.integTest.output.classesDir
        classpath = sourceSets.integTest.runtimeClasspath
    }
    

    您可能希望将integTest 任务连接到普通的DAG,或者您可能会关闭它并显式调用它

    check.dependsOn integTest  
    

    【讨论】:

    • 感谢您的回复,但这不起作用。我帖子上的更新显示了命令 gradle clean integTest 的输出
    • :integTest NO-SOURCE 表示src/integTest/java 中什么都没有,所以它什么也没做。另请参阅nebula-integtest-plugin,它使用一行代码完成了我提到的所有操作
    • 我不这么认为,因为我明确声明了源目录,如果我在文件中犯了错误,它将无法编译。
    • 您是否在src/integTest/java 中放置了.java 文件(带有junit @Test 注释)?
    【解决方案2】:

    长话短说,您必须:

    1. 创建单独的源集,
    2. 为每个测试源创建 testTask,
    3. 设置它,
    4. 定义这些任务应该在构建/检查期间执行的顺序

    你可以走了。

    这是an answer to another question 中的指南,介绍如何使用JUnit5Kotlin Spek 测试框架为项目执行此操作。

    【讨论】:

      最近更新 更多