Comment append un nouveau jeu de sources à Gradle?

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:

  1. Tout d’abord, nous devons définir le sourceSet:

     sourceSets {
         test d'intégration
     }
    

  2. 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 // ***)
         }
     }
    

    • *** note) en quelque sorte cette redéclaration / extension pour sourceSets.integrationTest.runtimeClasspath est nécessaire, mais ne devrait pas être pertinente puisque runtimeClasspath développe toujours la output + runtimeSourceSet , ne l’obtenez pas
  3. nous définissons une tâche dédiée pour simplement exécuter des tests d’intégration

     task integrationTest (type: Test) {
     }
    

  4. 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
     }
    

  5. (facultatif) exécution automatique après le test

     Test de integrationTest.dependsOn
    

  6. (facultatif) exécution automatique avec vérification

     check.dependsOn integrationTest
    

  7. (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 à:

  • gradle java chapitre 45.7.1. Propriétés du groupe source
  • gradle java chapitre 45.7.3. Quelques exemples de jeux de sources

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:

  1. nebula.facet
  2. nebula.integtest

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 .