98 votes

Pourquoi le programme d'exécution des tests Android signale-t-il "Suite de tests vide" ?

Je me heurte à un mur en essayant de comprendre pourquoi IntelliJ/Android signale "Empty test suite". J'ai un petit projet avec deux modules IntelliJ ("Projects" dans Eclipse). Le module de test unitaire a son propre AndroidManifest.xml, que j'ai collé en bas. J'essaie d'exécuter un ActivityUnitTestCase puisque les tests dépendront de l Context -objet.

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

Pourquoi le programme d'exécution des tests ne détecte-t-il pas le testBlah() -comme 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>

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 les fondamentaux des tests le document de test d'activité et j'ai essayé de suivre cette procédure Hello world test blog même si c'est pour Eclipse. Je n'arrive pas à faire en sorte que le test runner trouve et exécute mon test. Qu'est-ce que je fais de mal ?

Certaines des questions sur lesquelles j'ai encore des doutes sont les suivantes :

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

Mais la question principale de ce billet est pourquoi le test runner ne détecte pas mon test ?

4voto

dthacker Points 156

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 n'exécutez Android Studio que sur le canal Cannary, je vous recommande d'installer également une version stable. http://tools.Android.com/tips/using-multiple-Android-studio-versions

3voto

Pratik Mandrekar Points 2805

J'avais des tests qui fonctionnaient bien jusqu'à ce que gradle et Android studio a été mis à jour.

Outre l'ajout d'un constructeur par défaut à vos tests, vous devrez peut-être effectuer certaines des opérations suivantes pour que votre suite de tests fonctionne

Sous src/ créer androidTest/java/<your-package-name>/test . Notez le androidTest . Tout autre élément, 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 à la AndroidManifest.xml

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

3voto

Marquis Blount Points 2603

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

  1. Ouvrir les paramètres de la "Structure du projet".
  2. Cliquez sur "Modules" (à gauche)
  3. Onglet "Sources
    a. Faites un clic droit sur votre répertoire source (généralement src) et cliquez sur "Source".
    b. Cliquez avec le bouton droit de la souris sur votre répertoire de test et cliquez sur "Test".
    c. Faites un clic droit sur votre répertoire de sortie et cliquez sur "Exclus".
  4. Allez dans l'onglet "Chemins".
    a. Cliquez sur le bouton radio "Utiliser le chemin de sortie de la compilation du module".
    b. Sélectionnez votre répertoire de sortie pour "Output Path".
    c. Sélectionnez votre répertoire de test pour 'Test output Path'.
  5. Cliquez sur Ok

3voto

user2243632 Points 1

De toute évidence, vous avez besoin d'un dispositif cible afin d'exécuter vos tests comme s'il s'agissait de tests instrumentés. Pour certaines raisons, Android studio parfois ne vous demande pas de pointer vers ce périphérique cible et affiche le message "Empty Test Suite". Il existe différentes façons de résoudre ce problème, en voici quelques-unes :

  • exécuter votre application principale et sélectionner un appareil cible ou

  • allez dans la configuration Run (Run/Run.../Edit Configurations) et modifiez l'onglet Options de cible de déploiement

3voto

Pablo Points 482

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).

Le fait de le commenter a résolu le problème pour moi.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X