Pourquoi le lanceur de tests Android rapporte-t-il une "suite de tests vide"?


98

Je me cogne la tête contre le mur ici en essayant de comprendre pourquoi IntelliJ / Android rapporte "Suite de tests vide". J'ai un petit projet avec deux modules IntelliJ ("Projets" dans Eclipse). Le module de test unitaire a son propre AndroidManifest.xml, que j'ai collé en bas. J'essaye d'exécuter un ActivityUnitTestCase, puisque les tests Contextdépendront de -object.

Le nom de package du module principal est nilzor.myapp. Le nom pacakge du module de test estnilzor.myapp.tests

Pourquoi le testeur ne détecte-t-il pas la testBlah()méthode -méthode comme 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>

Et voici ma classe de test :;

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);
    }
}

J'ai lu les principes de base des tests , le document de test d'activité et essayé de suivre ce blog de test Hello world , même si c'est pour Eclipse. Je n'arrive pas à faire en sorte que le testeur trouve et exécute mon test. Qu'est-ce que je fais mal?

Certaines des questions sur lesquelles je ne suis toujours pas sûr sont:

  1. Ai-je besoin d'une annotation au-dessus de la méthode de test unitaire?
  2. Dois-je préfixer la méthode avec "test", ou est-ce uniquement pour les tests JUnit?
  3. Puis-je avoir des tests dans des sous-packages de nilzor.myapp.tests?

Mais la question principale de cet article est pourquoi le testeur ne détecte-t-il pas mon test ?


Pour le point 3, si vous utilisez Android Studio, je vous recommande le cmd+shift+traccourci qui créera automatiquement une classe de test à l'emplacement correct du package qui correspond à la classe que vous modifiez actuellement.
David Argyle Thacker

Juste au cas où quelqu'un d'autre serait aussi absent que moi. Assurez-vous de ne pas oublier de placer le @Testmarqueur au-dessus du test.
Matt D

Réponses:


70

Vous devez fournir un constructeur par défaut pour votre classe de test, par exemple:

package nilzor.myapp.tests;

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

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

sur vos autres questions:

  1. Non. Mes tests fonctionnent toujours sans aucune annotation, mais je suppose que c'est une bonne pratique de les avoir. Il vous permet de spécifier la taille des tests à exécuter. Voir À quoi servent les annotations @SmallTest, @MediumTest et @LargeTest dans Android? pour plus de détails.

  2. Oui, vous avez besoin du préfixe "test". InteliJ donne un avertissement "méthode jamais utilisée" lorsqu'il n'y a pas de préfixe "test" et ignore cette méthode pendant l'exécution du test.

  3. Oui. J'ai mes tests organisés en sous-packages et cela semble bien fonctionner.


5
Cela n'est pas nécessaire si vous utilisez ActivityTestRule
Yair Kukielka

L'ajout du constructeur par défaut a fait le travail pour moi.
Dragan Marjanović

54

Si cela se produit "tout d'un coup" ou "cela fonctionnait il y a 5 minutes", ma solution était d'aller dans les configurations Exécuter / Déboguer et de supprimer toutes les configurations sous "Tests Android". Parfois, ces configurations sont corrompues si je refactore la classe testée (par exemple en passant à un nouveau package).

entrez la description de l'image ici


Cela a fonctionné pour moi. J'obtenais une erreur de suite de tests vide. Cela peut être dû au fait que j'ai ajouté PowerMockito après la création initiale de la configuration.
Ajith Memana

J'ai souvent ceci et d'autres problèmes en exécutant des tests où les configurations de construction fonctionnaient correctement plus tôt. J'ai pu les résoudre en adoptant cette approche.
stevehs17

3
Après avoir supprimé les configurations, je clique avec le bouton droit sur un package de test dans l'explorateur de projet (vue Android) et sélectionne Create 'Tests in XXX...- puis cela a fonctionné à nouveau
TmTron

9

Rien de ce qui précède ne l'a résolu pour moi. Ce qui a aidé était de suivre les instructions :

Créer une configuration de test

Dans Android Studio:

  • Ouvrez le menu Exécuter -> Modifier les configurations
  • Ajouter une nouvelle configuration de tests Android
  • Choisissez un module
  • Ajoutez un runner d'instrumentation spécifique:

  android.support.test.runner.AndroidJUnitRunner

Exécutez la configuration nouvellement créée.


6

J'ai eu un problème similaire. Je ne sais pas pourquoi cela se produit, mais j'ai pu résoudre ce problème en accédant à: "Fichier"> "Invalider les caches / redémarrer" dans Android Studio.


Cela a résolu le problème pour moi lorsque j'ai eu la même erreur que OP après avoir refactoré le nom de ma classe de test.
Marco

4

Je ne sais pas si cela aide pour Android Studio, mais j'ai eu une sorte de conflit Intellij-Gradle. Résolu le problème en "faisant un clic droit" sur le fichier de test et en appuyant sur "compiler le fichier ... Test.java". Après cela, je pourrais recommencer des tests uniques.


2
Où est ce "fichier de compilation" sur un * Test.java? Quelle version d'Android Studio?
Mark Lapasa

