Perché il test runner Android segnala "Suite di test vuota"?


98

Sto sbattendo la testa contro il muro qui cercando di capire perché IntelliJ / Android segnala "Suite di test vuota". Ho un piccolo progetto con due moduli IntelliJ ("Progetti" in Eclipse). Il modulo di unit test ha il proprio AndroidManifest.xml, che ho incollato in fondo. Sto cercando di eseguire un ActivityUnitTestCase, poiché i test dipenderanno Contextdall'oggetto.

Il nome del pacchetto del modulo principale è nilzor.myapp. Il nome del pacakge del modulo di test ènilzor.myapp.tests

Perché il test runner non rileva il testBlah()metodo come un test?

<?xml version="1.0" encoding="utf-8"?>
<!-- package name must be unique so suffix with "tests" so package loader doesn't ignore us -->
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
          package="nilzor.myapp.tests"
          android:versionCode="1"
          android:versionName="1.0">
    <!-- We add an application tag here just so that we can indicate that
         this package needs to link against the android.test library,
         which is needed when building test cases. -->
    <application>
        <uses-library android:name="android.test.runner"/>
    </application>
    <!--
    This declares that this application uses the instrumentation test runner targeting
    the package of nilzor.myapp.  To run the tests use the command:
    "adb shell am instrument -w nilzor.myapp.tests/android.test.InstrumentationTestRunner"
    -->
    <instrumentation android:name="android.test.InstrumentationTestRunner"
                     android:targetPackage="nilzor.myapp"
                     android:label="Tests for nilzor.myapp"/>
</manifest>

Ed ecco la mia classe di prova :;

package nilzor.myapp.tests;

public class NilzorSomeTest<T extends Activity> extends ActivityUnitTestCase<T>{
    public NilzorSomeTest(Class<T> activityClass){
        super(activityClass);
    }

    @SmallTest
    public void testBlah(){
        assertEquals(1,1);
    }
}

Ho letto i fondamenti dei test , il documento sui test di attività e ho provato a seguire questo blog di test Hello world , anche se è per Eclipse. Non riesco a convincere il test runner a trovare ed eseguire il mio test. Che cosa sto facendo di sbagliato?

Alcune delle domande di cui non sono ancora sicuro sono:

  1. Ho bisogno di un'annotazione sopra il metodo del test unitario?
  2. Devo aggiungere il prefisso "test" al metodo o è solo per i test JUnit?
  3. Posso avere test in sotto-pacchetti di nilzor.myapp.tests?

Ma la domanda principale di questo post è perché il test runner non rileva il mio test ?


Per il punto 3, se stai usando Android Studio ti consiglio il cmd+shift+tcollegamento che creerà automaticamente una classe di test nella posizione del pacchetto corretta che corrisponde alla classe che stai attualmente modificando.
David Argyle Thacker,

Nel caso in cui qualcun altro fosse assente come me. Assicurati di non aver dimenticato di mettere il @Testpennarello sopra il test.
Matt D

Risposte:


70

È necessario fornire un costruttore predefinito per la classe di test, ad esempio:

package nilzor.myapp.tests;

public class NilzorSomeTest extends ActivityUnitTestCase<ActivityYouWantToTest>{
    public NilzorSomeTest(){
        super(ActivityYouWantToTest.class);
    }

    @SmallTest
    public void testBlah(){
        assertEquals(1,1);
    }
}

sulle altre tue domande:

  1. No. I miei test continuano a essere eseguiti senza annotazioni, ma credo che sia una buona pratica averli. Consente di specificare la dimensione dei test da eseguire. Vedi Qual è lo scopo delle annotazioni @SmallTest, @MediumTest e @LargeTest in Android? per maggiori dettagli.

  2. Sì, è necessario il prefisso "test". InteliJ fornisce un avviso "metodo mai usato" quando non c'è il prefisso "test" e salta quel metodo durante l'esecuzione del test.

  3. Sì. Ho i miei test organizzati in sottopacchetti e sembra funzionare bene.


5
Questo non è necessario se utilizzi ActivityTestRule
Yair Kukielka

L'aggiunta del costruttore predefinito ha fatto il lavoro per me.
Dragan Marjanović

54

Se questo accade "all'improvviso" o "ha funzionato 5 minuti fa", la mia soluzione è stata quella di accedere alle configurazioni Esegui / Debug e rimuovere eventuali configurazioni in "Test Android". A volte queste configurazioni vengono danneggiate se eseguo il refactoring della classe sottoposta a test (ad esempio passando a un nuovo pacchetto).

