Mengapa runner pengujian Android melaporkan "Paket pengujian kosong"?

98

Saya membenturkan kepala saya ke dinding di sini mencoba mencari tahu mengapa IntelliJ / Android melaporkan "Paket pengujian kosong". Saya memiliki proyek kecil dengan dua Modul IntelliJ ("Proyek" di Eclipse). Modul pengujian Unit memiliki AndroidManifest.xml-nya sendiri, yang telah saya tempelkan di bagian bawah. Saya mencoba menjalankan ActivityUnitTestCase, karena pengujian akan bergantung pada Context-objek.

Nama paket dari modul utama adalah nilzor.myapp. Nama pacakge dari modul tes adalahnilzor.myapp.tests

Mengapa runner pengujian tidak mendeteksi testBlah()-method sebagai pengujian?

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

Dan inilah kelas tes saya :;

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

Saya telah membaca dasar-dasar pengujian , dokumen pengujian aktivitas , dan mencoba mengikuti blog pengujian Hello world ini , meskipun itu untuk Eclipse. Saya tidak bisa meminta pelari pengujian untuk menemukan dan menjalankan pengujian saya. Apa yang saya lakukan salah?

Beberapa pertanyaan yang saya masih merasa tidak yakin adalah:

  1. Apakah saya memerlukan Anotasi di atas metode pengujian Unit?
  2. Apakah saya perlu mengawali metode dengan "test", atau apakah itu hanya untuk pengujian JUnit?
  3. Bisakah saya melakukan tes dalam sub-paket nilzor.myapp.tests?

Tetapi pertanyaan utama dari posting ini adalah mengapa runner pengujian tidak mendeteksi pengujian saya ?

Nilzor
sumber
Untuk poin 3, jika Anda menggunakan Android Studio, saya merekomendasikan cmd+shift+tpintasan yang akan membuat kelas pengujian secara otomatis di lokasi paket yang benar yang cocok dengan kelas yang sedang Anda edit.
David Argyle Thacker
Kalau-kalau ada orang lain yang absen ditambang seperti saya. Pastikan Anda tidak lupa meletakkan @Testspidol di atas tes.
Matt D

Jawaban:

70

Anda perlu menyediakan konstruktor default untuk kelas pengujian Anda, misalnya:

package nilzor.myapp.tests;

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

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

tentang pertanyaan Anda yang lain:

  1. Tidak. Pengujian saya masih berjalan tanpa anotasi apa pun, tapi menurut saya praktik yang baik untuk memilikinya. Ini memungkinkan Anda untuk menentukan ukuran pengujian yang akan dijalankan. Lihat Apa tujuan dari anotasi @SmallTest, @MediumTest, dan @LargeTest di Android? untuk lebih detail.

  2. Ya, Anda membutuhkan awalan "test". InteliJ memberikan peringatan "metode tidak pernah digunakan" saat tidak ada awalan "pengujian", dan mengabaikan metode tersebut selama pengujian dijalankan.

  3. Iya. Saya telah mengatur tes saya ke dalam subpaket dan tampaknya bekerja dengan baik.

lmac
sumber
5
Ini tidak diperlukan jika Anda menggunakan ActivityTestRule
Yair Kukielka
Menambahkan konstruktor default melakukan pekerjaan itu untuk saya.
Dragan Marjanović
54

Jika ini terjadi "tiba-tiba" atau "berfungsi 5 menit yang lalu", solusi saya adalah masuk ke konfigurasi Run / Debug dan menghapus konfigurasi apa pun di bawah "Pengujian Android". Terkadang konfigurasi ini rusak jika saya melakukan refaktorisasi kelas yang diuji (misalnya dengan pindah ke paket baru).

masukkan deskripsi gambar di sini

tir38
sumber
Ini berhasil untuk saya. Saya mendapatkan error Empty test suite. Bisa jadi karena saya menambahkan PowerMockito setelah konfigurasi awalnya dibuat.
Ajith Memana
Saya sering mengalami ini dan masalah lain dalam menjalankan pengujian di mana konfigurasi build bekerja dengan baik sebelumnya. Saya dapat memperbaikinya dengan melakukan pendekatan ini.
stevehs17
3
Setelah menghapus konfigurasi, saya klik kanan paket uji di penjelajah proyek (tampilan Android) dan pilih Create 'Tests in XXX...- lalu berfungsi lagi
TmTron
9

Tidak satu pun di atas yang memperbaikinya untuk saya. Apa yang membantu adalah mengikuti instruksi :

Buat konfigurasi pengujian

