Je souhaite append des tests d’intégration à ma version de Gradle (version 1.0). Ils doivent être exécutés séparément de mes tests normaux car ils nécessitent le déploiement d’une application Web sur localhost (ils testent cette application Web). Les tests doivent pouvoir utiliser les classes définies dans mon ensemble de sources principal. Comment puis-je y arriver?
Cela m’a pris du temps à comprendre et les ressources en ligne n’étaient pas géniales. Je voulais donc documenter ma solution.
Ceci est un simple script de construction graduel qui possède un ensemble de sources intTest en plus des jeux de sources principaux et de test:
apply plugin: "java" sourceSets { // Note that just declaring this sourceset creates two configurations. intTest { java { comstackClasspath += main.output runtimeClasspath += main.output } } } configurations { intTestComstack.extendsFrom testComstack 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 }
Voici comment j’ai réalisé ceci sans utiliser les configurations{ }
.
apply plugin: 'java' sourceCompatibility = JavaVersion.VERSION_1_6 sourceSets { integrationTest { java { srcDir 'src/integrationtest/java' } resources { srcDir 'src/integrationtest/resources' } comstackClasspath += sourceSets.main.runtimeClasspath } } task integrationTest(type: Test) { description = "Runs Integration Tests" testClassesDir = sourceSets.integrationTest.output.classesDir classpath += sourceSets.integrationTest.runtimeClasspath }
Testé en utilisant: Gradle 1.4 et Gradle 1.6
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:
sourceSets { test d'intégration }
Ensuite, nous développons le sourceSet depuis le test, nous utilisons donc le test runtimeClasspath (qui inclut tous les deps de test AND test lui-même) en tant que classpath pour le sourceSet dérivé
sourceSets { test d'intégration { comstackClasspath + = sourceSets.test.runtimeClasspath runtimeClasspath + = sourceSets.test.runtimeClasspath // ***) } }
output + runtimeSourceSet
, ne l’obtenez pas nous définissons une tâche dédiée pour simplement exécuter des tests d’intégration
task integrationTest (type: Test) { }
Dire au job de test quelles classes de test et classPath doivent être utilisées à la place des valeurs par défaut du jeu de sources “test”
task integrationTest (type: Test) { testClassesDir = sourceSets.integrationTest.output.classesDir classpath = sourceSets.integrationTest.runtimeClasspath }
(facultatif) exécution automatique après le test
Test de integrationTest.dependsOn
(facultatif) exécution automatique avec vérification
check.dependsOn integrationTest
(facultatif) append des ressources Java au sourceSet pour permettre la détection automatique et créer ces “partiels” dans votre IDE. Par exemple, IntelliJ IDEA créera automatiquement des répertoires java et des ressources pour chaque ensemble s’il n’existe pas
sourceSets { test d'intégration { Java Ressources } }
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 comstackClasspath += sourceSets.test.runtimeClasspath // somehow this redeclaration is needed, but should be irrelevant // since runtimeClasspath always expands comstackClasspath 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 } integrationTest.dependsOn test
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 a un autre / plus complexe / pour moi pas de solution plus claire quand même!
Le plugin nebula-facet élimine le passe-partout:
apply plugin: 'nebula.facet' facets { integrationTest { parentSourceSet = 'test' } }
Pour les tests d’intégration spécifiquement, même cela est fait pour vous , appliquez simplement:
apply plugin: 'nebula.integtest'
Les liens du portail du plug-in Gradle sont les suivants:
Voici ce qui fonctionne pour moi à partir de Gradle 4.0.
sourceSets { integrationTest { comstackClasspath += sourceSets.test.comstackClasspath runtimeClasspath += sourceSets.test.runtimeClasspath } } task integrationTest(type: Test) { description = "Runs the integration tests." group = 'verification' testClassesDirs = sourceSets.integrationTest.output.classesDirs classpath = sourceSets.integrationTest.runtimeClasspath }
À partir de la version 4.0, Gradle utilise désormais des répertoires de classes distincts pour chaque langue dans un ensemble de sources. Ainsi, si votre script de sourceSets.integrationTest.output.classesDir
utilise sourceSets.integrationTest.output.classesDir
, vous verrez l’avertissement de dépréciation suivant.
Gradle utilise désormais des répertoires de sortie distincts pour chaque langage JVM, mais cette version suppose un seul répertoire pour toutes les classes d’un ensemble source. Ce comportement est obsolète et il est prévu de le supprimer dans Gradle 5.0
Pour vous débarrasser de cet avertissement, basculez simplement vers sourceSets.integrationTest.output.classesDirs
place. Pour plus d’informations, voir les notes de version de Gradle 4.0 .