Sono nuovo di Gradle. Uso Gradle 1.10 e Ubuntu 13.
Voglio sapere se esiste un comando per eseguire solo una classe di test locale , simile a "testonly" in SBT.
Sono nuovo di Gradle. Uso Gradle 1.10 e Ubuntu 13.
Voglio sapere se esiste un comando per eseguire solo una classe di test locale , simile a "testonly" in SBT.
Risposte:
Per eseguire una singola classe di test, la risposta di Airborn è buona.
Con l'utilizzo di alcune opzioni della riga di comando, che trovi qui , puoi semplicemente fare qualcosa del genere.
gradle test --tests org.gradle.SomeTest.someSpecificFeature
gradle test --tests *SomeTest.someSpecificFeature
gradle test --tests *SomeSpecificTest
gradle test --tests all.in.specific.package*
gradle test --tests *IntegTest
gradle test --tests *IntegTest*ui*
gradle test --tests *IntegTest.singleMethod
gradle someTestTask --tests *UiTest someOtherTestTask --tests *WebTest*ui
Dalla versione 1.10 di Gradle supporta la selezione dei test, utilizzando un filtro di test . Per esempio,
apply plugin: 'java'
test {
filter {
//specific test method
includeTestsMatching "org.gradle.SomeTest.someSpecificFeature"
//specific test method, use wildcard for packages
includeTestsMatching "*SomeTest.someSpecificFeature"
//specific test class
includeTestsMatching "org.gradle.SomeTest"
//specific test class, wildcard for packages
includeTestsMatching "*.SomeTest"
//all classes in package, recursively
includeTestsMatching "com.gradle.tooling.*"
//all integration tests, by naming convention
includeTestsMatching "*IntegTest"
//only ui tests from integration tests, by some naming convention
includeTestsMatching "*IntegTest*ui"
}
}
Per ambienti multi-sapore (un caso d'uso comune per Android), controlla questa risposta , poiché l' --tests
argomento non sarà supportato e otterrai un errore.
--tests
per chiamare un singolo metodo di test all'interno della classe, si osserva l'iterazione su tutte le classi, anche su tutte quelle non in esecuzione, il che è troppo lento. Non so se quella lentezza è dovuta al nostro ambiente o se avrebbe un impatto sugli altri. Può aggiornare se ne trovi di più.
Puoi farlo gradle -Dtest.single=ClassUnderTestTest test
se vuoi testare una singola classe o usare regexp come gradle -Dtest.single=ClassName*Test test
puoi trovare altri esempi di classi di filtro per i test nella sezione 23.12 di questo link . Test.
--tests
un'opzione della riga di comando, che è impostata per sostituire -DtestTaskName.single
.
--test
opzione puoi anche limitare i test a un singolo metodo all'interno della tua classe di test. Ad esempio: gradle test --tests *MyTest.someMethod
eseguirà solo il singolo test someMethod
all'interno della tua MyTest
classe. Mentre sto costruendo un caso di test, in genere eseguo un singolo metodo alla volta per rendere più semplice concentrarmi solo sull'output di cui ho bisogno per eseguire il debug, quindi eseguire l'intero test alla fine.
gradle -D:submodule:test.single=ClassUnderTestTest :submodule:test
. Vedi questa discussione su gradle.org
--no-rebuild
un'opzione, ad esempio gradle -D:submodule:test.single=ClassUnderTestTest --no-rebuild :submodule:test
per impedire la ricostruzione delle dipendenze e, a sua volta, per eseguire quel singolo test più rapidamente.
Nel caso abbiate un progetto multi-modulo:
diciamo che la struttura del tuo modulo è
root-module
-> a-module
-> b-module
e il test (testToRun) che stai cercando di eseguire è in b-module, con percorso completo: com.xyz.b.module.TestClass.testToRun
Come qui sei interessato ad eseguire il test in b-module, quindi dovresti vedere le attività disponibili per b-module.
./gradlew :b-module:tasks
Il comando sopra elencherà tutte le attività nel modulo b con la descrizione. E nel caso ideale, avrai un compito chiamato test per eseguire i test unitari in quel modulo.
./gradlew :b-module:test
Ora, hai raggiunto il punto per eseguire tutti i test in b-module, infine puoi passare un parametro all'attività sopra per eseguire test che corrispondono al determinato modello di percorso
./gradlew :b-module:test --tests "com.xyz.b.module.TestClass.testToRun"
Ora, invece di questo, se corri
./gradlew test --tests "com.xyz.b.module.TestClass.testToRun"
Eseguirà l'attività di test per entrambi i moduli aeb, il che potrebbe comportare un errore in quanto non esiste nulla che corrisponda al modello precedente in un modulo.
./gradlew :b-module:test --tests testToRun
Dopo aver capito molto, il seguente ha funzionato per me:
gradle test --tests "a.b.c.MyTestFile.mySingleTest"
Nota che l' --tests
opzione potrebbe non funzionare se hai build diverse types/flavors
(non riesce con Unknown command-line option '--tests'
). In questo caso, è necessario specificare l'attività di test specifica (ad es. testProdReleaseUnitTest
Anziché solo test
)
./gradlew test --tests *testMyCollectionTake*
e non riesco a dire come devo sostituire test
con il nome del test jolly
Di seguito è riportato il comando per eseguire una singola classe di test utilizzando l' gradlew
opzione della riga di comando:
gradlew.bat Connected**your bundleVariant**AndroidTest -Pandroid.testInstrumentationRunnerArguments.class=com.example.TestClass
Di seguito l'esempio per eseguire la classe com.example.TestClass
con la variante Variant_1
:
gradlew.bat ConnectedVariant_1AndroidTest -Pandroid.testInstrumentationRunnerArguments.class=com.example.TestClass
Nel mio caso, gli avvisi del mio compilatore java di eclipse erano impostati troppo alti e eclipse non riconosceva la mia classe valida per l'esecuzione. L'aggiornamento delle impostazioni del mio compilatore ha risolto il problema. Puoi leggere di più qui: annotazione-nonnull-impossibile-essere-risolto