Di Android Studio:

  • Buka menu Run -> Edit Konfigurasi
  • Tambahkan konfigurasi Android Tests baru
  • Pilih modul
  • Tambahkan runner instrumentasi tertentu:

  android.support.test.runner.AndroidJUnitRunner

Jalankan konfigurasi yang baru dibuat.

serv-inc
sumber
6

Saya memiliki masalah serupa. Tidak yakin mengapa ini terjadi, tetapi saya dapat memperbaikinya dengan membuka: "File"> "Invalidate Caches / Restart" di Android Studio.

Jeff Stapleton
sumber
Ini memperbaikinya untuk saya ketika saya mendapatkan kesalahan yang sama dengan OP setelah memfaktorkan ulang nama kelas uji saya.
Marco
4

Saya tidak tahu apakah ini membantu untuk Android Studio, tetapi saya mengalami semacam konflik Intellij-Gradle. Memecahkannya dengan "mengklik kanan" pada file uji dan tekan "kompilasi file ... Test.java". Setelah itu saya dapat menjalankan tes tunggal lagi.

kotlinski
sumber
2
Di manakah "file kompilasi" ini di * Test.java? Android Studio versi berapa?
Mark Lapasa
Seperti yang saya coba katakan di atas, saya tidak menggunakan Android Studio. Saya menggunakan Intellij 15 proffesional. gambar drop-down klik kanan <- Saya menempelkan gambar di sini.
kotlinski
4

Saya mengalami masalah yang sama di Android Studio 2.3.1, ternyata itu hanya bug dengan AS. Menjalankan pengujian yang sama pada versi 2.2.1 bekerja dengan baik.

Jika Anda hanya menjalankan Android Studio di saluran Cannary, saya sarankan Anda juga menginstal versi stabil. http://tools.android.com/tips/using-multiple-android-studio-versions

David Argyle Thacker
sumber
Sama untuk saya, stable 3.1.2 berfungsi, 3.2 canary 15 tidak.
arekolek
3

Saya memiliki tes yang berjalan dengan baik sampai gradledan studio android ditingkatkan.

Selain menambahkan konstruktor default ke pengujian Anda, Anda mungkin perlu melakukan beberapa hal ini agar rangkaian pengujian Anda berfungsi

Di bawah src/buat androidTest/java/<your-package-name>/test. Perhatikan androidTest. Apa pun yang termasuk instrumentTesttidak akan berfungsi.

Tambahkan ini ke 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

Tambahkan ini ke AndroidManifest.xml

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

Untuk Intellij 15 saya menyelesaikan masalah ini dengan:

  1. Membuka pengaturan 'Struktur Proyek'
  2. Mengklik 'Modul' (di kiri)
  3. Tab 'Sumber'
    a. Klik kanan pada direktori sumber Anda (biasanya src) klik 'Sumber'.
    b. Klik kanan pada direktori pengujian Anda, klik 'Test'
    c. Klik kanan pada direktori Anda, klik 'Dikecualikan'
  4. Buka tab 'Paths'
    a. Klik tombol radio 'Gunakan jalur keluaran kompilasi modul'
    b. Pilih direktori jalur keluaran Anda untuk 'Jalur Keluaran'
    c. Pilih direktori jalur pengujian Anda untuk 'Jalur keluaran pengujian'
  5. Klik Ok
Marquis Blount
sumber
3

Jelas, Anda memerlukan perangkat target untuk menjalankan pengujian Anda karena itu adalah pengujian berinstrumen. Untuk beberapa alasan, Android studio terkadang tidak meminta Anda untuk mengarahkan ke perangkat target ini dan hanya meminta pesan "Empty Test Suite". Ada beberapa cara untuk memperbaikinya, berikut ini beberapa:

  • jalankan aplikasi utama Anda dan pilih perangkat target atau

  • buka konfigurasi Run (Run / Run ... / Edit Configurations) dan ubah Deployement Target Options

pengguna2243632
sumber
Hanya untuk membantu seseorang jika mereka mencoba solusi Anda. Dalam kasus saya, saya harus terlebih dahulu menjalankan aplikasi aktual pada perangkat / emulator dan setelah itu AndroidTest saya dapat melihat perangkat untuk menjalankan pengujian. Setelah itu semuanya berhasil. Memberi plus satu untuk jawabannya.
A_P
2

Dalam kasus saya, tidak ada jawaban sebelumnya yang berhasil. Solusinya adalah dengan hanya memindahkan kelas pengujian ke paket lain .

Ini terjadi di bawah androidTest/

Mateus Gondim
sumber
2

