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
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
}
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
Grazie per aver condiviso! È bello vedere implementazioni alternative. – Spina
mentre 'java { srcdir 'src/integrationtest/java' } risorse { srcdir 'src/integrationtest/risorse }' non è rilevante in quanto redeclares solo 'src/
Per riassumere entrambe le vecchie risposte (ottenere migliori e minima vitale di entrambi i mondi):
alcune parole calde prima:
Per prima cosa, è necessario definire il set di origine:
sourceSets { integrationTest }
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
- *** nota) in qualche modo questo ridichiarazione/estendono per sourceSets.integrationTest.runtimeClasspath è necessaria, ma dovrebbe essere irrilevante, in quanto si espande sempre runtimeClasspath
definiamo un compito dedicato per l'esecuzione di test di integrazione solo
task integrationTest(type: Test) { }
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 }
(opzionale) run automatico dopo prova
integrationTest.dependsOn test
(facoltativo) esecuzione automatica con controllo
check.dependsOn integrationTest
(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:
- gradle java chapter 45.7.1. Source set properties
- gradle java chapter 45.7.3. Some source set examples
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!
(!) 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' –
Il nebula-facet plug-in elimina il boilerplate:
apply plugin: 'nebula.facet'
facets {
integrationTest {
parentSourceSet = 'test'
}
}
Per i test di integrazione specificamente, anche this is done for you, si applicano solo:
apply plugin: 'nebula.integtest'
I Gradle link del portale plug-in per ogni sono:
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.
- 1. Come si aggiunge un nuovo articolo a un plist?
- 2. ASP.NET di Windows provider di ruoli (AspNetWindowsTokenRoleProvider) non accorgersi di un utente che si aggiunge a un nuovo gruppo
- 3. Come si aggiunge un progetto a CruiseControl.NET?
- 4. Come si aggiunge un tipo di documento a un XDocument?
- 5. Come si aggiunge un JToken a un JObject?
- 6. Come si aggiunge GPUImage a un progetto iOS?
- 7. Come si aggiunge una barra di scorrimento a un div?
- 8. Come si aggiunge un riferimento all'assembly a livello di codice?
- 9. Come si aggiunge un valore arbitrario a un riepilogo TensorFlow?
- 10. Come si aggiunge un elenco a un file in vim?
- 11. Come si aggiunge un commento a un criterio JSON IAM?
- 12. blender - come si aggiunge un colore a un oggetto?
- 13. Come si aggiunge un metodo personalizzato a un servizio Restangular?
- 14. Come si aggiunge un EditText a un DialogFragment?
- 15. Come si aggiunge qualcosa come "? X = 123" a un NSURL?
- 16. Come si aggiunge un'estensione subjectNameAlt a X509_REQ?
- 17. Come si aggiunge UIButton a UIToolBar a livello di programmazione?
- 18. Come si aggiunge il testo multilinea a un UIButton?
- 19. Come si aggiunge una funzione a un elemento tramite jQuery?
- 20. Come si aggiunge una classe a un @ Html.ActionLink?
- 21. Come si aggiunge un allegato a un'e-mail tramite System.Net.Mail?
- 22. Come si aggiunge un carattere a una stringa in OCaml?
- 23. Come si aggiunge una classe a un marker Leaflet?
- 24. Come si aggiunge un titolo a Seaborn Heatmap?
- 25. Come si aggiunge browserify a un progetto yeoman?
- 26. Come si aggiunge una classe a un widget Dojo?
- 27. Come si aggiunge un int a una stringa in C++?
- 28. Come si aggiunge il controllo ortografico a un JTextArea?
- 29. come si aggiunge un'immagine a un suggerimento jquery
- 30. Come si aggiunge un evento .click() a un'immagine?
È ancora necessario dichiarare e configurare un'attività di test di integrazione. In termini di documentazione, c'è un campione 'java/withIntegrationTests' nella distribuzione Gradle completa. –
Grazie @PeterNiederwieser Ho corretto il mio script di compilazione di esempio. – Spina
Stavo cercando di fare anche questo ... grazie mille per aver postato la soluzione :) –