web-dev-qa-db-fra.com

Pourquoi le programme d’exécution de test Android) indique-t-il "Suite de test vide"?

Je frappe ma tête contre le mur ici pour essayer de comprendre pourquoi IntelliJ/Android rapporte "Suite de test vide". J'ai un petit projet avec deux modules IntelliJ ("Projets" dans Eclipse). Le module de test unitaire a son propre fichier AndroidManifest.xml, que j'ai collé en bas. J'essaie de lancer un ActivityUnitTestCase, car les tests dépendront de l'objet Context-.

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

Pourquoi le testeur ne détecte-t-il pas la méthode testBlah()- en tant que 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 le principes de base du test , le document de test d'activité , et j'ai essayé de le suivre Bonjour le blog de test du monde , 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 qui me préoccupent encore sont les suivantes:

  1. Ai-je besoin d'une annotation supérieure à la méthode de test unitaire?
  2. Dois-je préfixer la méthode par "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 principale question de ce message est pourquoi le testeur ne détecte-t-il pas mon test ?

98
Nilzor

Vous devez fournir le 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);
    }
}

à propos de vos autres questions:

  1. Non. Mes tests sont toujours effectués sans annotations, 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 Quel est le but des 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-paquets et cela semble bien fonctionner.

70
lmac

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

enter image description here

54
tir38

Aucune de ces réponses ne l'a corrigé pour moi. Ce qui a aidé était en suivant les instructions :

Créer une configuration de test

Dans Android Studio:

  • Ouvrir Menu Exécuter -> Modifier les configurations
  • Ajouter une nouvelle configuration Tests Android
  • Choisissez un module
  • Ajouter un coureur d'instrumentation spécifique:
  Android.support.test.runner.AndroidJUnitRunner

Exécutez la configuration nouvellement créée.

9
serv-inc

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

5
Jeff Stapleton

J'ai eu le même problème sur Android Studio 2.3.1, il s’avérait qu’il s’agissait simplement d’un bogue avec AS. Exécuter le même test sur la version 2.2.1 se passe bien.

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

4

Je ne sais pas si cela aide pour Android Studio, mais j'ai eu une sorte de conflit Intellij-Gradle. Résolu en "faisant un clic droit" sur le fichier de test et en tapant "fichier de compilation" ... Test.Java ". Après cela, je pouvais exécuter à nouveau des tests simples.

4
kotlinski

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

  1. Ouverture des paramètres 'Structure du projet'
  2. En cliquant sur 'Modules' (à gauche)
  3. Onglet 'Sources'
    une. Faites un clic droit sur votre répertoire source (généralement src), puis cliquez sur 'Source'.
    b. Faites un clic droit sur votre répertoire de test, cliquez sur 'Test'
    c. Faites un clic droit sur votre répertoire de sortie cliquez sur 'Exclus'
  4. Aller sur l'onglet 'Chemins'
    une. Cliquez sur le bouton radio "Utiliser le module pour générer le chemin de sortie"
    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 'Test output Path'
  5. Cliquez sur OK
3
Marquis Blount

De toute évidence, vous avez besoin d'un périphérique cible pour pouvoir exécuter vos tests car ils sont des tests instrumentés. Pour certaines raisons, Android studio parfois ne vous demande pas de pointer sur cet appareil cible et envoyez simplement le message "Empty Test Suite". Il existe différentes façons de corriger voici quelques-uns:

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

  • accédez à la configuration Exécuter (Exécuter/Exécuter .../Modifier les configurations) et modifiez l'option Options de la cible de déploiement.

3
user2243632

J'ai eu des tests qui fonctionnaient bien jusqu'à ce que gradle et Android studio soient mis à niveau.

Outre l'ajout d'un constructeur par défaut à vos tests, vous devrez peut-être effectuer certaines de ces tâches 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 instrumentTest ne fonctionnera pas.

Ajoutez 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 au AndroidManifest.xml

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

Dans mon cas, aucune des réponses précédentes n'a fonctionné. La solution était simplement déplacez la classe de test dans un autre paquet.

Cela s'est passé sous androidTest/

2
Mateus Gondim

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

testOptions {
    execution "Android_TEST_ORCHESTRATOR"
}

Même si je n'utilisais pas le Android Test Orchestrator (vous devez avoir copié les didacticiels par erreur).

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

2
Pablo

Dans mon cas, ce problème était dû à une erreur dans mon code, il s'agissait en fait d'une classe d'application. L'activité cible n'était donc pas ouverte et les impressions de sortie de test

Erreur de la suite de tests vide

J'ai essayé d'exécuter des tests directement depuis le 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 d’exception.

