Warum meldet der Android-Testläufer "Leere Testsuite"?

98

Ich stoße hier mit dem Kopf gegen die Wand und versuche herauszufinden, warum IntelliJ / Android "Leere Testsuite" meldet. Ich habe ein kleines Projekt mit zwei IntelliJ-Modulen ("Projekte" in Eclipse). Das Unit-Test-Modul hat eine eigene AndroidManifest.xml, die ich unten eingefügt habe. Ich versuche ein auszuführen ActivityUnitTestCase, da die Tests vom Context-Objekt abhängen .

Der Paketname des Hauptmoduls lautet nilzor.myapp. Der Paketname des Testmoduls lautetnilzor.myapp.tests

Warum erkennt der Testläufer die testBlah()Methode nicht als 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>

Und hier ist meine Testklasse:;

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

Ich habe die Testgrundlagen und das Dokument zum Testen von Aktivitäten gelesen und versucht, diesem Hello World-Testblog zu folgen , obwohl es für Eclipse ist. Ich kann den Testläufer nicht dazu bringen, meinen Test zu finden und auszuführen. Was mache ich falsch?

Einige der Fragen, bei denen ich mir immer noch unsicher bin, sind:

  1. Benötige ich eine Anmerkung über der Unit-Testmethode?
  2. Muss ich der Methode "test" voranstellen, oder ist das nur für JUnit-Tests?
  3. Kann ich Tests in Unterpaketen von haben nilzor.myapp.tests?

Die Hauptfrage dieses Beitrags ist jedoch, warum der Testläufer meinen Test nicht erkennt .

Nilzor
quelle
Für Punkt 3 empfehle ich bei Verwendung von Android Studio die cmd+shift+tVerknüpfung, mit der automatisch eine Testklasse am richtigen Paketspeicherort erstellt wird, der der Klasse entspricht, die Sie gerade bearbeiten.
David Argyle Thacker
Nur für den Fall, dass jemand anderes so abwesend ist wie ich. Stellen Sie sicher, dass Sie nicht vergessen haben, den @TestMarker auf den Test zu setzen.
Matt D

Antworten:

70

Sie müssen einen Standardkonstruktor für Ihre Testklasse angeben, zum Beispiel:

package nilzor.myapp.tests;

public class NilzorSomeTest extends ActivityUnitTestCase<ActivityYouWantToTest>{
    public NilzorSomeTest(){
        super(ActivityYouWantToTest.class);
    }

    @SmallTest
    public void testBlah(){
        assertEquals(1,1);
    }
}

zu Ihren anderen Fragen:

  1. Nein. Meine Tests werden immer noch ohne Anmerkungen ausgeführt, aber ich denke, es ist eine gute Praxis, sie zu haben. Hier können Sie die Größe der auszuführenden Tests festlegen. Siehe Was ist der Zweck der Anmerkungen @SmallTest, @MediumTest und @LargeTest in Android? für mehr Details.

  2. Ja, Sie benötigen das Präfix "Test". InteliJ gibt die Warnung "Methode nie verwendet" aus, wenn kein "Test" -Präfix vorhanden ist, und überspringt diese Methode während des Testlaufs.

  3. Ja. Ich habe meine Tests in Unterpaketen organisiert und es scheint gut zu funktionieren.

lmac
quelle
5
Dies ist nicht erforderlich, wenn Sie ActivityTestRule
Yair Kukielka
Das Hinzufügen eines Standardkonstruktors hat den Job für mich erledigt.
Dragan Marjanović
54

Wenn dies "plötzlich" passiert oder "es hat vor 5 Minuten funktioniert", bestand meine Lösung darin, in die Run / Debug-Konfigurationen zu wechseln und alle Konfigurationen unter "Android-Tests" zu entfernen. Manchmal werden diese Konfigurationen beschädigt, wenn ich die zu testende Klasse umgestalte (z. B. durch Wechseln zu einem neuen Paket).

Geben Sie hier die Bildbeschreibung ein

