web-dev-qa-db-fra.com

Le studio Android dit "Vide Test Suite" pour AndroidTestCase

J'ai créé un exemple de scénario de test qui étend AndroidTestCase. Lorsque je lance le scénario de test,

Running tests
Test running startedTest running failed: 
Instrumentation run failed due to 'Java.lang.RuntimeException'
Empty test suite.

Le cas test

import Android.test.AndroidTestCase;
import Android.test.suitebuilder.annotation.SmallTest;

import static org.junit.Assert.assertEquals;

import org.junit.AfterClass;
import org.junit.BeforeClass;
import org.junit.Test;

import Java.lang.Exception;
import Java.lang.Override;

public class DateFormatTest extends AndroidTestCase{

    @Override
    protected void setUp() throws Exception {
        super.setUp();
    }

    @Override
    protected void tearDown() throws Exception {
        super.tearDown();
    }

    public DateFormatTest(){
        super(DateFormatTest.class);
    }


    @SmallTest
    public void testMultiply() {

        assertEquals("10 x 5 must be 50", 50, 10*5);
    }
}
35
Pratik Mandrekar

Comme personne ne le mentionne, les méthodes des sous-classes AndroidTestCase doivent être public et avoir des noms commençant par "test"!

Le PO et les réponses ont tous bien compris, mais je l’ai raté et j’ai eu exactement la même erreur.

16
Toerndev

J'ai eu cette erreur lors de l'exécution de tests à partir d'Android Studio. Il s'est avéré que j'avais placé mes cas de test dans le mauvais dossier. Lors de l'exécution de Gradle/Android Studio, tous les tests Android doivent figurer dans le dossier src/instrumentTest/Java.

Edit: Dans Gradle plugin version 0.9 ou ultérieure, le nom correct du dossier est androidTest. ( http://tools.Android.com/tech-docs/new-build-system/migrating_to_09 )

12
emidander

Je comprends que cette question est ancienne et que les outils de développement ont considérablement changé depuis que cette question a été posée.

Cependant, j'avais un problème similaire (dans AndroidStudio 2.1.1) et il s'est avéré que le message d'erreur était tout à fait trompeur. Pour moi, il a dit: 

Test running started
Test running failed: Instrumentation run failed due to 'Java.lang.IllegalStateException'
Empty test suite.

(Remarque: la différence par rapport à la question initiale réside dans IllegalStateException et RuntimeException.)

Il s'est avéré que cette IllegalStateException avait été lancée lors de l'initialisation du contexte de l'application, comme le montre l'inspection de la sortie logcat. En conséquence, aucune méthode de test n'a été exécutée et Android Studio écrit cette erreur "Suite de test vide" quelque peu trompeuse.

C'est à dire. "Suite de test vide" peut signifier ce qu'il dit réellement (aucune méthode de test n'a été déclarée, par exemple parce que vous avez oublié de l'annoter avec @Test), mais cela peut également signifier qu'un événement (comme une exception d'exécution levée lors de l'initialisation de votre application code) empêche le testeur d’atteindre les méthodes de test (ce qui semble être votre cas).

Vérifiez adb-logcat et recherchez RuntimeExceptions. Cela vous permettra probablement de trouver la cause fondamentale de votre problème.

9
kuhnmi

J'ai eu cette erreur parce que l'une de mes méthodes de test n'incluait pas "lève exception" après la signature de la méthode. pourrait aider quelqu'un

7
dabluck

J'ai le même problème. J'avais testInstrumentationRunner "Android.support.test.runner.AndroidJUnitRunner" dans mon defaultConfig {...}. Je viens de supprimer cette ligne, et maintenant cela fonctionne correctement (IDE sélectionne la configuration de runner appropriée lors de la compilation). 

J'espère que cela aidera quelqu'un.

6
ahmed_khan_89

Mon problème était que j'avais le constructeur par défaut généré par le studio Android, ressemblait à ceci

public class SomeTest extends ActivityUnitTestCase<ActivityYouWantToTest>{
    public SomeTest(Class<NewsActivity> activityClass) {
        super(activityClass);
    }
}

et je devais le changer pour se débarrasser du problème

public class SomeTest extends ActivityUnitTestCase<ActivityYouWantToTest>{
        public SomeTest() {
            super(ActivityYouWantToTest.class);
        }
    }
5
Lukas Hanacek

Nous utilisons la classe AndroidTestCase pour définir que nous testons des composants spécifiques à Android. Le principal avantage de AndroidTestCase est qu’il nous donne accès aux ressources de l’application, telles que les chaînes et les mises en page, etc.

AndroidTestCase ne vous oblige pas à écraser le constructeur par défaut car il ne fournit pas une Activity particulière en tant que Context, mais vous en fournit plutôt un général afin que vous puissiez toujours appeler getContext().

Dans votre exemple, vous n'utilisez aucun composant Android. Par conséquent, les éléments suivants auraient du sens:

import Android.test.suitebuilder.annotation.SmallTest;

import junit.framework.TestCase;

public class DateFormatTest2 extends TestCase {

    @SmallTest
    public void testMultiply() {

        assertEquals("10 x 5 must be 50", 50, 10 * 5);
    }
}

Notez l'utilisation de TestCase plutôt que AndroidTestCase.

Pour que AndroidTestCase soit applicable, un test nécessitant des ressources serait nécessaire:

import Android.test.AndroidTestCase;
import Android.test.suitebuilder.annotation.SmallTest;

public class DateFormatTest extends AndroidTestCase {

    @SmallTest
    public void testAppTitle() {
        assertEquals("MyApp", getContext().getResources().getString(R.string.app_name));
    }
}

Ici, nous utilisons la variable AndroidTestCase car nous devons accéder aux ressources de l'application.

3
MariusVolkhart

Avez-vous configuré votre testRunner dans votre gradleConfig? Nous utilisons différents TestRunners pour différents tests (pour accélérer les choses. Ma configuration ressemble à ceci

Android {    
// Some stuff      
  defaultConfig {
        // Some other stuff

        //junit test
        testInstrumentationRunner "de.qabel.qabelbox.QblJUnitRunner"
        //ui tests
        testInstrumentationRunner "Android.support.test.runner.AndroidJUnitRunner"   
    }  
}

Si je désactive une de ces lignes, le test correspondant signalera également "Suite de test vide".

1
r-hold

Je viens tout juste d’apprendre à tester des applications Android et j’ai eu le même problème. 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);
    }
}
0
nitesh goel

J'ai déjà un constructeur par défaut dans mon cas de test, mais il me donnait toujours l'erreur "Suite de test vide" et j'étais bloqué dans "Instanciation des tests ...".

J'ai essayé de créer un nouvel espace de travail, de réinitialiser Android Studio, mais cela n'a pas fonctionné.

Enfin, fermez SDK et émulateur Android.

  1. Allez sur votre Android-sdks/platform-tools.

  2. Effacer tous les fichiers temporaires Android avec ces commandes:

    une. rm -rf ~/Library/Application Support/AndroidStudio

    b. rm -rf ~/Library/Caches/AndroidStudio

    c. rm -rf ~/Library/Application Support/AndroidStudio

    ré. rm -rf ~/Library/Preferences/AndroidStudio

  3. Courir:

    ./adb kill-server
    ./adb start-server
    
  4. Démarrez Android et exécutez le scénario de test.

0
StackTrace