inserisci qui la descrizione dell'immagine


Questo ha funzionato per me. Ho ricevuto un errore della suite di test vuota. Potrebbe essere perché ho aggiunto PowerMockito dopo che la configurazione è stata creata inizialmente.
Ajith Memana,

Ho spesso questo e altri problemi durante l'esecuzione di test in cui le configurazioni di build funzionavano correttamente in precedenza. Sono stato in grado di risolverli adottando questo approccio.
stevehs17

3
Dopo aver eliminato le configurazioni, faccio clic con il pulsante destro del mouse su un pacchetto di prova in Esplora progetti (vista Android) e seleziono Create 'Tests in XXX...- quindi ha funzionato di nuovo
TmTron

9

Nessuno dei precedenti lo ha risolto per me. Ciò che ha aiutato è stato seguire le istruzioni :

Crea una configurazione di prova

In Android Studio:

  • Apri il menu Esegui -> Modifica configurazioni
  • Aggiungi una nuova configurazione dei test Android
  • Scegli un modulo
  • Aggiungi un corridore di strumentazione specifico:

  android.support.test.runner.AndroidJUnitRunner

Esegui la configurazione appena creata.


6

Ho avuto un problema simile. Non sono sicuro del motivo per cui si sta verificando, ma sono riuscito a risolverlo andando su: "File"> "Invalidate Caches / Restart" in Android Studio.


Questo mi ha risolto quando ho ricevuto lo stesso errore di OP dopo il refactoring del nome della mia classe di test.
Marco

4

Non so se aiuta per Android Studio, ma ho avuto una sorta di conflitto Intellij-Gradle. Risolto "facendo clic con il pulsante destro del mouse" sul file di prova e premendo "compila file ... Test.java". Dopodiché potrei eseguire nuovamente i singoli test.


2
Dov'è questo "file di compilazione" su un * Test.java? Quale versione di Android Studio?
Mark Lapasa

Come ho provato a dire sopra, non utilizzo Android Studio. Sto usando Intellij 15 proffesional. immagine del menu a discesa con clic destro <- Ho incollato un'immagine qui.
kotlinski


3

Ho eseguito test che funzionavano bene fino a quando gradleAndroid Studio non è stato aggiornato.

Oltre ad aggiungere un costruttore predefinito ai tuoi test, potresti dover fare alcune di queste cose per far funzionare la tua suite di test

Sotto src/crea androidTest/java/<your-package-name>/test. Nota il androidTest. Qualsiasi altra cosa, incluso instrumentTestnon funzionerà.

Aggiungi questo a build.gradle

sourceSets {
    testLocal {
        java.srcDir file('src/androidTest/java')
        resources.srcDir file('src/androidTest/resources')
    }
}



android{
    sourceSets {
       instrumentTest.setRoot('src/androidTest/')
    }
}

dependencies{
     testLocalCompile 'junit:junit:4.11'
}

task localTest(type: Test, dependsOn: assemble) {
    testClassesDir = sourceSets.testLocal.output.classesDir

    android.sourceSets.main.java.srcDirs.each { dir ->
        def buildDir = dir.getAbsolutePath().split('/')
        buildDir = (buildDir[0..(buildDir.length - 4)] + ['build', 'classes', 'debug']).join('/')

        sourceSets.testLocal.compileClasspath += files(buildDir)
        sourceSets.testLocal.runtimeClasspath += files(buildDir)
    }

    classpath = sourceSets.testLocal.runtimeClasspath
}

check.dependsOn localTest

Aggiungi questo al file AndroidManifest.xml

 <instrumentation
        android:name="android.test.InstrumentationTestRunner"
        android:label="Tests for my packaged app"
        android:targetPackage="<my-package-name>.test" />

3

Per Intellij 15 ho risolto questo problema:

  1. Apertura delle impostazioni "Struttura del progetto"
  2. Facendo clic su "Moduli" (a sinistra)
  3. Scheda "Fonti"
    a. Fare clic con il tasto destro sulla directory di origine (di solito src) fare clic su "Sorgente".
    b. Fare clic con il tasto destro sulla directory di test fare clic su "Test"
    c. Fare clic con il pulsante destro del mouse sulla directory di uscita fare clic su "Escluso"
  4. Vai alla scheda "Percorsi"
    a. Fare clic sul pulsante di
    opzione "Usa percorso di output della compilazione del modulo" b. Seleziona la directory del percorso di output per "Percorso di output"
    c. Seleziona la directory del percorso di prova per "Percorso output di prova"
  5. Fare clic su OK

