Zajęło mi to trochę czasu, a zasoby internetowe nie były świetne. Dlatego chciałem udokumentować moje rozwiązanie.
To jest prosty skrypt budujący gradle, który oprócz głównego i testowego zestawu źródłowego ma ustawione źródło intTest:
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
w pełnej dystrybucji Gradle znajduje się próbka.Oto jak to osiągnąłem bez użycia
configurations{ }
.Przetestowano przy użyciu: Gradle 1.4 i Gradle 1.6
źródło
java { srcDir 'src/integrationtest/java' } resources { srcDir 'src/integrationtest/resources' }
nie jest istotne, ponieważ to właśnie redeclaressrc/<sourceSetName>/...
dosrc/integrationtest/...
: tu: zmiana T kapitał do niższej tcompileClasspath += sourceSets.main.runtimeClasspath
łączy dwa zestawy plików. Nie ma zwykłego rozwiązywania konfliktów dla zależności. Możesz otrzymać dwie wersje tej samej biblioteki. Pomoże w tym rozszerzenie konfiguracji.Podsumowując obie stare odpowiedzi (uzyskaj najlepszą i minimalną wykonalność obu światów):
najpierw kilka ciepłych słów:
najpierw musimy zdefiniować
sourceSet
:następnie rozwijamy
sourceSet
fromtest
, dlatego używamytest.runtimeClasspath
(który zawiera wszystkie zależności od samegotest
ANDtest
) jako ścieżki klas dla wyprowadzonychsourceSet
:sourceSets.integrationTest.runtimeClasspath
jest potrzebna, ale powinna być nieistotna, ponieważruntimeClasspath
zawsze się rozwijaoutput + runtimeSourceSet
, nie otrzymuj tegodefiniujemy dedykowane zadanie do przeprowadzenia samych testów integracyjnych:
Skonfiguruj
integrationTest
klasy testowe i ścieżki klas. Wartości domyślne zjava
wtyczki używają rozszerzeniatest
sourceSet
(opcjonalnie) automatyczne uruchamianie po teście
(opcjonalnie) dodaj zależność od
check
(więc zawsze działa, gdybuild
lubcheck
są wykonywane)(opcjonalnie) dodaj java, zasoby do
sourceSet
obsługi automatycznego wykrywania i utwórz te „częściowe” w swoim IDE. tzn. IntelliJ IDEA automatycznie utworzysourceSet
katalogi java i zasoby dla każdego zestawu, jeśli nie istnieje:tl; dr
odwołujący się do:
Niestety, przykładowy kod na github.com/gradle/gradle/subprojects/docs/src/samples/java/customizedLayout/build.gradle lub … / gradle /… / withIntegrationTests / build.gradle wydaje się nie obsługiwać tego lub ma inny / bardziej złożone / dla mnie i tak nie ma jaśniejszego rozwiązania!
źródło
compileTestJava
classesDir
został przeniesionyclassesDirs
na gradle 5Mgławica-aspekt wtyczki eliminuje boilerplate:
W szczególności w przypadku testów integracyjnych, nawet jeśli jest to zrobione za Ciebie , po prostu zastosuj:
Linki do portalu wtyczek Gradle dla każdego z nich to:
źródło
Jeśli używasz
Aby IntelliJ rozpoznał niestandardowy zestaw źródeł jako root źródeł testowych:
źródło
Oto, co działa dla mnie od wersji Gradle 4.0.
Począwszy od wersji 4.0, Gradle używa teraz oddzielnych katalogów klas dla każdego języka w zestawie źródłowym. Jeśli więc Twój skrypt kompilacji używa
sourceSets.integrationTest.output.classesDir
, zobaczysz następujące ostrzeżenie o wycofaniu.Aby pozbyć się tego ostrzeżenia, po prostu przełącz się na
sourceSets.integrationTest.output.classesDirs
. Aby uzyskać więcej informacji, zobacz informacje o wersji Gradle 4.0 .źródło
Jestem nowy w Gradle, używam Gradle 6.0.1 JUnit 4.12. Oto, co wymyśliłem, aby rozwiązać ten problem.
Zauważ, że główne źródło i źródło testowe są przywoływane osobno, jedno poniżej
main
i jedno poniżejtest
.testImplementation
Pod pozdependencies
służy tylko za zebranie źródło wtest
. Jeśli twój główny kod faktycznie miał zależność od JUnit, możesz również określićimplementation
poniżejdependencies
.Musiałem określić
repositories
sekcję, aby to zadziałało, wątpię, czy jest to najlepszy / jedyny sposób.źródło