Dlaczego program uruchamiający testy Androida zgłasza „Pusty zestaw testów”?

98

Uderzam głową w ścianę, próbując dowiedzieć się, dlaczego IntelliJ / Android zgłasza „Pusty zestaw testów”. Mam mały projekt z dwoma modułami IntelliJ („Projekty” w Eclipse). Moduł testów jednostkowych ma swój własny plik AndroidManifest.xml, który wkleiłem na dole. Próbuję uruchomić ActivityUnitTestCase, ponieważ testy będą zależne od Context-obiektu.

Nazwa pakietu głównego modułu to nilzor.myapp. Nazwa pakietu modułu testowego tonilzor.myapp.tests

Dlaczego testBlah()uruchamiający testy nie wykrywa metody -metody jako testu?

<?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>

A oto moja klasa testowa :;

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

Znam podstawy badań , na aktywność testowania dokumentu i próbowała po tym Witam testowym blogu świat , mimo że jest dla Eclipse. Nie mogę zmusić biegacza testów do znalezienia i uruchomienia mojego testu. Co ja robię źle?

Niektóre z pytań, których nadal nie jestem pewien, to:

  1. Czy potrzebuję adnotacji powyżej metody testu jednostkowego?
  2. Czy muszę poprzedzać metodę ciągiem „test”, czy jest to tylko dla testów JUnit?
  3. Czy mogę mieć testy w pod-pakietach nilzor.myapp.tests?

Ale główne pytanie tego posta brzmi: dlaczego tester nie wykrywa mojego testu ?

Nilzor
źródło
W punkcie 3, jeśli używasz Android Studio, polecam cmd+shift+tskrót, który automatycznie utworzy klasę testową w poprawnej lokalizacji pakietu, która odpowiada klasie, którą aktualnie edytujesz.
David Argyle Thacker
Na wypadek, gdyby ktoś inny był tak samo nieobecny jak ja. Upewnij się, że nie zapomniałeś umieścić @Testznacznika na górze testu.
Matt D

Odpowiedzi:

70

Musisz podać domyślny konstruktor dla swojej klasy testowej, na przykład:

package nilzor.myapp.tests;

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

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

o innych pytaniach:

  1. Nie. Moje testy nadal działają bez adnotacji, ale myślę, że warto je mieć. Pozwala określić rozmiar testów do uruchomienia. Zobacz, jaki jest cel adnotacji @SmallTest, @MediumTest i @LargeTest w systemie Android? aby uzyskać więcej szczegółów.

  2. Tak, potrzebujesz prefiksu „test”. InteliJ daje ostrzeżenie „metoda nigdy nie używana”, gdy nie ma przedrostka „test” i pomija tę metodę podczas wykonywania testu.

  3. Tak. Moje testy są podzielone na podpakiety i wygląda na to, że działają dobrze.

lmac
źródło
5
Nie jest to konieczne, jeśli używasz ActivityTestRule
Yair Kukielka
Dodanie domyślnego konstruktora wykonało pracę za mnie.
Dragan Marjanović
54

Jeśli dzieje się to „nagle” lub „działało 5 minut temu”, moim rozwiązaniem było przejście do konfiguracji uruchamiania / debugowania i usunięcie wszelkich konfiguracji w sekcji „Testy Androida”. Czasami te konfiguracje ulegają uszkodzeniu, jeśli dokonam refaktoryzacji testowanej klasy (na przykład przenosząc się do nowego pakietu).

wprowadź opis obrazu tutaj

tir38
źródło
To zadziałało dla mnie. Pojawiał się błąd „Pusty pakiet testów”. Mogło tak być, ponieważ dodałem PowerMockito po początkowym utworzeniu konfiguracji.
Ajith Memana
Często mam ten i inne problemy z uruchamianiem testów, w których konfiguracje kompilacji działały poprawnie wcześniej. Udało mi się je naprawić, stosując to podejście.
stevehs17
3
Po usunięciu konfiguracji, klikam prawym przyciskiem myszy pakiet testowy w eksploratorze projektów (widok Androida) i wybieram Create 'Tests in XXX...- potem znów zadziałało
TmTron
9

Żadne z powyższych nie naprawiało tego dla mnie. Pomogło przestrzeganie instrukcji :

Utwórz konfigurację testową

W Android Studio:

  • Otwórz menu Uruchom -> Edytuj konfiguracje
  • Dodaj nowe testy Androida konfigurację
  • Wybierz moduł
  • Dodaj konkretny biegacz oprzyrządowania:

  android.support.test.runner.AndroidJUnitRunner

Uruchom nowo utworzoną konfigurację.

