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 ?

Nilzor
la source
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.

lmac
la source
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

tir38
la source
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.

serv-inc
la source
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.

Jeff Stapleton
la source
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.

Kotlinski
la source
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
4

J'ai eu le même problème sur Android Studio 2.3.1, il s'avère que c'était juste un bug avec AS. L'exécution du même test sur la version 2.2.1 fonctionne bien.

Si vous utilisez uniquement Android Studio sur le canal Cannary, je vous recommande également d'installer une version stable. http://tools.android.com/tips/using-multiple-android-studio-versions

David Argyle Thacker
la source
Pareil pour moi, stable 3.1.2 fonctionne, 3.2 canary 15 ne fonctionne pas.
arekolek
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" />
Pratik Mandrekar
la source
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
Marquis Blount
la source
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

user2243632
la source
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/

Mateus Gondim
la source
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.

Beloo
la source
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.

Pablo
la source
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.

Phil
la source
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'

}
Jorge Salas
la source
1

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

Lyn
la source
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!

Janin
la source
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!

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

Après avoir affronté le problème aujourd'hui - ne pas pouvoir exécuter les tests Android instrumentés avec une erreur de suite vide - j'ai trouvé un problème git à propos de ce problème et grâce à Stephan Linzner, j'ai pu exécuter les tests.

tl; dr Vous devez cliquer avec le bouton droit sur le package de test et non sur la classe pour exécuter les tests.

Référence: https://github.com/googlecodelabs/android-testing/issues/27#issuecomment-219074863

Francisco Junior
la source
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.

IgorGanapolsky
la source
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é.

cdaringe
la source
0

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

petertc
la source
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!

gorbysbm
la source
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.

Gary Davies
la source
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.

Psijic
la source
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.

ka3ak
la source
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.

Will P
la source
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.

Laurent
la source
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 !!!

Juan José Melero Gómez
la source
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

Mihir
la source
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.

xavierdominguez
la source