web-dev-qa-db-de.com

Android Studio sagt "Empty Test Suite" für AndroidTestCase

Ich habe einen Beispieltestfall erstellt, der AndroidTestCase erweitert. Wenn ich den Testfall ausführe, wird __

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

Der Testfall

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

Da sonst niemand es erwähnt: Methoden in AndroidTestCase-Unterklassen müssen public sein und Namen haben, die mit "test" beginnen!

Das OP und die Antworten haben alles richtig gemacht, aber ich habe es verpasst und genau den gleichen Fehler erhalten.

16
Toerndev

Ich habe diesen Fehler beim Ausführen von Tests von Android Studio erhalten. Es stellte sich heraus, dass ich meine Testfälle im falschen Ordner abgelegt hatte. Wenn Sie Gradle/Android Studio ausführen, sollten sich alle Android-Tests im Ordner src/instrumentTest/Java befinden.

Edit: In Gradle Plugin Version 0.9 oder höher lautet der korrekte Name des Ordners androidTest. ( http://tools.Android.com/tech-docs/new-build-system/migrating_to_09 )

12
emidander

Ich verstehe, dass diese Frage alt ist und sich die Entwicklungstools seit der Fragestellung erheblich verändert haben.

Ich hatte jedoch ein ähnliches Problem (in AndroidStudio 2.1.1) und es stellte sich heraus, dass nur die Fehlermeldung ziemlich irreführend war. Für mich heißt es: 

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

(Hinweis: Der Unterschied zur ursprünglichen Frage liegt in der IllegalStateException im Vergleich zur RuntimeException.)

Es stellte sich heraus, dass diese IllegalStateException tatsächlich in der Initialisierung des Anwendungskontexts geworfen wurde, wie durch die Überprüfung der logcat-Ausgabe ersichtlich wird. Daher wurden keine Testmethoden ausgeführt, und Android Studio schreibt diesen etwas irreführenden Fehler "Leere Testsuite".

Das heißt "Leere Testsuite" kann bedeuten, was tatsächlich gesagt wird (Sie haben keine Testmethoden deklariert, z. B. weil Sie vergessen haben, sie mit @Test zu kommentieren), dies kann jedoch auch etwas bedeuten (z. B. eine Laufzeitausnahme in Ihrer Anwendungsinitialisierung Code) verhindert, dass der Testläufer eine Testmethode erreicht (was in Ihrem Fall der Fall ist).

Überprüfen Sie adb-logcat und suchen Sie nach RuntimeExceptions. Dies wird wahrscheinlich die Ursache des Problems sein.

9
kuhnmi

Ich habe diese Fehlermeldung erhalten, weil eine meiner Testmethoden nach der Methodensignatur keine "Ausnahmebedingung" enthielt. könnte jemandem helfen

7
dabluck

Ich habe das gleiche Problem. Ich hatte testInstrumentationRunner "Android.support.test.runner.AndroidJUnitRunner" in meinem defaultConfig {...}. Ich habe gerade diese Zeile entfernt, und jetzt funktioniert sie gut (Die IDE wählt die richtige Läufer-Konfiguration zum Zeitpunkt der Erstellung aus). 

Ich hoffe das hilft jemandem.

6
ahmed_khan_89

Mein Problem war, dass ich einen Standardkonstruktor hatte, der von Android Studio generiert wurde

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

und ich musste es ändern, um das Problem zu lösen

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

Wir verwenden die AndroidTestCase-Klasse, um zu definieren, dass wir Android-spezifische Komponenten testen. Der Hauptvorteil von AndroidTestCase besteht darin, dass wir auf die Ressourcen der Anwendung wie Zeichenfolgen und Layouts usw. zugreifen können.

Das AndroidTestCase erfordert nicht, dass Sie den Standardkonstruktor überschreiben, da er kein bestimmtes Activity als Context enthält, sondern ein allgemeines Konstrukt, sodass Sie getContext() trotzdem aufrufen können.

In Ihrem Beispiel verwenden Sie keine Android-Komponenten. Für Sie wäre daher Folgendes sinnvoll:

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

Beachten Sie die Verwendung von TestCase anstelle von AndroidTestCase.

Damit AndroidTestCase anwendbar ist, wäre ein Test erforderlich, der Ressourcen erfordert:

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

Hier verwenden wir AndroidTestCase, da wir auf die Ressourcen der Anwendung zugreifen müssen.

3
MariusVolkhart

Dieses Handbuch könnte helfen - http://www.slideshare.net/tobiaspreuss/how-to-setup-unit-testing-in-Android-studio

Auf dem neuesten Gradle (0.9+) sollte der Test unter androidTest dir liegen

Auch in deinem gradle.build:

dependencies {
     androidTestCompile 'junit:junit:4.+'
}

fügen Sie diese auch unter defaultConfig {hinzu.

testPackageName "test.Java.foo"
testInstrumentationRunner "Android.test.InstrumentationTestRunner"

}

1
Gal Bracha

Haben Sie Ihren TestRunner in Ihrer gradleConfig konfiguriert? ... Wir verwenden verschiedene TestRunner für verschiedene Tests (zur Beschleunigung)

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

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

Wenn ich eine dieser Zeilen deaktiviere, meldet der entsprechende Test auch "Empty Test Suite".

1
r-hold

Ich habe gerade angefangen, Android-Anwendungen zu testen, und ich habe mit dem gleichen Problem zu kämpfen. Sie müssen einen Standardkonstruktor für Ihre Testklasse angeben. Beispiel:

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

Ich habe bereits einen Standardkonstruktor in meinem Testfall, aber es gab immer noch den Fehler "Leere Testsuite" und blieb bei "Instantiating Tests ..." hängen.

Ich habe versucht, einen neuen Arbeitsbereich zu erstellen, Android Studio zurückzusetzen, aber das hat nicht funktioniert.

Schließen Sie schließlich das Android SDK und den Emulator.

  1. Gehen Sie zu Ihren Android-SDKs/Plattform-Tools.

  2. Löschen Sie alle Android-Temp-Dateien mit diesen Befehlen:

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

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

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

    d. rm -rf ~/Library/Preferences/AndroidStudio

  3. Lauf:

    ./adb kill-server
    ./adb start-server
    
  4. Starten Sie Android und starten Sie den Testfall.

0
StackTrace