serv-inc
źródło
6

Miałem podobny problem. Nie wiem, dlaczego tak się dzieje, ale udało mi się to naprawić, przechodząc do: „Plik”> „Unieważnij pamięć podręczną / Uruchom ponownie” w Android Studio.

Jeff Stapleton
źródło
To rozwiązało problem, gdy po refaktoryzacji nazwy mojej klasy testowej pojawił się ten sam błąd co OP.
Marco
4

Nie wiem, czy to pomaga w Android Studio, ale miałem jakiś konflikt Intellij-Gradle. Rozwiązano to przez „kliknięcie prawym przyciskiem myszy” na pliku testowym i naciśnięcie „kompiluj plik ... Test.java”. Potem mogłem ponownie przeprowadzić pojedyncze testy.

kotliński
źródło
2
Gdzie jest ten „plik kompilacji” na * Test.java? Jaka wersja Android Studio?
Mark Lapasa
Jak próbowałem powiedzieć powyżej, nie używam Android Studio. Używam profesjonalnego Intellij 15. obraz menu rozwijanego po kliknięciu prawym przyciskiem myszy <- Tutaj wkleiłem obraz.
kotliński
4

Miałem ten sam problem na Android Studio 2.3.1, okazuje się, że to tylko błąd z AS. Uruchomienie tego samego testu w wersji 2.2.1 działa dobrze.

Jeśli używasz tylko Android Studio na kanale Cannary, polecam również zainstalowanie stabilnej wersji. http://tools.android.com/tips/using-multiple-android-studio-versions

David Argyle Thacker
źródło
U mnie to samo, stabilny 3.1.2 działa, 3.2 canary 15 nie.
arekolek
3

Miałem testy, które działały dobrze, dopóki gradleAndroid Studio nie zostało zaktualizowane.

Oprócz dodania domyślnego konstruktora do testów, może być konieczne wykonanie niektórych z tych czynności, aby zestaw testów działał

W trakcie src/tworzenia androidTest/java/<your-package-name>/test. Zwróć uwagę na androidTest. Cokolwiek innego, w tym instrumentTestnie będzie działać.

Dodaj to do 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

Dodaj to do AndroidManifest.xml

 <instrumentation
        android:name="android.test.InstrumentationTestRunner"
        android:label="Tests for my packaged app"
        android:targetPackage="<my-package-name>.test" />
Pratik Mandrekar
źródło
3

W przypadku Intellij 15 rozwiązałem ten problem przez:

  1. Otwieranie ustawień „Struktura projektu”
  2. Kliknięcie „Moduły” (po lewej)
  3. Karta „Źródła”
    a. Kliknij prawym przyciskiem myszy katalog źródłowy (zwykle src) i kliknij „Źródło”.
    b. Kliknij prawym przyciskiem myszy katalog testów i kliknij „Testuj”
    . C. Kliknij prawym przyciskiem myszy katalog wyjściowy i kliknij „Wykluczone”
  4. Przejdź do zakładki „Ścieżki”
    a. Kliknij przycisk opcji „Użyj ścieżki wyjściowej kompilacji modułu”
    . B. Wybierz katalog ścieżki wyjściowej dla `` Ścieżki wyjściowej ''
    . C. Wybierz katalog ścieżki testowej dla opcji „Ścieżka wyjściowa testu”
  5. Kliknij OK
Marquis Blount
źródło
3

Oczywiście do uruchomienia testów potrzebne jest urządzenie docelowe, ponieważ są to testy instrumentalne. Z pewnych powodów Android studio czasami nie prosi o wskazanie tego urządzenia docelowego i po prostu wyświetla komunikat „Opróżnij pakiet testowy”. Można to naprawić na różne sposoby. Oto kilka:

  • uruchom swoją główną aplikację i wybierz urządzenie docelowe lub

  • przejdź do konfiguracji Uruchom (Uruchom / Uruchom ... / Edytuj konfiguracje) i zmodyfikuj opcje celu wdrożenia

user2243632
źródło
Tylko po to, żeby komuś pomóc, jeśli spróbuje twojego rozwiązania. W moim przypadku musiałem najpierw uruchomić aktualną aplikację na urządzeniu / emulatorze, a potem mój AndroidTest mógł zobaczyć urządzenie, na którym można przeprowadzić testy. Potem wszystko działało. Dając plus jeden za odpowiedź.
A_P
2

W moim przypadku żadna z poprzednich odpowiedzi nie zadziałała. Rozwiązaniem było po prostu przeniesienie klasy testowej do innego pakietu .

Stało się to pod androidTest/