3

Ovviamente, hai bisogno di un dispositivo di destinazione per eseguire i tuoi test in quanto sono test strumentati. Per alcuni motivi, Android studio a volte non ti chiede di puntare a questo dispositivo di destinazione e richiede semplicemente il messaggio "Empty Test Suite". Esistono diversi modi per risolvere questo problema, eccone alcuni:

  • esegui la tua app principale e seleziona un dispositivo di destinazione o

  • vai alla configurazione Esegui (Esegui / Esegui ... / Modifica configurazioni) e modifica le Opzioni di destinazione della distribuzione


Solo per aiutare qualcuno se prova la tua soluzione. Nel mio caso ho dovuto prima eseguire l'app effettiva sul dispositivo / emulatore e successivamente il mio AndroidTest è stato in grado di vedere il dispositivo su cui eseguire i test. Dopo di che tutto ha funzionato. Dando più uno per la risposta.
A_P

2

Nel mio caso, nessuna delle risposte precedenti ha funzionato. La soluzione era spostare semplicemente la classe di test in un altro pacchetto .

Questo è successo sotto androidTest/


2

Nel mio caso quel problema è stato causato a causa di un errore nel mio codice, in realtà era nella classe dell'applicazione, quindi l'attività di destinazione non è stata aperta e l'output di prova viene stampato

Errore della suite di test vuota

Ho provato a eseguire test direttamente dal terminale con adb shell am instrument -w -r -e package your.package -e debug false android.support.test.runner.AndroidJUnitRunner. Con questo stampa per te molto di più sull'eccezione.


2

Ho avuto questo problema perché avevo questo nel mio build.gradle:

testOptions {
    execution "ANDROID_TEST_ORCHESTRATOR"
}

Anche se non stavo utilizzando Android Test Orchestrator (deve essere stato copiato dai tutorial per errore).

Commentare questo lo ha risolto per me.


1

Nessuna delle altre soluzioni ha funzionato per me, ma sono stato in grado di farlo funzionare semplicemente disinstallando l'app esistente o la suite di test, quindi eseguendo i test.


Questo mi ha aiutato. Ho apportato modifiche a livello di database prima di eseguire il test, quindi la classe sotto il test con strumentazione non poteva funzionare. È strano che Android Studio visualizzi un messaggio così non pertinente.
PetroCliff

1

Nel mio caso, il progetto su cui stavo lavorando aveva un paio di moduli. Nessuna delle soluzioni che ho trovato per questo errore mi ha aiutato, e poi in qualche modo mi sono reso conto che se ho aggiunto le dipendenze di test in ENTRAMBI i file build.gradle, i test hanno iniziato magicamente a funzionare. Non importa se i tuoi test risiedono solo in uno dei moduli, entrambi i file gradle devono includere le dipendenze e il valore testInstrumentationRunner.

Quindi, se come me, nessuna delle altre risposte ti ha aiutato, prova ad aggiungere queste righe al file build.gradle di ciascuno dei tuoi moduli:

android {    
    ....
    defaultConfig {
        ...
        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
    }  
}

e poi aggiungi anche:

dependencies {
    ...
    // Test
    androidTestCompile 'com.android.support:support-annotations:23.4.0'
    androidTestCompile 'com.android.support.test:runner:0.5'
    androidTestCompile 'com.android.support.test:rules:0.5'

}

1

Ho appena rinominato il file e il problema è stato risolto.


1

Ho avuto lo stesso problema e il motivo era che la mia classe di test non aveva Test alla fine del nome della classe!


1

Il mio problema è stato causato da un'eccezione generata nel @BeforeClassmetodo del mio caso di test. In qualche modo non stava causando il fallimento del test: l'ho trovato solo controllando l'output di logcat.

Ho corretto l'eccezione e improvvisamente i miei test erano in esecuzione!


stessa cosa per me. Sembra che le eccezioni in BeforeClass non siano mostrate correttamente nel pannello di esecuzione
David Refaeli


0

Questo articolo mi ha aiutato: suite di test vuota

Fondamentalmente ho dovuto creare un pacchetto - instrumentTest / java - nella mia directory src, e mettere lì tutti i test. Quindi potrei eseguire questi test individualmente.


0

Avevo un progetto Java grezzo in cui si verificava questo. Semplicemente Java + JUnit4. Risiede sicuramente con qualcosa nei tuoi file .idea / o .iml. Ho scartato il mio, reimportato e finalmente i test sono stati eseguiti di nuovo.


0

