Ich habe eine Weile gebraucht, um das herauszufinden, und die Online-Ressourcen waren nicht großartig. Also wollte ich meine Lösung dokumentieren.
Dies ist ein einfaches Gradle-Build-Skript, das zusätzlich zu den Haupt- und Testquellensätzen einen intTest-Quellensatz 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
}
java/withIntegrationTests
Beispiel in der vollständigen Gradle-Verteilung.Hier ist, wie ich dies ohne Verwendung erreicht habe
configurations{ }
.Getestet mit: Gradle 1.4 und Gradle 1.6
quelle
java { srcDir 'src/integrationtest/java' } resources { srcDir 'src/integrationtest/resources' }
da es nicht relevant ist nur redeclaressrc/<sourceSetName>/...
zusrc/integrationtest/...
: hier: die Hauptstadt T auf einen niedrigeren t änderncompileClasspath += sourceSets.main.runtimeClasspath
kombiniert zwei Sätze von Dateien. Es gibt keine übliche Konfliktlösung für Abhängigkeiten. Sie können mit zwei Versionen derselben Bibliothek enden. Das Erweitern von Konfigurationen hilft dabei.Um beide alten Antworten zusammenzufassen (beste und minimale Lebensfähigkeit beider Welten):
zuerst ein paar warme worte:
Zuerst müssen wir Folgendes definieren
sourceSet
:Als nächstes erweitern wir das
sourceSet
fromtest
, daher verwenden wir dastest.runtimeClasspath
(das alle Abhängigkeiten vontest
ANDtest
selbst enthält) als Klassenpfad für das abgeleitetesourceSet
:sourceSets.integrationTest.runtimeClasspath
benötigt, sollte aber irrelevant sein, da sieruntimeClasspath
immer erweitert wirdoutput + runtimeSourceSet
, verstehe sie nichtWir definieren eine spezielle Aufgabe, um nur Integrationstests auszuführen:
Konfigurieren Sie die
integrationTest
verwendeten Testklassen und Klassenpfade. Die Standardeinstellungen desjava
Plugins verwenden dietest
sourceSet
(optional) Nach dem Test automatisch ausführen
(optional) Abhängigkeit hinzufügen von
check
(damit es immer ausgeführt wird, wennbuild
odercheck
ausgeführt wird)(optional) Fügen Sie Java hinzu, um die
sourceSet
automatische Erkennung zu unterstützen, und erstellen Sie diese "Partials" in Ihrer IDE. dh IntelliJ IDEA erstellt automatischsourceSet
Verzeichnisse Java und Ressourcen für jeden Satz, wenn es nicht existiert:tl; dr
in Bezug auf:
Leider scheint der Beispielcode auf github.com/gradle/gradle/subprojects/docs/src/samples/java/customizedLayout/build.gradle oder … / gradle /… / withIntegrationTests / build.gradle dies nicht zu handhaben oder hat einen anderen / komplexer / für mich sowieso keine klarere Lösung!
quelle
compileTestJava
classesDir
wurdeclassesDirs
auf Gradle 5Das Nebula-Facetten- Plugin eliminiert die Boilerplate:
Für Integrationstests, auch wenn dies für Sie erledigt wird , wenden Sie einfach Folgendes an:
Die Links zum Gradle-Plugin-Portal für jedes sind:
quelle
Wenn Sie verwenden
So erhalten Sie, dass IntelliJ ein benutzerdefiniertes Quellenset als Testquellenstamm erkennt:
quelle
Folgendes funktioniert für mich ab Gradle 4.0.
Ab Version 4.0 verwendet Gradle jetzt separate Klassenverzeichnisse für jede Sprache in einem Quellensatz. Wenn Ihr Build-Skript also verwendet
sourceSets.integrationTest.output.classesDir
, wird die folgende Warnung zur Ablehnung angezeigt.Um diese Warnung zu entfernen, wechseln Sie
sourceSets.integrationTest.output.classesDirs
stattdessen zu. Weitere Informationen finden Sie in den Versionshinweisen zu Gradle 4.0 .quelle
Ich bin neu in Gradle und verwende Gradle 6.0.1 JUnit 4.12. Folgendes habe ich mir ausgedacht, um dieses Problem zu lösen.
Beachten Sie, dass auf die Hauptquelle und die Testquelle separat verwiesen wird, eine unter
main
und eine untertest
.Das
testImplementation
Element unterdependencies
wird nur zum Kompilieren der Quelle in verwendettest
. Wenn Ihr Hauptcode tatsächlich eine Abhängigkeit von JUnit hätte, würden Sie auchimplementation
unter angebendependencies
.Ich musste den
repositories
Abschnitt angeben , damit dies funktioniert. Ich bezweifle, dass dies der beste / einzige Weg ist.quelle