Dalam kasus saya masalah itu disebabkan karena kesalahan dalam kode saya, sebenarnya itu ada di kelas aplikasi, jadi aktivitas target tidak dibuka dan uji cetakan keluaran

Kesalahan paket pengujian kosong

Saya telah mencoba menjalankan tes langsung dari terminal dengan adb shell am instrument -w -r -e package your.package -e debug false android.support.test.runner.AndroidJUnitRunner. Dengan ini, ini mencetak lebih banyak tentang pengecualian.

Beloo
sumber
2

Saya mengalami masalah ini karena saya memiliki ini di build.gradle saya:

testOptions {
    execution "ANDROID_TEST_ORCHESTRATOR"
}

Meskipun saya tidak menggunakan Android Test Orchestrator (pasti telah menyalin dari tutorial secara tidak sengaja).

Mengomentari itu menyelesaikannya bagi saya.

Pablo
sumber
1

Tidak ada solusi lain yang berhasil untuk saya, tetapi saya bisa membuatnya berfungsi hanya dengan mencopot aplikasi atau rangkaian pengujian yang ada, lalu menjalankan pengujian.

Phil
sumber
Itu membantu saya. Saya membuat perubahan pada tingkat database sebelum menjalankan pengujian, sehingga kelas di bawah pengujian berinstrumen tidak dapat bekerja. Aneh bahwa Android Studio menampilkan pesan yang tidak relevan.
PetroCliff
1

Dalam kasus saya, proyek yang saya kerjakan memiliki beberapa modul. Tak satu pun dari solusi yang saya temukan untuk kesalahan ini membantu saya, dan kemudian entah bagaimana saya menyadari bahwa jika saya menambahkan dependensi pengujian di KEDUA file build.gradle, pengujian secara ajaib mulai bekerja. Tidak masalah jika pengujian Anda hanya tinggal di 1 modul, kedua file gradle harus menyertakan dependensi dan nilai testInstrumentationRunner.

Jadi, jika seperti saya, tidak ada jawaban lain yang membantu Anda, coba tambahkan baris ini ke file build.gradle dari setiap modul Anda:

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

lalu tambahkan juga:

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
sumber
1

Saya baru saja mengganti nama file dan masalah diperbaiki.

Lyn
sumber
1

Saya memiliki masalah yang sama, dan alasannya adalah kelas tes saya tidak memiliki Tes di akhir nama kelas!

Janin
sumber
1

Masalah saya disebabkan oleh pengecualian yang dilemparkan ke @BeforeClass metode kasus uji saya. Entah mengapa tidak menyebabkan pengujian gagal - saya hanya menemukannya dengan memeriksa keluaran logcat.

Saya memperbaiki pengecualian dan tiba-tiba pengujian saya berjalan!

mengejutkan
sumber
sama untuk ku. Tampaknya pengecualian di BeforeClass tidak ditampilkan dengan benar di panel jalankan
David Refaeli
1

Setelah menghadapi masalah hari ini - tidak dapat menjalankan pengujian android berinstrumen dengan Empty suite error - saya menemukan masalah git tentang masalah ini dan berkat Stephan Linzner, saya dapat menjalankan pengujian.

tl; dr Anda harus mengklik kanan paket pengujian dan bukan kelasnya untuk menjalankan pengujian.

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

Francisco Junior
sumber
0

Artikel ini membantu saya: Paket pengujian kosong

Pada dasarnya saya harus membuat paket - instrumentTest / java - di bawah direktori src saya, dan melakukan semua tes di sana. Kemudian saya bisa menjalankan tes ini satu per satu.

IgorGanapolsky
sumber
0

Saya memiliki proyek Java mentah di mana ini terjadi. Cukup Java + JUnit4. Itu pasti berada dengan sesuatu di file .idea / atau .iml Anda. Saya membatalkan milik saya, mengimpor ulang, dan akhirnya tes berjalan lagi.

cdaringe.dll
sumber
0

Kelas pengujian mungkin dikecualikan dari kompilasi. Perbaiki di pengaturan-compiler-exclude.

petertc
sumber
0