tir38
quelle
Das hat bei mir funktioniert. Ich habe den Fehler "Leere Testsuite" erhalten. Es könnte sein, dass ich PowerMockito hinzugefügt habe, nachdem die Konfiguration ursprünglich erstellt wurde.
Ajith Memana
Ich habe häufig dieses und andere Probleme beim Ausführen von Tests, bei denen Build-Konfigurationen früher ordnungsgemäß funktionierten. Ich konnte sie mit diesem Ansatz beheben.
stevehs17
3
Nachdem ich die Konfigurationen gelöscht habe, klicke ich mit der rechten Maustaste auf ein Testpaket im Projektexplorer (Android-Ansicht) und wähle Create 'Tests in XXX...- dann hat es wieder funktioniert
TmTron
9

Keiner der oben genannten Punkte hat es für mich behoben. Was half, war die Befolgung der Anweisungen :

Erstellen Sie eine Testkonfiguration

In Android Studio:

  • Öffnen Sie das Menü Ausführen -> Konfigurationen bearbeiten
  • Fügen Sie eine neue Android Tests- Konfiguration hinzu
  • Wählen Sie ein Modul
  • Fügen Sie einen bestimmten Instrumentierungsläufer hinzu:

  android.support.test.runner.AndroidJUnitRunner

Führen Sie die neu erstellte Konfiguration aus.

serv-inc
quelle
6

Ich hatte ein ähnliches Problem. Ich bin mir nicht sicher, warum dies auftritt, aber ich konnte es beheben, indem ich in Android Studio zu "Datei"> "Caches ungültig machen / neu starten" ging.

Jeff Stapleton
quelle
Dies hat es für mich behoben, als ich nach dem Umgestalten des Namens meiner Testklasse den gleichen Fehler wie OP bekam.
Marco
4

Ich weiß nicht, ob es für Android Studio hilft, aber ich hatte eine Art Intellij-Gradle-Konflikt. Es wurde gelöst, indem Sie mit der rechten Maustaste auf die Testdatei klicken und auf "Datei kompilieren ... Test.java" klicken. Danach konnte ich wieder einzelne Tests durchführen.

Kotlinski
quelle
2
Wo ist diese "Kompilierungsdatei" auf einer * Test.java? Welche Version von Android Studio?
Mark Lapasa
Wie ich oben versucht habe, verwende ich Android Studio nicht. Ich benutze Intellij 15 professionell. Bild von Rechtsklick-Dropdown <- Ich habe hier ein Bild eingefügt.
Kotlinski
4

Ich hatte das gleiche Problem unter Android Studio 2.3.1, es stellte sich heraus, dass es nur ein Fehler mit AS war. Das Ausführen des gleichen Tests in Version 2.2.1 funktioniert einwandfrei.

Wenn Sie Android Studio nur auf dem Cannary-Kanal ausführen, empfehle ich Ihnen, auch eine stabile Version zu installieren. http://tools.android.com/tips/using-multiple-android-studio-versions

David Argyle Thacker
quelle
Das gleiche gilt für mich, stabil 3.1.2 funktioniert, 3.2 Kanarienvogel 15 nicht.
Arekolek
3

Ich hatte Tests, die gut liefen, bis gradleAndroid Studio aktualisiert wurde.

Abgesehen davon, dass Sie Ihren Tests einen Standardkonstruktor hinzufügen, müssen Sie möglicherweise einige dieser Schritte ausführen, damit Ihre Testsuite funktioniert

Unter src/erstellen androidTest/java/<your-package-name>/test. Beachten Sie die androidTest. Alles andere instrumentTestwird nicht funktionieren.

Fügen Sie dies hinzu 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

Fügen Sie dies dem hinzu AndroidManifest.xml

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

