web-dev-qa-db-de.com

Wie füge ich ein neues Quellenset zu Gradle hinzu?

Ich möchte meinem Gradle-Build (Version 1.0) Integrationstests hinzufügen. Sie sollten getrennt von meinen normalen Tests ausgeführt werden, da sie eine Webapp auf localhost implementieren müssen (sie testen diese Webapp). Die Tests sollten in der Lage sein, Klassen zu verwenden, die in meinem Hauptquellensatz definiert sind. Wie mache ich das?

75
Spina

Ich habe eine Weile gebraucht, um herauszufinden, und die Online-Ressourcen waren nicht so toll. Also wollte ich meine Lösung dokumentieren.

Dies ist ein einfaches Gradle-Build-Skript, das zusätzlich zu den Haupt- und Testquellgruppen eine intTest-Quellgruppe enthält:

apply plugin: "Java"

sourceSets {
    // Note that just declaring this sourceset creates two configurations.
    intTest {
        Java {
            compileClasspath += main.output
            runtimeClasspath += main.output
        }
    }
}

configurations {
    intTestCompile.extendsFrom testCompile
    intTestRuntime.extendsFrom testRuntime
}

task intTest(type:Test){
    description = "Run integration tests (located in src/intTest/...)."
    testClassesDir = project.sourceSets.intTest.output.classesDir
    classpath = project.sourceSets.intTest.runtimeClasspath
}
93
Spina

So habe ich das ohne configurations{ } erreicht.

apply plugin: 'Java'

sourceCompatibility = JavaVersion.VERSION_1_6

sourceSets {
    integrationTest {
        Java {
            srcDir 'src/integrationtest/Java'
        }
        resources {
            srcDir 'src/integrationtest/resources'
        }
        compileClasspath += sourceSets.main.runtimeClasspath
    }
}

task integrationTest(type: Test) {
    description = "Runs Integration Tests"
    testClassesDir = sourceSets.integrationTest.output.classesDir
    classpath += sourceSets.integrationTest.runtimeClasspath
}

Getestet mit: Gradle 1.4 und Gradle 1.6

28
Mike Rylander

Dies wurde 2016 für Gradle 2.x/3.x geschrieben und ist weit überholt !! Bitte schauen Sie bei den dokumentierten Lösungen in Gradle 4 und höher


Um beide alten Antworten zusammenzufassen (beste und minimal mögliche Werte beider Welten):

einige herzliche worte zuerst:

  1. zuerst müssen wir die sourceSet definieren:

    sourceSets {
        integrationTest
    }
    
  2. als nächstes erweitern wir die sourceSet von test, daher verwenden wir den test.runtimeClasspath (der alle Abhängigkeiten von test UND test selbst enthält) als Klassenpfad für die abgeleitete sourceSet:

    sourceSets {
        integrationTest {
            compileClasspath += sourceSets.test.runtimeClasspath
            runtimeClasspath += sourceSets.test.runtimeClasspath // ***)
        }
    }
    
    • note) Irgendwie wird diese Redeclaration/Erweiterung für sourceSets.integrationTest.runtimeClasspath benötigt, sollte aber irrelevant sein, da runtimeClasspathoutput + runtimeSourceSet immer erweitert, nicht verstehen
  3. wir definieren eine spezielle Aufgabe für die Ausführung von Integrationstests:

    task integrationTest(type: Test) {
    }
    
  4. Konfigurieren Sie die verwendeten integrationTest Testklassen und Klassenpfade. Die Standardeinstellungen des Java-Plugins verwenden die testsourceSet

    task integrationTest(type: Test) {
        testClassesDir = sourceSets.integrationTest.output.classesDir
        classpath = sourceSets.integrationTest.runtimeClasspath
    }
    
  5. (optional) automatischer Lauf nach test 

     integrationTest.dependsOn test 
    

  6. (optional) fügt Abhängigkeit von check hinzu (wird also immer ausgeführt, wenn build oder check ausgeführt werden)

    tasks.check.dependsOn(tasks.integrationTest)
    
  7. (optional) fügt der sourceSet Java-Ressourcen hinzu, um die automatische Erkennung zu unterstützen, und erstellt diese "partials" in Ihrer IDE. Das heißt, IntelliJ IDEA erstellt automatisch sourceSet-Verzeichnisse, Java und Ressourcen für jede Gruppe, falls diese nicht vorhanden ist:

    sourceSets {
         integrationTest {
             Java
             resources
         }
    }
    