2
Beloo

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

1
Lyn

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

1
Phil

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 des fichiers build.gradle, les tests commençaient comme par magie. Peu importe si vos tests ne résident que dans l'un des modules, les deux fichiers de gradation 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"
    }  
}

et ensuite ajouter aussi:

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
Jorge Salas

Mon problème a été causé par une exception lancée dans le @BeforeClass méthode de mon cas de test. Cela ne causait en aucun cas l'échec du test - je l'ai trouvé uniquement en inspectant la sortie logcat.

J'ai corrigé l'exception et soudain mes tests ont été lancés!

1
shocking

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

1
Janin

Après avoir fait face au problème aujourd'hui - ne pas être en mesure d'exécuter l'instrumenté Android tests avec une erreur de suite vide - j'ai trouvé un problème git concernant ce problème et, grâce à Stephan Linzner, j'ai pu exécuter les tests.

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

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

1
Francisco Junior

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

Par défaut, tous les tests sont exécutés avec le type de construction de débogage.

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

  1. Ajoutez cette ligne à mon build.gradle :

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

Ensuite, j'ai refait les tests et cette fois, ils fonctionnent parfaitement!

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

  1. Tout d'abord, trouvez un test qui fonctionne. J'écrivais un nouveau test dans lequel j'avais l'erreur "suite de tests vide". J'ai fait d'autres tests et ils travaillaient 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.

0
xavierdominguez

Dans Android studio avec spock framework, j'ai changé la version de mon diplôme de 2.2.2 à 3.2.1 et tout va bien.

0
Psijic

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

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

0
IgorGanapolsky

J'ai eu le bloc de code suivant

@get:Rule
lateinit var activityScenario: ActivityScenario<HomeActivity>

parce que je devais passer différents paramètres dans l'intention d'activité basée sur les différents cas de test. Quand j'ai enlevé le @get:Rule les tests ont recommencé à fonctionner.

0
Vaios

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 était la cause de ce problème pour moi.

0
Laurent

Voici les étapes de débogage que je suis en train de suivre lorsque Android Studio décide tout à coup de cesser de lancer des tests de débogage (et c'est ce qui se passe souvent de manière embarrassante !!):

  • Build: → Reconstruire le projet
  • Redémarrer le périphérique: redémarrez votre périphérique/émulateur et réessayez
  • Changement d'appareil: si vous avez un téléphone ordinaire et un émulateur, débranchez-le 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: triez les processus par nom, voyez s'il existe un processus sans nom qui consomme beaucoup de bélier, il s'agit d'un processus "fantôme" de Android studio qui doit être tué)
  • git revert: essayez de cacher/restaurer votre dernier code. Parfois, il se produit une erreur de compilation qui Android Studio/gradle manque et il essaiera simplement d’exécuter du code non compilable.
  • Désinstallez puis réinstallez Android Studio.

Je vais ajouter plus de correctifs au fur et à mesure que je les rencontre!

0
gorbysbm

J'avais un projet brut Java) dans lequel cela se produisait. Simplement Java + JUnit4. Il réside définitivement dans quelque chose dans vos fichiers .idea/ou .iml. I mien mis au rebut, ré-importé, et finalement les tests ont été à nouveau exécutés.

0
cdaringe

J'ai rencontré l'erreur "Suite de test vide" lors de la tentative d'exécution de tests unitaires locaux dans mon projet Android Studio 3.0.

Après avoir lu le Android Developer documentation , ==, je me suis vite rendu compte que le problème était dû à ma configuration de 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 programme d'exécution de test JUnit qui vous permet d'exécuter des classes de test de type JUnit 3- ou JUnit 4 sur des appareils Android .

Étant donné que mes tests étaient locaux et ne devaient donc être exécutés sur aucun périphérique, la suppression des entrées com.Android.support.test ... ci-dessus me permettait d'exécuter les tests unitaires.

0
Will P

Je n'ai rien fait et le problème a disparu après une demi-journée de souffrance. J'ai ouvert et fermé plusieurs fois les projets, exécuté manuellement chaque test de cours, ce qui a peut-être été corrigé.

0
Gary Davies

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

0
okwap

La réponse acceptée n'a pas résolu mon problème. J'ai donc décidé de copier ExampleInstrumentedTest qui est créé par défaut dans Android Studio et s'exécute sans aucun problème, l'a 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 quoi l'erreur a disparu.

0
ka3ak

Cela m'est arrivé lorsque j'ai marqué par erreur une variable de classe non fictive avec l'annotation @Mock Suppression de l'annotation et exécution des tests. Ceci est arrivé avec Junit 4.5 sur Android Studio

0
Mihir