Comme j'ai essayé de le dire ci-dessus, je n'utilise pas Android Studio. J'utilise Intellij 15 proffesional. image du menu déroulant clic droit <- J'ai collé une image ici.
kotlinski


3

J'ai eu des tests qui fonctionnaient bien jusqu'à ce gradleque le studio Android soit mis à niveau.

Outre l'ajout d'un constructeur par défaut à vos tests, vous devrez peut-être faire certaines de ces choses pour que votre suite de tests fonctionne

Sous src/créer androidTest/java/<your-package-name>/test. Notez le androidTest. Tout le reste, y compris instrumentTestne fonctionnera pas.

Ajouter ceci à 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

Ajoutez ceci à la AndroidManifest.xml

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

3

Pour Intellij 15, j'ai résolu ce problème en:

  1. Ouverture des paramètres 'Structure du projet'
  2. Cliquer sur 'Modules' (à gauche)
  3. Onglet «Sources»
    a. Faites un clic droit sur votre répertoire source (généralement src) cliquez sur «Source».
    b. Cliquez avec le bouton droit sur votre répertoire de test, cliquez sur «Test»
    c. Faites un clic droit sur votre répertoire de sortie, cliquez sur `` Exclu ''
  4. Allez dans l'onglet «Chemins»
    a. Cliquez sur le bouton radio «Utiliser le chemin de sortie de compilation du module»
    b. Sélectionnez votre répertoire de chemin de sortie pour «Chemin de sortie»
    c. Sélectionnez votre répertoire de chemin de test pour «Chemin de sortie de test»
  5. Cliquez sur OK

3

De toute évidence, vous avez besoin d'un équipement cible pour exécuter vos tests car ce sont des tests instrumentés. Pour certaines raisons, le studio Android ne vous demande parfois pas de pointer vers cet appareil cible et affiche simplement le message «Vider la suite de tests». Il existe différentes façons de résoudre ce problème, en voici quelques-unes:

  • exécutez votre application principale et sélectionnez un appareil cible ou

  • aller à la configuration Exécuter (Exécuter / Exécuter ... / Modifier les configurations) et modifier les options de cible de déploiement


Juste pour aider quelqu'un s'il essaie votre solution. Dans mon cas, je devais d'abord exécuter l'application réelle sur l'appareil / l'émulateur et après cela, mon AndroidTest a pu voir l'appareil sur lequel exécuter des tests. Après cela, tout a fonctionné. Donner plus un pour la réponse.
A_P

2

Dans mon cas, aucune des réponses précédentes n'a fonctionné. La solution consistait simplement à déplacer la classe de test vers un autre package .

Cela s'est passé sous androidTest/


2

Dans mon cas, ce problème a été causé par une erreur dans mon code, en fait c'était dans la classe d'application, donc l'activité cible n'a pas été ouverte et la sortie de test s'imprime

Erreur de suite de tests vide

J'ai essayé d'exécuter des tests directement à partir du terminal avec adb shell am instrument -w -r -e package your.package -e debug false android.support.test.runner.AndroidJUnitRunner. Avec cela, il imprime pour vous beaucoup plus sur l'exception.


2

J'ai eu ce problème parce que j'avais ceci dans mon build.gradle:

testOptions {
    execution "ANDROID_TEST_ORCHESTRATOR"
}

Même si je n'utilisais pas Android Test Orchestrator (j'ai dû copier les tutoriels par erreur).

Commenter cela a résolu le problème pour moi.


1

Aucune des autres solutions n'a fonctionné pour moi, mais j'ai pu le faire fonctionner simplement en désinstallant l'application ou la suite de tests existante, puis en exécutant les tests.


Cela m'a aidé. J'ai apporté des modifications au niveau de la base de données avant d'exécuter le test, donc la classe sous le test instrumenté ne pouvait pas fonctionner. Il est étrange qu'Android Studio affiche un message aussi non pertinent.
PetroCliff

1

Dans mon cas, le projet sur lequel je travaillais comportait quelques modules. Aucune des solutions que j'ai trouvées pour cette erreur ne m'a aidé, puis j'ai réalisé que si j'ajoutais les dépendances de test dans LES DEUX fichiers build.gradle, les tests commençaient à fonctionner comme par magie. Peu importe si vos tests ne résident que dans 1 des modules, les deux fichiers gradle doivent inclure les dépendances et la valeur testInstrumentationRunner.

Donc, si comme moi, aucune des autres réponses ne vous a aidé, essayez d'ajouter ces lignes au fichier build.gradle de chacun de vos modules:

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

puis ajoutez également:

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

Je viens de renommer le fichier et le problème est résolu.


1

J'ai eu le même problème, et la raison en était que ma classe de test n'avait pas Test à la fin du nom de la classe!


1

Mon problème a été causé par une exception lancée dans la @BeforeClassméthode de mon cas de test. Cela n'entraînait pas un échec du test - je ne l'ai trouvé qu'en inspectant la sortie de logcat.

J'ai corrigé l'exception et soudain mes tests étaient en cours d'exécution!


pareil pour moi. Il semble que les exceptions dans BeforeClass ne soient pas correctement affichées dans le panneau d'exécution
David Refaeli