Für Intellij 15 habe ich dieses Problem behoben durch:

  1. Öffnen der Einstellungen für 'Projektstruktur'
  2. Klicken Sie auf "Module" (links)
  3. Registerkarte "Quellen"
    a. Klicken Sie mit der rechten Maustaste auf Ihr Quellverzeichnis (normalerweise src) und klicken Sie auf "Quelle".
    b. Klicken Sie mit der rechten Maustaste auf Ihr Testverzeichnis und klicken Sie auf "Test".
    C. Klicken Sie mit der rechten Maustaste auf Ihr Out-Verzeichnis und klicken Sie auf "Ausgeschlossen".
  4. Gehen Sie zur Registerkarte "Pfade"
    a. Klicken Sie auf das Optionsfeld "Modulausgabepfad verwenden".
    B. Wählen Sie Ihr Ausgabepfadverzeichnis für 'Ausgabepfad' aus.
    C. Wählen Sie Ihr Testpfadverzeichnis für 'Testausgabepfad'.
  5. OK klicken
Marquis Blount
quelle
3

Offensichtlich benötigen Sie ein Zielgerät , um Ihre Tests ausführen zu können, da es sich um instrumentierte Tests handelt. Aus bestimmten Gründen werden Sie von Android Studio manchmal nicht aufgefordert, auf dieses Zielgerät zu zeigen und lediglich die Meldung "Empty Test Suite" aufzurufen. Es gibt verschiedene Möglichkeiten, dies zu beheben. Hier einige Beispiele:

  • Führen Sie Ihre Haupt-App aus und wählen Sie ein Zielgerät oder aus

  • Wechseln Sie zur Konfiguration Ausführen (Ausführen / Ausführen ... / Konfigurationen bearbeiten) und ändern Sie die Bereitstellungszieloptionen

user2243632
quelle
Nur um jemandem zu helfen, wenn er Ihre Lösung ausprobiert. In meinem Fall musste ich zuerst die eigentliche App auf dem Gerät / Emulator ausführen und danach konnte mein AndroidTest das Gerät sehen, auf dem Tests ausgeführt werden sollten. Danach hat alles geklappt. Geben Sie plus eins für die Antwort.
A_P
2

In meinem Fall hat keine der vorherigen Antworten funktioniert. Die Lösung bestand darin , die Testklasse einfach in ein anderes Paket zu verschieben .

Dies geschah unter androidTest/

Mateus Gondim
quelle
2

In meinem Fall wurde dieses Problem durch einen Fehler in meinem Code verursacht, der sich tatsächlich in der Anwendungsklasse befand, sodass die Zielaktivität nicht geöffnet wurde und die Testausgabe gedruckt wurde

Fehler in der leeren Testsuite

Ich habe versucht, Tests direkt vom Terminal mit auszuführen adb shell am instrument -w -r -e package your.package -e debug false android.support.test.runner.AndroidJUnitRunner. Damit druckt es für Sie viel mehr über Ausnahmen.

Beloo
quelle
2

Ich hatte dieses Problem, weil ich dies in meinem build.gradle hatte:

testOptions {
    execution "ANDROID_TEST_ORCHESTRATOR"
}

Auch wenn ich den Android Test Orchestrator nicht verwendet habe (muss versehentlich aus den Tutorials kopiert worden sein).

Das auskommentieren löste es für mich.

Pablo
quelle
1

Keine der anderen Lösungen funktionierte für mich, aber ich konnte dies erreichen, indem ich einfach die vorhandene App oder Testsuite deinstallierte und dann die Tests ausführte.

Phil
quelle
Das hat mir geholfen. Ich habe vor dem Ausführen des Tests Änderungen auf Datenbankebene vorgenommen, sodass die Klasse unter dem instrumentierten Test nicht funktionieren konnte. Es ist seltsam, dass Android Studio eine solche nicht relevante Nachricht anzeigt.
PetroCliff
1

In meinem Fall hatte das Projekt, an dem ich arbeitete, einige Module. Keine der Lösungen, die ich für diesen Fehler gefunden habe, hat mir geholfen, und dann wurde mir irgendwie klar, dass die Tests auf magische Weise funktionierten, wenn ich die Testabhängigkeiten in BEIDEN der build.gradle-Dateien hinzufügte. Es spielt keine Rolle, ob Ihre Tests nur in einem der Module ausgeführt werden. Beide Gradle-Dateien müssen die Abhängigkeiten und den testInstrumentationRunner-Wert enthalten.