Mateus Gondim
źródło
2

W moim przypadku ten problem był spowodowany błędem w moim kodzie, w rzeczywistości to było w klasie aplikacji, więc działanie docelowe nie zostało otwarte i testowe wydruki wyjściowe

Błąd pustego zestawu testów

Próbowałem uruchomić testy bezpośrednio z terminala z adb shell am instrument -w -r -e package your.package -e debug false android.support.test.runner.AndroidJUnitRunner. Dzięki temu drukuje dla Ciebie znacznie więcej o wyjątku.

Beloo
źródło
2

Miałem ten problem, ponieważ miałem to w moim build.gradle:

testOptions {
    execution "ANDROID_TEST_ORCHESTRATOR"
}

Mimo że nie korzystałem z narzędzia Android Test Orchestrator (musiał przez pomyłkę skopiować samouczki).

Komentowanie tego rozwiązało problem.

Pablo
źródło
1

Żadne z innych rozwiązań nie działało dla mnie, ale udało mi się to uzyskać, po prostu odinstalowując istniejącą aplikację lub zestaw testów, a następnie uruchamiając testy.

Phil
źródło
To mi pomogło. Wprowadziłem zmiany na poziomie bazy danych przed uruchomieniem testu, więc klasa w teście instrumentalnym nie mogła działać. To dziwne, że Android Studio wyświetla tak nieistotny komunikat.
PetroCliff
1

W moim przypadku projekt, nad którym pracowałem, miał kilka modułów. Żadne z rozwiązań, które znalazłem dla tego błędu, nie pomogło mi, a potem jakoś zdałem sobie sprawę, że jeśli dodam zależności testowe w OBU plikach build.gradle, testy magicznie zaczęły działać. Nie ma znaczenia, czy twoje testy znajdują się tylko w jednym module, oba pliki gradle muszą zawierać zależności i wartość testInstrumentationRunner.

Tak więc, jeśli tak jak ja, żadna z pozostałych odpowiedzi ci nie pomogła, spróbuj dodać te wiersze do pliku build.gradle każdego z modułów:

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

a następnie dodaj:

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
źródło
1

Właśnie zmieniłem nazwę pliku i problem został rozwiązany.

Lyn
źródło
1

Miałem ten sam problem, a powodem było to, że moja klasa testowa nie miała Test na końcu nazwy klasy!

Janin
źródło
1

Mój problem został spowodowany zgłoszeniem wyjątku w @BeforeClass metodzie mojego przypadku testowego. W pewnym sensie nie powodowało to niepowodzenia testu - znalazłem to tylko przez sprawdzenie wyjścia logcat.

Naprawiłem wyjątek i nagle moje testy zaczęły działać!

wstrząsający
źródło
dla mnie to samo. Wygląda na to, że wyjątki w BeforeClass nie są poprawnie wyświetlane w panelu uruchamiania
David Refaeli
1

Po dzisiejszym rozwiązaniu problemu - braku możliwości uruchomienia zinstrumentowanych testów Androida z błędem Empty suite - znalazłem problem z gitem dotyczący tego problemu i dzięki Stephanowi Linznerowi mogłem przeprowadzić testy.

tl; dr Musisz kliknąć prawym przyciskiem myszy pakiet testowy, a nie klasę, aby uruchomić testy.

Źródła: https://github.com/googlecodelabs/android-testing/issues/27#issuecomment-219074863

Francisco Junior
źródło
0

Ten artykuł mi pomógł: Pusty zestaw testów

Zasadniczo musiałem stworzyć pakiet - instrumentTest / java - w moim katalogu src i umieścić tam wszystkie testy. Wtedy mogłem wykonać te testy indywidualnie.

IgorGanapolsky
źródło
0

Miałem surowy projekt Java, w którym to się działo. Po prostu Java + JUnit4. Z pewnością znajduje się w czymś w twoich plikach .idea / lub .iml. Wyrzuciłem swoją, ponownie zaimportowałem i wreszcie testy zostały ponownie uruchomione.

cdaringe
źródło
0

Klasa testowa może zostać wyłączona z kompilacji. Napraw to w setting-compiler-exclude.

petertc
źródło
0

