2012-07-20 14 views
61

Voglio aggiungere test di integrazione alla mia build Gradle (Versione 1.0). Dovrebbero essere eseguiti separatamente dai miei test normali perché richiedono l'implementazione di una webapp su localhost (testano tale webapp). I test dovrebbero essere in grado di utilizzare le classi definite nel mio set sorgente principale. Come faccio a far succedere questo?Come si aggiunge un nuovo gruppo di fonti a Gradle?

risposta

87

Questo mi ci è voluto un po 'per capire e le risorse online non erano grandi. Quindi volevo documentare la mia soluzione.

Questo è un semplice script di build Gradle che ha una fonte intTest impostato in aggiunta alle principali e fonte di prova set:

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 
} 
+5

È ancora necessario dichiarare e configurare un'attività di test di integrazione. In termini di documentazione, c'è un campione 'java/withIntegrationTests' nella distribuzione Gradle completa. –

+0

Grazie @PeterNiederwieser Ho corretto il mio script di compilazione di esempio. – Spina

+2

Stavo cercando di fare anche questo ... grazie mille per aver postato la soluzione :) –

26

Ecco come ho raggiunto questo senza usare configurations{ }.

apply plugin: 'java' 

sourceCompatibility = JavaVersion.VERSION_1_6 

sourceSets { 
    integrationTest { 
     java { 
      srcDir 'src/integrationtest/java' 
     } 
     resources { 
      srcDir 'src/integrationtest/resources' 
     } 
     compileClasspath += sourceSets.main.runtimeClasspath 
    } 
} 

task integrationTest(type: Test) { 
    description = "Runs Integration Tests" 
    testClassesDir = sourceSets.integrationTest.output.classesDir 
    classpath += sourceSets.integrationTest.runtimeClasspath 
} 

testata utilizzando: Gradle 1.4 e Gradle 1,6

+2

Grazie per aver condiviso! È bello vedere implementazioni alternative. – Spina

+1

mentre 'java { srcdir 'src/integrationtest/java' } risorse { srcdir 'src/integrationtest/risorse }' non è rilevante in quanto redeclares solo 'src//...' a 'src/integrationtest/...': qui: cambia la capitale T in una t più bassa –

9

Per riassumere entrambe le vecchie risposte (ottenere migliori e minima vitale di entrambi i mondi):

alcune parole calde prima:

  1. Per prima cosa, è necessario definire il set di origine:

     
    sourceSets { 
        integrationTest 
    } 
    

  2. successivo abbiamo ampliare la sourceSet da test Perciò usiamo il runtimeClasspath prova (che comprende tutte le dipendenze da prova e prova stessa) come classpath per il derivato sourceSet

     
    sourceSets { 
        integrationTest { 
         compileClasspath += sourceSets.test.runtimeClasspath 
         runtimeClasspath += sourceSets.test.runtimeClasspath // ***) 
        } 
    } 
    

    • *** nota) in qualche modo questo ridichiarazione/estendono per sourceSets.integrationTest.runtimeClasspath è necessaria, ma dovrebbe essere irrilevante, in quanto si espande sempre runtimeClasspath output + runtimeSourceSet, non farlo
  3. definiamo un compito dedicato per l'esecuzione di test di integrazione solo

     
    task integrationTest(type: Test) { 
    } 
    

  4. raccontano il lavoro di prova, che le classi di test e percorsi di classe devono essere utilizzati al posto dei valori predefiniti da sourceset "test"

     
    task integrationTest(type: Test) { 
        testClassesDir = sourceSets.integrationTest.output.classesDir 
        classpath = sourceSets.integrationTest.runtimeClasspath 
    } 
    

  5. (opzionale) run automatico dopo prova

     
    integrationTest.dependsOn test 
    

  6. (facoltativo) esecuzione automatica con controllo

     
    check.dependsOn integrationTest 
    

  7. (facoltativo) aggiungere java, risorse al set origine per consentire il rilevamento automatico e creare questi "parziali" nel proprio IDE. cioèIntelliJ IDEA si auto creare directory sourceSet java e le risorse per ogni set, se non esiste

     
    sourceSets { 
        integrationTest { 
         java 
         resources 
        } 
    } 
    

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 

     compileClasspath += sourceSets.test.runtimeClasspath 
     // somehow this redeclaration is needed, but should be irrelevant 
     // since runtimeClasspath always expands compileClasspath 
     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 

riferimento a:

purtroppo, il codice di esempio su github.com/gradle/gradle/subprojects/docs/src/samples/java/customizedLayout/build.gradle o …/gradle/…/withIntegrationTests/build.gradle sembra non gestire questo o ha una per me soluzione diversa/più complessa/no chiaro comunque!

+1

(!) come risulta, l'uso singolo dei miglioramenti di sourceSet senza configurazioni o output genera un errore nell'idea dopo l'apertura iniziale di un progetto. la dipendenza di compilazione (qui: test) per il nuovo "modulo" (qui: integrationTest) non è disponibile al primo 'compileTestJava' –

0

Ecco cosa funziona per me a partire da Gradle 4.0.

sourceSets { 
    integrationTest { 
    compileClasspath += sourceSets.test.compileClasspath 
    runtimeClasspath += sourceSets.test.runtimeClasspath 
    } 
} 

task integrationTest(type: Test) { 
    description = "Runs the integration tests." 
    group = 'verification' 
    testClassesDirs = sourceSets.integrationTest.output.classesDirs 
    classpath = sourceSets.integrationTest.runtimeClasspath 
} 

A partire dalla versione 4.0, Gradle ora utilizza le directory di classi separate per ogni lingua in un set di origini. Pertanto, se lo script di build utilizza sourceSets.integrationTest.output.classesDir, verrà visualizzato il seguente avviso di ritiro.

Gradle ora utilizza directory di output separate per ogni linguaggio JVM, ma questa build presuppone una singola directory per tutte le classi da un set di origini. Questo comportamento è stato deprecato e pianificato per essere rimosso in Gradle 5.0

Per eliminare questo avviso, passare invece a sourceSets.integrationTest.output.classesDirs. Per ulteriori informazioni, vedere Gradle 4.0 release notes.

Problemi correlati