Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Adding integration tests to Kotlin project using the Kotlin Gradle DSL

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

like image 541
cdc Avatar asked Aug 29 '18 09:08

cdc


1 Answers

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")
like image 152
Héctor Avatar answered Jan 03 '23 23:01

Héctor