Oto moje kroki debugowania, przez które przechodzę, gdy Android Studio nagle decyduje się przestać uruchamiać / debugować testy (i chłopcze zdarza się to żenująco często !!):

  • Kompilacja: → Przebuduj projekt
  • Zrestartuj urządzenie: Uruchom ponownie urządzenie / emulator i spróbuj ponownie
  • Zmiana urządzenia: jeśli masz zarówno zwykły telefon, jak i emulator, odłącz jeden i spróbuj uruchomić go tylko z jednym z urządzeń
  • Android Studio: Plik -> Unieważnij pamięć podręczną i uruchom ponownie
  • Monitor aktywności / Menedżer zadań: sortuj procesy według nazwy, zobacz, czy istnieje bezimienny proces, który zużywa dużo pamięci RAM, jest to proces „widmo” ze studia Android, który należy zabić
  • git revert: spróbuj ukryć / przywrócić swój najnowszy kod. Czasami pojawia się błąd kompilacji, który pomija Android Studio / gradle i po prostu spróbuje uruchomić niekompilowalny kod.
  • Odinstaluj, a następnie ponownie zainstaluj Android Studio.

Dodam więcej poprawek, gdy je napotkam!

gorbysbm
źródło
0

Nic nie zrobiłem i problem zniknął po pół dnia bólu, wielokrotnie otwierałem i zamykałem projekty, przeprowadzałem testy każdej klasy ręcznie, może to naprawiło.

Gary Davies
źródło
0

W Android Studio z frameworkiem Spock zmieniłem wersję mojego gradle z 2.2.2 na 3.2.1 i wszystko idzie dobrze.

Psijic
źródło
0

Zaakceptowana odpowiedź nie rozwiązała mojego problemu. Postanowiłem więc skopiować, ExampleInstrumentedTestktóry jest domyślnie tworzony w Android Studio i działa bez żadnych problemów, zmieniłem jego nazwę podczas procesu kopiowania (brak Refactor-> Zmień nazwę po skopiowaniu!) I wkleiłem do niego zawartość mojego testu jednostkowego. Po tym błąd zniknął.

ka3ak
źródło
0

Wystąpił błąd „Pusty zestaw testów” podczas próby uruchomienia lokalnych testów jednostkowych w moim projekcie Android Studio 3.0.

Po przeczytaniu dokumentacji programisty Androida szybko zdałem sobie sprawę, że problem był spowodowany przez moją konfigurację gradle, która zawierała następujące wiersze.

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

Klasa AndroidJUnitRunner to narzędzie do uruchamiania testów JUnit, które umożliwia uruchamianie klas testowych w stylu JUnit 3 lub JUnit 4 na urządzeniach z systemem Android .

Ponieważ moje testy były lokalne, a zatem nie wymagały uruchamiania na żadnym urządzeniu, usunięcie powyższych wpisów com.android.support.test ... umożliwiło mi wykonanie testów jednostkowych.

Will P
źródło
0

Robiłem kilka wstawek w bazie danych w metodzie @BeforeClass. Uświadomiłem sobie, że mam problem z mapowaniem obiektu / bazy danych. Ten problem z mapowaniem danych był dla mnie przyczyną tego problemu.

Laurent
źródło
0

W moim przypadku przeprowadziłem testy z oprzyrządowaniem androidTest/java/<package.name>/MyTestingClass, ale ustawiłem obecny wariant kompilacji na „przedprodukcję”. I o to chodzi! Jak określono w dokumentacji Android Studio :

Domyślnie wszystkie testy są uruchamiane dla typu kompilacji debugowania.

Wiadomość Class not found. Empty test suite.pojawiała się, dopóki nie zrobiłem tego:

  1. Dodaj tę linię do mojego build.gradle :

    android{
        [...]
        testBuildType "preproduction"
    }
  2. Zsynchronizowana nachylenie.
  3. Usuń moje poprzednie konfiguracje testowe, ponieważ nie uwzględniają one tej synchronizacji Gradle.

Następnie ponownie wykonałem testy i tym razem działają idealnie !!!

Juan José Melero Gómez
źródło
0

Przydarzyło mi się to, gdy omyłkowo oznaczyłem adnotacją inną niż pozorowana zmienna klasy. @Mock Usunięto adnotację i testy przebiegły pomyślnie. Stało się to w przypadku Junit 4.5 w Android Studio

Mihir
źródło
0

Nie jest to rozwiązanie, ale obejście, które szybko przywróci Cię na właściwe tory:

  1. Po pierwsze, znajdź test, który działa. Pisałem nowy test, w którym wystąpił błąd „pusty zestaw testów”. Przeprowadziłem inne testy i działały jak zwykle.

  2. Skopiuj plik testowy, który działa. Uruchom go, aby upewnić się, że ta kopia działa jak oryginał.

  3. Usuń korpus i zastąp go nowym kodem testu.

Test powinien teraz działać.

Spędziliśmy około dwóch godzin, próbując znaleźć przyczynę, ale bezskutecznie.

xavierdominguez
źródło