Cela m'a pris du temps à comprendre et les ressources en ligne n'étaient pas géniales. J'ai donc voulu documenter ma solution.
Il s'agit d'un simple script de construction gradle qui a un ensemble de sources intTest en plus des ensembles de sources principal et de test:
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
échantillon dans la distribution Gradle complète.Voici comment j'ai réalisé cela sans utiliser
configurations{ }
.Testé avec: Gradle 1.4 et Gradle 1.6
la source
java { srcDir 'src/integrationtest/java' } resources { srcDir 'src/integrationtest/resources' }
n'est pas pertinent car il se redéclare simplementsrc/<sourceSetName>/...
àsrc/integrationtest/...
: ici: changer le T majuscule en un t inférieurcompileClasspath += sourceSets.main.runtimeClasspath
combine deux ensembles de fichiers. Il n'y a pas de résolution de conflit habituelle pour les dépendances. Vous pouvez vous retrouver avec deux versions de la même bibliothèque. L'extension des configurations aidera à cela.Pour résumer les deux anciennes réponses (obtenir le meilleur et le minimum viable des deux mondes):
quelques mots chaleureux d'abord:
tout d'abord, nous devons définir le
sourceSet
:Ensuite, nous développons le
sourceSet
fromtest
, donc nous utilisons letest.runtimeClasspath
(qui inclut toutes les dépendances detest
ANDtest
lui - même) comme chemin de classe pour le dérivésourceSet
:sourceSets.integrationTest.runtimeClasspath
est nécessaire, mais ne devrait pas être pertinente car seruntimeClasspath
développe toujoursoutput + runtimeSourceSet
, ne l'obtenez pasnous définissons une tâche dédiée pour simplement exécuter des tests d'intégration:
Configurez les
integrationTest
classes de test et les chemins de classe utilisés. Les valeurs par défaut dujava
plugin utilisent letest
sourceSet
(optionnel) exécution automatique après test
(facultatif) ajouter une dépendance de
check
(donc il s'exécute toujours quandbuild
oucheck
est exécuté)(facultatif) ajoutez java, des ressources au
sourceSet
pour prendre en charge la détection automatique et créez ces "partiels" dans votre IDE. ie IntelliJ IDEA créera automatiquement dessourceSet
répertoires java et des ressources pour chaque ensemble s'il n'existe pas:tl; dr
se référant à:
Malheureusement, l'exemple de code sur github.com/gradle/gradle/subprojects/docs/src/samples/java/customizedLayout/build.gradle ou … / gradle /… / withIntegrationTests / build.gradle ne semble pas gérer cela ou en a un autre / plus complexe / pour moi pas de solution plus claire de toute façon!
la source
compileTestJava
classesDir
a été migré versclassesDirs
le grade 5Le plugin nebula-facet élimine le passe-partout:
Pour les tests d'intégration en particulier, même cela est fait pour vous , il suffit d'appliquer:
Les liens du portail du plugin Gradle pour chacun sont:
la source
Si vous utilisez
Pour qu'IntelliJ reconnaisse l'ensemble de sources personnalisé en tant que racine des sources de test:
la source
Voici ce qui fonctionne pour moi à partir de Gradle 4.0.
Depuis la version 4.0, Gradle utilise désormais des répertoires de classes séparés pour chaque langue d'un ensemble source. Donc, si votre script de construction utilise
sourceSets.integrationTest.output.classesDir
, vous verrez l'avertissement de désapprobation suivant.Pour vous débarrasser de cet avertissement, passez simplement à
sourceSets.integrationTest.output.classesDirs
. Pour plus d'informations, consultez les notes de publication de Gradle 4.0 .la source
Je suis nouveau sur Gradle, en utilisant Gradle 6.0.1 JUnit 4.12. Voici ce que j'ai proposé pour résoudre ce problème.
Notez que la source principale et la source de test sont référencées séparément, une sous
main
et une soustest
.L'
testImplementation
élément ci-dessousdependencies
est uniquement utilisé pour compiler la source danstest
. Si votre code principal avait en fait une dépendance sur JUnit, vous devez également spécifierimplementation
sousdependencies
.J'ai dû spécifier la
repositories
section pour que cela fonctionne, je doute que ce soit le meilleur / le seul moyen.la source