Wenn Ihnen also wie mir keine der anderen Antworten geholfen hat, fügen Sie diese Zeilen zur Datei build.gradle jedes Ihrer Module hinzu:

android {    
    ....
    defaultConfig {
        ...
        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
    }  
}

und dann auch hinzufügen:

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'

}
Jorge Salas
quelle
1

Ich habe gerade die Datei umbenannt und das Problem behoben.

Lyn
quelle
1

Ich hatte das gleiche Problem und der Grund war, dass meine Testklasse am Ende des Klassennamens keinen Test hatte!

Janin
quelle
1

Mein Problem wurde durch eine Ausnahme verursacht, die in der @BeforeClassMethode meines Testfalls ausgelöst wurde . Es hat nicht dazu geführt, dass der Test fehlgeschlagen ist - ich habe ihn nur durch Überprüfen der Logcat-Ausgabe gefunden.

Ich habe die Ausnahme behoben und plötzlich liefen meine Tests!

schockierend
quelle
auch für mich. Scheint, dass Ausnahmen in BeforeClass nicht richtig im Run Panel angezeigt werden
David Refaeli
1

Nachdem ich mich heute dem Problem gestellt hatte - ich konnte die instrumentierten Android-Tests nicht mit dem Fehler "Leere Suite" ausführen -, fand ich ein Git-Problem mit diesem Problem und dank Stephan Linzner konnte ich die Tests ausführen.

tl; dr Sie müssen mit der rechten Maustaste auf das Testpaket und nicht auf die Klasse klicken, damit die Tests ausgeführt werden.

Referenz: https://github.com/googlecodelabs/android-testing/issues/27#issuecomment-219074863

Francisco Junior
quelle
0

Dieser Artikel hat mir geholfen: Leere Testsuite

Grundsätzlich musste ich ein Paket - instrumentTest / java - unter meinem src-Verzeichnis erstellen und alle Tests dort ablegen. Dann könnte ich diese Tests einzeln durchführen.

IgorGanapolsky
quelle
0

Ich hatte ein Java-Rohprojekt, in dem dies auftrat. Einfach Java + JUnit4. Es befindet sich definitiv mit etwas in Ihren .idea / oder .iml-Dateien. Ich verschrottete meine, importierte sie erneut und schließlich liefen die Tests erneut.

cdaringe
quelle
0

Die Testklasse kann von der Zusammenstellung ausgeschlossen werden. Korrigieren Sie es in Einstellung-Compiler-Ausschluss.

petertc
quelle
0

Hier sind meine Debugging-Schritte, die ich durchlaufe, wenn Android Studio plötzlich beschließt, das Ausführen / Debuggen von Tests einzustellen (und Junge, das passiert peinlich oft !!):

  • Erstellen: → Projekt neu erstellen
  • Gerät neu starten: Starten Sie Ihr Gerät / Ihren Emulator neu und versuchen Sie es erneut
  • Geräteschalter: Wenn Sie sowohl ein normales Telefon als auch einen Emulator haben, ziehen Sie den Stecker heraus und versuchen Sie, ihn mit nur einem der Geräte auszuführen
  • Android Studio: Datei -> Caches ungültig machen und neu starten
  • Aktivitätsmonitor / Task-Manager: Sortieren Sie Prozesse nach Namen. Überprüfen Sie, ob es namenlose Prozesse gibt, die viel RAM verbrauchen. Dies ist ein "Geister" -Prozess aus Android Studio, der beendet werden muss
  • git revert: Versuchen Sie, Ihren neuesten Code zu speichern / zurückzusetzen. Manchmal gibt es einen Kompilierungsfehler, den Android Studio / gradle übersieht, und es wird nur versucht, nicht kompilierbaren Code auszuführen.
  • Deinstallieren Sie Android Studio und installieren Sie es erneut.

Ich werde weitere Korrekturen hinzufügen, wenn ich auf sie stoße!

gorbysbm
quelle
0

Ich habe nichts getan und das Problem ist nach einem halben Tag voller Schmerzen verschwunden. Ich habe die Projekte viele Male geöffnet und geschlossen, jeden Klassentest manuell durchgeführt, vielleicht hat das mein Problem behoben.

