Come eseguire solo una classe di test locale su Gradle


430

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.


Date le risposte, dovrebbe essere chiaro che si tratta di test locali , non di test strumentati . Android / Gradle rende le cose confuse chiamando questi test locali "test unitari".
tir38,

Risposte:


562

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' --testsargomento non sarà supportato e otterrai un errore.


l'approccio del filtro potrebbe probabilmente anche essere combinato con le regole Task per una comoda selezione di test
Matt Whipple

Per le suite di test di grandi dimensioni, anche se si utilizza --testsper 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ù.
arntg

185

Puoi farlo gradle -Dtest.single=ClassUnderTestTest testse vuoi testare una singola classe o usare regexp come gradle -Dtest.single=ClassName*Test testpuoi trovare altri esempi di classi di filtro per i test nella sezione 23.12 di questo link . Test.


30
Le versioni recenti (a partire dalla 1.10 o giù di lì) supportano --testsun'opzione della riga di comando, che è impostata per sostituire -DtestTaskName.single.
Peter Niederwieser,

58
Con l' --testopzione 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 someMethodall'interno della tua MyTestclasse. 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.
Jeff French,

10
Vale anche la pena notare che se si desidera eseguire un singolo test in un progetto multi-modulo, il comando è gradle -D:submodule:test.single=ClassUnderTestTest :submodule:test. Vedi questa discussione su gradle.org
Bulat

2
È inoltre possibile utilizzare --no-rebuildun'opzione, ad esempio gradle -D:submodule:test.single=ClassUnderTestTest --no-rebuild :submodule:testper impedire la ricostruzione delle dipendenze e, a sua volta, per eseguire quel singolo test più rapidamente.
falconepl,

2
Questa opzione è deprecata nel Gradle 5
Eyal

108

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.


1
O semplicemente./gradlew :b-module:test --tests testToRun
Ahmed Ashour,

32

Dopo aver capito molto, il seguente ha funzionato per me:

gradle test --tests "a.b.c.MyTestFile.mySingleTest"


11
questo comando non funziona per me. > Errore: opzione della riga di comando sconosciuta "--test"
Tarkik,

31

Nota che l' --testsopzione 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. testProdReleaseUnitTestAnziché solo test)


6
Sono corso in questa situazione esatta Grazie!
JPM,

Puoi elaborare un esempio completo? Sto cercando di eseguire 3 test che corrispondono a un carattere jolly utilizzando ./gradlew test --tests *testMyCollectionTake*e non riesco a dire come devo sostituire testcon il nome del test jolly
DanielCuadra

4

Di seguito è riportato il comando per eseguire una singola classe di test utilizzando l' gradlewopzione 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.TestClasscon la variante Variant_1:

gradlew.bat ConnectedVariant_1AndroidTest -Pandroid.testInstrumentationRunnerArguments.class=com.example.TestClass 

2

Dovresti provare ad aggiungere asteriks (*) alla fine.

gradle test --tests "com.abc *"


2

Esegui un singolo test chiamato MyTest:

./gradlew app:testDebug --tests=com.example.MyTest

0

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

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.