tl; dr

apply plugin: 'Java'

// apply the runtimeClasspath from "test" sourceSet to the new one
// to include any needed assets: test, main, test-dependencies and main-dependencies
sourceSets {
    integrationTest {
        // not necessary but Nice for IDEa's
        Java
        resources

        compileClasspath += sourceSets.test.runtimeClasspath
        // somehow this redeclaration is needed, but should be irrelevant
        // since runtimeClasspath always expands compileClasspath
        runtimeClasspath += sourceSets.test.runtimeClasspath
    }
}

// define custom test task for running integration tests
task integrationTest(type: Test) {
    testClassesDir = sourceSets.integrationTest.output.classesDir
    classpath = sourceSets.integrationTest.runtimeClasspath
}
tasks.integrationTest.dependsOn(tasks.test)

in Bezug auf:

Leider ist der Beispielcode in github.com/gradle/gradle/subprojects/docs/src/samples/Java/customizedLayout/build.gradle oder …/gradle/.../withIntegrationTests/build.gradle enthalten scheint damit nicht umzugehen oder hat eine andere/komplexere/für mich ohnehin keine klarere Lösung! 

15
childno͡.de

Das nebula-facet -Plugin macht die Boilerplate überflüssig:

apply plugin: 'nebula.facet'
facets {
    integrationTest {
        parentSourceSet = 'test'
    }
}

Für Integrationstests, insbesondere wird dies für Sie durchgeführt , wenden Sie sich einfach an:

apply plugin: 'nebula.integtest'

Die Links des Gradle-Plugin-Portals sind jeweils:

  1. nebula.facet
  2. nebula.integtest
6
jkschneider

Folgendes funktioniert für mich ab Gradle 4.0.

sourceSets {
  integrationTest {
    compileClasspath += sourceSets.test.compileClasspath
    runtimeClasspath += sourceSets.test.runtimeClasspath
  }
}

task integrationTest(type: Test) {
  description = "Runs the integration tests."
  group = 'verification'
  testClassesDirs = sourceSets.integrationTest.output.classesDirs
  classpath = sourceSets.integrationTest.runtimeClasspath
}

Seit Version 4.0 verwendet Gradle nun für jede Sprache in einem Quellsatz separate Klassenverzeichnisse. Wenn Ihr Build-Skript sourceSets.integrationTest.output.classesDir verwendet, wird die folgende Warnung angezeigt.

Gradle verwendet jetzt separate Ausgabeverzeichnisse für jede JVM-Sprache. Bei diesem Build wird jedoch ein einzelnes Verzeichnis für alle Klassen aus einem Quellsatz vorausgesetzt. Dieses Verhalten ist veraltet und wird voraussichtlich in Gradle 5.0 entfernt

Um diese Warnung zu entfernen, wechseln Sie stattdessen zu sourceSets.integrationTest.output.classesDirs. Weitere Informationen finden Sie in den Versionshinweisen Gradle 4.0 .

1
Ryan Sobol

Wenn du verwendest 

Um IntelliJ dazu zu bringen, benutzerdefinierte Quellensets als Stamm für Testquellen zu erkennen:

plugin {
    idea
}

idea {
    module {
        testSourceDirs = testSourceDirs + sourceSets["intTest"].allJava.srcDirs
        testResourceDirs = testResourceDirs + sourceSets["intTest"].resources.srcDirs
    }
}
1
jenglert