Gary Davies
quelle
0

In Android Studio mit Spock Framework habe ich die Version meines Gradles von 2.2.2 auf 3.2.1 geändert und alles läuft gut.

Psijic
quelle
0

Die akzeptierte Antwort hat mein Problem nicht gelöst. Deshalb habe ich mich für das Kopieren entschieden, ExampleInstrumentedTestdas standardmäßig in Android Studio erstellt wurde und problemlos ausgeführt werden kann, es während des Kopiervorgangs umbenannt (kein Refactor-> Nach dem Kopieren umbenennen!) Und den Inhalt meines Komponententests eingefügt. Danach verschwand der Fehler.

ka3ak
quelle
0

Beim Versuch, lokale Komponententests in meinem Android Studio 3.0-Projekt auszuführen, ist der Fehler "Leere Testsuite" aufgetreten.

Nachdem ich die Dokumentation für Android-Entwickler gelesen hatte , stellte ich schnell fest, dass das Problem durch meine Gradle-Konfiguration verursacht wurde, die die folgenden Zeilen enthielt.

testImplementation 'com.android.support.test:runner:0.5'
testImplementation 'com.android.support.test:rules:0.5'

Die AndroidJUnitRunner-Klasse ist ein JUnit-Testläufer, mit dem Sie Testklassen im JUnit 3- oder JUnit 4-Stil auf Android-Geräten ausführen können .

Da meine Tests lokal waren und daher auf keinem Gerät ausgeführt werden mussten, konnte ich durch Entfernen der obigen Einträge com.android.support.test ... die Komponententests ausführen.

Will P.
quelle
0

Ich habe einige Einfügungen in eine Datenbank in der @ BeforeClass-Methode vorgenommen. Mir wurde klar, dass ich ein Problem mit der Objekt- / Datenbankzuordnung hatte. Dieses Datenzuordnungsproblem war für mich die Ursache für dieses Problem.

Laurent
quelle
0

In meinem Fall hatte ich meine instrumentierten Tests in androidTest/java/<package.name>/MyTestingClass, aber ich hatte meine aktuelle Build-Variante auf "Vorproduktion" gesetzt. Und da ist der Punkt! Wie in der Android Studio-Dokumentation angegeben :

Standardmäßig werden alle Tests für den Debug-Build-Typ ausgeführt.

Die Nachricht Class not found. Empty test suite.erschien so lange, bis ich dies tat:

  1. Fügen Sie diese Zeile zu meinem build.gradle hinzu :

    android{
        [...]
        testBuildType "preproduction"
    }
  2. Synchronisierter Gradle.
  3. Löschen Sie meine vorherigen Testkonfigurationen, da diese Gradle-Synchronisation nicht berücksichtigt werden.

Dann habe ich die Tests erneut durchgeführt und diesmal laufen sie einfach perfekt !!!

Juan José Melero Gómez
quelle
0

Dies ist mir passiert, als ich fälschlicherweise eine nicht nachgebildete Klassenvariable mit der Annotation markiert habe. Die Annotation wurde @Mock entfernt und die Tests wurden erfolgreich ausgeführt. Dies geschah mit Junit 4.5 unter Android Studio

Mihir
quelle
0

Keine Lösung, sondern eine Problemumgehung, mit der Sie schnell wieder auf Kurs kommen:

  1. Finden Sie zunächst einen Test, der funktioniert. Ich habe einen neuen Test geschrieben, bei dem der Fehler "Leere Testsuite" angezeigt wurde. Ich habe andere Tests durchgeführt und sie haben wie gewohnt funktioniert.

  2. Kopieren Sie die Testdatei, die funktioniert. Führen Sie es aus, um sicherzustellen, dass diese Kopie wie das Original funktioniert.

  3. Entfernen Sie den Körper und ersetzen Sie ihn durch Ihren neuen Testcode.

Der Test sollte jetzt funktionieren.

Wir haben ungefähr zwei Stunden damit verbracht, die Ursache zu finden, aber ohne Erfolg.

xavierdominguez
quelle