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?
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
}
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
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:
zuerst müssen wir die sourceSet
definieren:
sourceSets {
integrationTest
}
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 // ***)
}
}
sourceSets.integrationTest.runtimeClasspath
benötigt, sollte aber irrelevant sein, da runtimeClasspath
output + runtimeSourceSet
immer erweitert, nicht verstehenwir definieren eine spezielle Aufgabe für die Ausführung von Integrationstests:
task integrationTest(type: Test) {
}
Konfigurieren Sie die verwendeten integrationTest
Testklassen und Klassenpfade. Die Standardeinstellungen des Java
-Plugins verwenden die test
sourceSet
task integrationTest(type: Test) {
testClassesDir = sourceSets.integrationTest.output.classesDir
classpath = sourceSets.integrationTest.runtimeClasspath
}
(optional) automatischer Lauf nach test
integrationTest.dependsOn test
(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)
(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!
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:
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 .
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
}
}