Berikut adalah langkah-langkah debugging yang saya lalui ketika Android Studio tiba-tiba memutuskan untuk berhenti menjalankan / debugging tes (Dan anak laki-laki apakah ini sering terjadi dengan memalukan !!):

  • Build: → Rebuild project
  • Mulai Ulang Perangkat: Mulai ulang perangkat / emulator Anda dan coba lagi
  • Peralihan perangkat: jika Anda memiliki telepon biasa dan emulator, cabut satu dan coba jalankan hanya dengan salah satu perangkat
  • Android Studio: File -> Invalidate caches dan restart
  • Activity Monitor / Task Manager: urutkan proses berdasarkan nama, lihat apakah ada proses tanpa nama yang menggunakan banyak ram, ini adalah proses "hantu" dari studio Android yang harus dimatikan
  • git revert: coba sembunyikan / pulihkan kode terbaru Anda. Terkadang ada kesalahan kompilasi yang terlewatkan oleh Android Studio / gradle dan itu hanya akan mencoba menjalankan kode yang tidak dapat dikompilasi.
  • Copot pemasangan lalu pasang ulang Android Studio.

Saya akan menambahkan lebih banyak perbaikan saat saya mengalaminya!

gorbysbm.dll
sumber
0

Saya tidak melakukan apa-apa dan masalah hilang setelah setengah hari kesakitan, saya membuka dan menutup proyek berkali-kali, menjalankan setiap tes kelas secara manual, mungkin itu memperbaikinya.

Gary Davies
sumber
0

Di studio Android dengan kerangka spock, saya telah mengubah versi gradle saya dari 2.2.2 menjadi 3.2.1 dan semuanya berjalan dengan baik.

Psijic
sumber
0

Jawaban yang diterima tidak menyelesaikan masalah saya. Jadi saya memutuskan untuk menyalin ExampleInstrumentedTestyang dibuat secara default di Android Studio dan berjalan tanpa masalah, mengganti namanya selama proses penyalinan (tidak ada Refactor-> Ganti nama setelah menyalin!) Dan menempelkan konten pengujian unit saya ke dalamnya. Setelah itu kesalahan tersebut hilang.

ka3ak
sumber
0

Saya mengalami error "Empty test suite" saat mencoba menjalankan pengujian unit lokal di proyek Android Studio 3.0 saya.

Setelah membaca dokumentasi Pengembang Android , saya segera menyadari bahwa masalah tersebut disebabkan oleh konfigurasi gradle saya yang menyertakan baris berikut.

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

Kelas AndroidJUnitRunner adalah runner pengujian JUnit yang memungkinkan Anda menjalankan kelas pengujian gaya JUnit 3- atau JUnit 4 di perangkat Android .

Karena pengujian saya bersifat lokal dan oleh karena itu tidak perlu dijalankan di perangkat apa pun, menghapus entri com.android.support.test ... di atas memungkinkan saya untuk menjalankan pengujian unit.

Akan P
sumber
0

Saya melakukan beberapa penyisipan dalam db dalam metode @BeforeClass. Saya menyadari bahwa saya memiliki masalah pemetaan objek / database. Masalah pemetaan data ini adalah penyebab masalah ini bagi saya.

Laurent
sumber
0

Dalam kasus saya, saya memiliki pengujian berinstrumen androidTest/java/<package.name>/MyTestingClass, tetapi saya telah menyetel varian build saya saat ini ke "praproduksi". Dan itulah intinya! Seperti yang ditentukan dalam dokumentasi Android Studio :

Secara default, semua pengujian dijalankan terhadap jenis build debug.

Pesan itu Class not found. Empty test suite.terus muncul sampai saya melakukan ini:

  1. Tambahkan baris ini ke build.gradle saya :

    android{
        [...]
        testBuildType "preproduction"
    }
  2. Gradle tersinkronisasi.
  3. Hapus konfigurasi pengujian saya sebelumnya karena tidak memperhitungkan sinkronisasi Gradle ini.

Kemudian saya menjalankan tes lagi dan kali ini berjalan dengan sempurna !!!

Juan José Melero Gómez
sumber
0

Saya mengalami hal ini ketika saya salah menandai variabel kelas bukan tiruan dengan anotasi @Mock Menghapus anotasi dan tes berjalan dengan sukses. Ini terjadi dengan Junit 4.5 di Android Studio

Mihir
sumber
0

Bukan solusi tetapi solusi yang akan membuat Anda kembali ke jalur dengan cepat:

  1. Pertama, temukan tes yang berhasil. Saya sedang menulis tes baru di mana saya mendapat kesalahan 'paket pengujian kosong'. Saya menjalankan tes lain dan mereka bekerja seperti biasa.

  2. Salin file pengujian yang berfungsi. Jalankan untuk memastikan salinan ini berfungsi seperti aslinya.

  3. Hapus tubuh dan ganti dengan kode tes baru Anda.

Tes sekarang harus bekerja.

Kami menghabiskan sekitar dua jam mencoba menemukan penyebabnya tetapi tidak berhasil.

xavierdominguez
sumber