0

Cet article m'a aidé: suite de tests vide

Fondamentalement, je devais créer un package - instrumentTest / java - sous mon répertoire src, et y mettre tous les tests. Ensuite, je pourrais exécuter ces tests individuellement.


0

J'avais un projet Java brut où cela se produisait. Simplement Java + JUnit4. Il réside définitivement avec quelque chose dans vos fichiers .idea / ou .iml. J'ai mis au rebut le mien, réimporté et finalement les tests ont recommencé.


0

La classe de test peut être exclue de la compilation. Corrigez-le dans setting-compiler-exclude.


0

Voici mes étapes de débogage que je traverse quand Android Studio décide tout à coup d'arrêter d'exécuter / de déboguer les tests (Et ça arrive souvent de façon embarrassante !!):

  • Construire: → Projet de reconstruction
  • Redémarrer l'appareil: redémarrez votre appareil / émulateur et réessayez
  • Commutateur d'appareil: si vous avez à la fois un téléphone ordinaire et un émulateur, débranchez-en un et essayez de l'exécuter avec un seul des appareils
  • Android Studio: Fichier -> Invalider les caches et redémarrer
  • Moniteur d'activité / Gestionnaire de tâches: trier les processus par nom, voir s'il existe un processus sans nom qui utilise beaucoup de RAM, c'est un processus "fantôme" du studio Android qui doit être tué
  • git revert: essayez de cacher / revenir votre dernier code. Parfois, il y a une erreur de compilation qu'Android Studio / gradle manque et il essaiera simplement d'exécuter du code non compilable.
  • Désinstallez puis réinstallez Android Studio.

J'ajouterai plus de correctifs au fur et à mesure que je les rencontrerai!


0

Je n'ai rien fait et le problème a disparu après une demi-journée de douleur, j'ai ouvert et fermé les projets plusieurs fois, j'ai exécuté les tests de chaque classe manuellement, peut-être que cela a résolu mon problème.


0

Dans le studio Android avec le framework spock, j'ai changé la version de mon gradle de 2.2.2 à 3.2.1 et tout se passe bien.


0

La réponse acceptée n'a pas résolu mon problème. J'ai donc décidé de copier ExampleInstrumentedTestce qui est créé par défaut dans Android Studio et qui s'exécute sans aucun problème, je l'ai renommé pendant le processus de copie (pas de Refactor-> Renommer après la copie!) Et y ai collé le contenu de mon test unitaire. Après cela, l'erreur a disparu.


0

J'ai rencontré l'erreur "Suite de tests vide" en essayant d'exécuter des tests unitaires locaux dans mon projet Android Studio 3.0.

Après avoir lu la documentation du développeur Android , je me suis rapidement rendu compte que le problème était causé par ma configuration gradle qui comprenait les lignes suivantes.

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

La classe AndroidJUnitRunner est un exécuteur de test JUnit qui vous permet d'exécuter des classes de test de style JUnit 3- ou JUnit 4 sur les appareils Android .

Étant donné que mes tests étaient locaux et ne nécessitaient donc pas de s'exécuter sur aucun appareil, la suppression des entrées com.android.support.test ... ci-dessus m'a permis d'exécuter les tests unitaires.


0

Je faisais des insertions dans une base de données dans la méthode @BeforeClass. J'ai réalisé que j'avais un problème de mappage objet / base de données. Ce problème de mappage de données a été la cause de ce problème pour moi.


0

Dans mon cas, j'avais mes tests instrumentés androidTest/java/<package.name>/MyTestingClass, mais j'avais réglé ma variante de construction actuelle sur "préproduction". Et voilà le point! Comme spécifié dans la documentation d'Android Studio :

Par défaut, tous les tests s'exécutent sur le type de build de débogage.

Le message a Class not found. Empty test suite.continué à apparaître jusqu'à ce que je fasse ceci:

  1. Ajoutez cette ligne à mon build.gradle :

    android{
        [...]
        testBuildType "preproduction"
    }
  2. Gradle synchronisé.
  3. Supprimez mes configurations de test précédentes car elles ne prennent pas en compte cette synchronisation Gradle.

Ensuite, j'ai exécuté à nouveau les tests et cette fois ils fonctionnent parfaitement !!!


0

Cela m'est arrivé lorsque j'ai marqué par erreur une variable de classe non fictive avec l'annotation. @Mock Supprimé l'annotation et les tests se sont déroulés avec succès. Cela s'est produit avec Junit 4.5 sur Android Studio


0

Pas une solution mais une solution de contournement qui vous remettra rapidement sur les rails:

  1. Tout d'abord, trouvez un test qui fonctionne. J'écrivais un nouveau test où j'ai eu l'erreur «suite de tests vide». J'ai fait d'autres tests et ils fonctionnaient comme d'habitude.

  2. Copiez le fichier de test qui fonctionne. Exécutez-le pour vous assurer que cette copie fonctionne comme l'original.

  3. Retirez le corps et remplacez-le par votre nouveau code de test.

Le test devrait maintenant fonctionner.

Nous avons passé environ deux heures à essayer de trouver la cause, mais en vain.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.