La classe di test può essere esclusa dalla compilazione. Risolvilo in setting-compiler-exclude.


0

Ecco i miei passaggi di debug che eseguo quando Android Studio decide all'improvviso di interrompere l'esecuzione / debug dei test (e il ragazzo accade spesso in modo imbarazzante !!):

  • Compila: → Ricostruisci progetto
  • Riavvia dispositivo: riavvia il dispositivo / emulatore e riprova
  • Cambio dispositivo: se hai sia un normale telefono che un emulatore, scollegane uno e prova a eseguirlo con uno solo dei dispositivi
  • Android Studio: File -> Invalida cache e riavvia
  • Activity Monitor / Task Manager: ordina i processi per nome, controlla se c'è un processo senza nome che utilizza molta RAM, questo è un processo "fantasma" di Android Studio che deve essere ucciso
  • git revert: prova ad archiviare / ripristinare il tuo ultimo codice. A volte c'è un errore di compilazione che Android Studio / gradle non riesce e proverà solo a eseguire codice non compilabile.
  • Disinstalla e reinstalla Android Studio.

Aggiungerò più correzioni man mano che le incontro!


0

Non ho fatto nulla e il problema è andato via dopo mezza giornata di dolore, ho aperto e chiuso i progetti molte volte, ho eseguito manualmente i test di ogni classe, forse questo mi ha risolto.


0

In studio Android con framework spock ho cambiato la versione del mio gradle da 2.2.2 a 3.2.1 e tutto va bene.


0

La risposta accettata non ha risolto il mio problema. Quindi ho deciso di copiare quello ExampleInstrumentedTestcreato di default in Android Studio e funziona senza problemi, rinominarlo durante il processo di copia (no Refactor-> Rinomina dopo la copia!) E incollare il contenuto del mio unit test in esso. Dopo di che l'errore è scomparso.


0

Ho riscontrato l'errore "Empty test suite" durante il tentativo di eseguire i test delle unità locali nel mio progetto Android Studio 3.0.

Dopo aver letto la documentazione per sviluppatori Android , mi sono subito reso conto che il problema era causato dalla mia configurazione gradle che includeva le seguenti righe.

testImplementation 'com.android.support.test:runner:0.5'
testImplementation 'com.android.support.test:rules:0.5'

La classe AndroidJUnitRunner è un test runner JUnit che consente di eseguire classi di test in stile JUnit 3 o JUnit 4 su dispositivi Android .

Poiché i miei test erano locali e quindi non erano tenuti a essere eseguiti su alcun dispositivo, la rimozione delle voci com.android.support.test ... sopra mi ha permesso di eseguire gli unit test.


0

Stavo facendo alcuni inserimenti in un db nel metodo @BeforeClass. Mi sono reso conto di avere un problema di mappatura oggetto / database. Questo problema di mappatura dei dati è stato la causa di questo problema per me.


0

Nel mio caso, avevo i miei test strumentali androidTest/java/<package.name>/MyTestingClass, ma avevo impostato la mia variante di build corrente su "pre-produzione". E questo è il punto! Come specificato nella documentazione di Android Studio :

Per impostazione predefinita, tutti i test vengono eseguiti con il tipo di build di debug.

Il messaggio ha Class not found. Empty test suite.continuato ad apparire finché non ho fatto questo:

  1. Aggiungi questa riga al mio build.gradle :

    android{
        [...]
        testBuildType "preproduction"
    }
  2. Gradle sincronizzato.
  3. Elimina le mie precedenti configurazioni di test poiché non tengono conto di questa sincronizzazione Gradle.

Poi ho eseguito di nuovo i test e questa volta sono andati alla perfezione !!!


0

Mi è successo quando ho erroneamente contrassegnato una variabile di classe non fittizia con l'annotazione @Mock Rimossa l'annotazione ei test sono stati eseguiti correttamente. Questo è successo con Junit 4.5 su Android Studio


0

Non una soluzione ma una soluzione alternativa che ti riporterà rapidamente in carreggiata:

  1. In primo luogo, trova un test che funzioni. Stavo scrivendo un nuovo test in cui ho ricevuto l'errore "suite di test vuota". Ho eseguito altri test e funzionavano come al solito.

  2. Copia il file di prova che funziona. Eseguilo per assicurarti che questa copia funzioni come l'originale.

  3. Rimuovere il corpo e sostituirlo con il nuovo codice di prova.

Il test dovrebbe ora funzionare.

Abbiamo impiegato circa due ore a cercare di trovare la causa, ma senza successo.

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.