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);
}
}
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.
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 )
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 RuntimeException
s. Dies wird wahrscheinlich die Ursache des Problems sein.
Ich habe diese Fehlermeldung erhalten, weil eine meiner Testmethoden nach der Methodensignatur keine "Ausnahmebedingung" enthielt. könnte jemandem helfen
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.
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);
}
}
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.
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"
}
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".
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);
}
}
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.
Gehen Sie zu Ihren Android-SDKs/Plattform-Tools.
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
Lauf:
./adb kill-server
./adb start-server
Starten Sie Android und starten Sie den Testfall.