Adding integration tests to Kotlin project using the Kotlin Gradle DSL

做~自己de王妃 提交于 2019-12-21 12:32:50

问题


I would like to add an additional "source set" to a Kotlin project that will contain integration tests. I have seen a few posts that talk about doing it for either a vanilla Java project or for Kotlin but using Groovy rather than the Kotlin Gradle DSL.

In summary, using the Kotlin Gradle DSL:

  • how to add an additional "source set" that can contain Kotlin code, Java code & resources for the purpose of separating integration tests from regular unit tests?
  • how to add an additional task and configuration to run the integration tests separately from unit tests?

I would expect the directory structure to look something like:

src
   main
      java
      kotlin
      resources
   test
      java
      kotlin
      resources
   integration
      java
      kotlin
      resources

Related:

  • https://ryanharrison.co.uk/2018/07/25/kotlin-add-integration-test-module.html

  • https://www.petrikainulainen.net/programming/gradle/getting-started-with-gradle-integration-testing/

  • How do I add a new sourceset to Gradle?

Thanks


回答1:


You must add following configuration to your build.gradle file

configurations {
    integrationTestImplementation.extendsFrom implementation
    integrationTestRuntimeOnly.extendsFrom runtimeOnly
}


dependencies {
    intTestImplementation 'junit:junit:4.12'
    ...
}

sourceSets {
    integrationTest {
        kotlin {
            compileClasspath += main.output + test.output
            runtimeClasspath += main.output + test.output
            srcDir file('src/integrationTest/kotlin')
        }
    }
}

task integrationTest(type: Test, dependsOn: []) {
    testClassesDirs = sourceSets.integrationTest.output.classesDirs
    classpath = sourceSets.integrationTest.runtimeClasspath
    useJUnitPlatform()
}

source: https://docs.gradle.org/current/userguide/java_testing.html#sec:configuring_java_integration_tests




回答2:


First, create source set and configuration:

sourceSets {
    create("intTest") {
        compileClasspath += sourceSets.main.get().output
        runtimeClasspath += sourceSets.main.get().output
    }
}

val intTestImplementation: Configuration by configurations.getting {
    extendsFrom(configurations.implementation.get())
}

val intTestRuntimeOnly: Configuration by configurations.getting {
    extendsFrom(configurations.runtimeOnly.get())
}

And then, create the task to run them:

val integrationTest = task<Test>("integrationTest") {
    description = "Runs integration tests"
    group = "verification"

    testClassesDirs = sourceSets["intTest"].output.classesDirs
    classpath = sourceSets["intTest"].runtimeClasspath
    shouldRunAfter("test")
}

Also, you can add dependencies to be used by the new source set. For instance:

intTestImplementation("org.junit.jupiter:junit-jupiter-api:$junitVersion")
intTestRuntimeOnly("org.junit.jupiter:junit-jupiter-engine:$junitVersion")


来源:https://stackoverflow.com/questions/52074532/adding-integration-tests-to-kotlin-project-using-the-kotlin-gradle-dsl

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!