Android test çalıştırıcısı neden "Boş test paketi" rapor ediyor?


98

IntelliJ / Android'in neden "Boş test paketi" rapor ettiğini anlamaya çalışırken kafamı duvara vuruyorum. İki IntelliJ Modülüne sahip küçük bir projem var (Eclipse'de "Projeler"). Birim test modülünün, altına yapıştırdığım kendi AndroidManifest.xml'si var. ActivityUnitTestCaseTestler Context-nesneye bağlı olacağından bir çalıştırmaya çalışıyorum .

Ana modülün paket adı nilzor.myapp. Test modülünün paket adınilzor.myapp.tests

Test koşucusu neden testBlah()-yöntemi bir test olarak algılamıyor?

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

Ve işte test sınıfım :;

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

Testin temellerini , etkinlik testi belgesini okudum ve Eclipse için olmasına rağmen bu Hello world test blogunu takip etmeyi denedim . Test koşucusunun testimi bulup çalıştırmasını sağlayamıyorum. Neyi yanlış yapıyorum?

Hala emin olmadığım sorulardan bazıları:

  1. Birim test yönteminin üzerinde bir Ek Açıklamaya ihtiyacım var mı?
  2. Yöntemin önüne "test" eklemem gerekiyor mu, yoksa bu sadece JUnit testleri için mi?
  3. Alt paketlerinde test yaptırabilir miyim nilzor.myapp.tests?

Ancak bu yazının ana sorusu , test koşucusu neden testimi algılamıyor ?


3. nokta için, Android Studio kullanıyorsanız cmd+shift+t, şu anda düzenlemekte olduğunuz sınıfla eşleşen doğru paket konumunda otomatik olarak bir test sınıfı oluşturacak kısayolu öneririm .
David Argyle Thacker

Her ihtimale karşı benim kadar mayınlı başka kimse yok. @Testİşaretçiyi testin üstüne koymayı unutmadığınızdan emin olun .
Matt D

Yanıtlar:


70

Test sınıfınız için varsayılan kurucu sağlamanız gerekir, örneğin:

package nilzor.myapp.tests;

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

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

diğer sorularınız hakkında:

  1. Hayır. Testlerim hala herhangi bir ek açıklama olmadan çalışıyor, ancak sanırım onlara sahip olmak iyi bir uygulama. Çalıştırılacak testlerin boyutunu belirlemenizi sağlar. Bkz @SmallTest, @MediumTest ve Android'de @LargeTest ek açıklamaların amacı nedir? daha fazla ayrıntı için.

  2. Evet, "test" önekine ihtiyacınız var. InteliJ, "test" öneki olmadığında "yöntem asla kullanılmadı" uyarısı verir ve test çalıştırması sırasında bu yöntemi atlar.

  3. Evet. Testlerimi alt paketler halinde düzenledim ve iyi çalışıyor gibi görünüyor.


5
ActivityTestRule
Yair Kukielka

Varsayılan kurucu eklemek işi benim için yaptı.
Dragan Marjanović

54

Bu "aniden" oluyorsa veya "5 dakika önce çalışıyordu" ise, çözümüm Çalıştır / Hata Ayıklama yapılandırmalarına gitmek ve "Android Testleri" altındaki tüm yapılandırmaları kaldırmaktı. Bazen test edilen sınıfı yeniden düzenlersem (örneğin yeni bir pakete geçerek) bu yapılandırmalar bozulur.

görüntü açıklamasını buraya girin


Bu benim için çalıştı. Boş test paketi hatası alıyordum. Yapılandırma başlangıçta oluşturulduktan sonra PowerMockito'yu eklememden kaynaklanıyor olabilir.
Ajith Memana

Daha önce derleme yapılandırmalarının düzgün çalıştığı testleri çalıştırırken sık sık bu ve diğer sorunları yaşıyorum. Bu yaklaşımı benimseyerek onları düzeltebildim.
stevehs17

3
Yapılandırmaları sildikten sonra, proje gezgininde (Android görünümü) bir test paketine sağ tıklıyorum ve seçiyorum Create 'Tests in XXX...- sonra tekrar çalıştı
TmTron

9

Yukarıdakilerin hiçbiri benim için düzeltmedi. Yardımcı olan, talimatları izlemekti :

Bir test yapılandırması oluşturun

Android Studio'da:

  • Çalıştır menüsünü açın -> Yapılandırmaları Düzenle
  • Yeni bir Android Testleri yapılandırması ekle
  • Bir modül seçin
  • Belirli bir enstrümantasyon koşucusu ekleyin:

  android.support.test.runner.AndroidJUnitRunner

Yeni oluşturulan yapılandırmayı çalıştırın.


6

Benzer bir sorun yaşadım. Bunun neden meydana geldiğinden emin değilim, ancak Android Studio'da "Dosya"> "Önbellekleri Geçersiz Kıl / Yeniden Başlat" seçeneğine giderek düzeltmeyi başardım.


Bu, test sınıfımın adını yeniden düzenledikten sonra OP ile aynı hatayı aldığımda sorunu çözdü.
Marco

4

Android Studio için yardımcı olup olmadığını bilmiyorum ama bir tür Intellij-Gradle çatışması yaşadım. Bunu, test dosyasına "sağ tıklayarak" ve "dosya derle ... Test.java" seçeneğine tıklayarak çözdüm. Bundan sonra tekrar tek testler yapabilirim.


2
* Test.java'daki bu "derleme dosyası" nerede? Android Studio'nun hangi sürümü?
Mark Lapasa

Yukarıda söylemeye çalıştığım gibi Android Studio kullanmıyorum. Intellij 15 proffesional kullanıyorum. sağ tıklama açılır menüsü resmi <- Buraya bir resim yapıştırdım.
kotlinski


3

gradleAndroid stüdyosu yükseltilene kadar iyi çalışan testlerim vardı .

Testlerinize varsayılan bir kurucu eklemenin yanı sıra, test paketinizin çalışmasını sağlamak için bunlardan bazılarını yapmanız gerekebilir.

Altında src/oluşturmak androidTest/java/<your-package-name>/test. Not androidTest. Dahil olmak üzere başka instrumentTesthiçbir şey işe yaramayacaktır.

Bunu şuraya ekle 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

Bunu şuraya ekle AndroidManifest.xml

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

3

Intellij 15 için bu sorunu şu şekilde çözdüm:

  1. 'Proje Yapısı' ayarlarını açma
  2. 'Modüller'e (solda) tıklayın
  3. 'Kaynaklar' Sekmesi
    a. Kaynak dizininize sağ tıklayın (genellikle src) 'Kaynak'ı tıklayın.
    b. Test dizininize sağ tıklayın 'Test'e tıklayın
    c. Çıkış dizininize sağ tıklayın 'Hariç tutuldu' seçeneğine tıklayın
  4. 'Yollar' sekmesine gidin
    a. 'Modül derleme çıktı yolunu kullan' radyo düğmesine tıklayın
    b. 'Çıktı Yolu' için çıktı yolu dizininizi seçin
    c. 'Test çıktı Yolu' için test yolu dizininizi seçin
  5. Tamam'ı tıklayın

3

Elbette, testlerinizi enstrümantasyonlu testler olarak yürütmek için bir hedef cihaza ihtiyacınız var . Bazı nedenlerden dolayı, Android stüdyo bazen sizden bu hedef cihazı göstermenizi istemez ve sadece "Test Paketini Boşalt" mesajını verir. Bunu düzeltmenin farklı yolları var, işte birkaç tane:

  • ana uygulamanızı çalıştırın ve bir hedef cihaz seçin veya

  • Çalıştır (Çalıştır / Çalıştır ... / Yapılandırmaları Düzenle) yapılandırmasına gidin ve Dağıtım Hedefi Seçeneklerini değiştirin


Sadece birisine çözümünüzü denerse yardımcı olmak için. Benim durumumda, ilk önce cihazda / emülatörde gerçek uygulamayı çalıştırmak zorunda kaldım ve bundan sonra AndroidTest'im, testleri çalıştıracak cihazı görebildi. Bundan sonra her şey çalıştı. Cevap için artı bir vermek.
A_P

2

Benim durumumda, önceki cevapların hiçbiri işe yaramadı. Çözüm, test sınıfını başka bir pakete taşımaktı .

Bu altında oldu androidTest/


2

Benim durumumda bu soruna kodumdaki hatadan kaynaklandı, aslında bu uygulama sınıfındaydı, bu nedenle hedef aktivite açılmadı ve test çıktı çıktıları

Boş test paketi hatası

Testleri doğrudan terminalden çalıştırmayı denedim adb shell am instrument -w -r -e package your.package -e debug false android.support.test.runner.AndroidJUnitRunner. Bununla sizin için istisna hakkında çok daha fazlasını yazdırır.


2

Bu sorunu yaşadım çünkü build.gradle'ımda bu vardı:

testOptions {
    execution "ANDROID_TEST_ORCHESTRATOR"
}

Android Test Orkestratörü'nü kullanmadığım halde (öğreticilerden yanlışlıkla kopyalanmış olmalı).

Bunu yorumlamak benim için çözdü.


1

Diğer çözümlerin hiçbiri benim için işe yaramadı, ancak bunu yalnızca mevcut uygulamayı veya test paketini kaldırıp ardından testleri çalıştırarak çalıştırabildim.


Bu bana yardımcı oldu. Testi çalıştırmadan önce veritabanı düzeyinde değişiklikler yaptım, bu nedenle aletli test altındaki sınıf çalışamadı. Android Studio'nun bu kadar alakasız bir mesaj görüntülemesi garip.
PetroCliff

1

Benim durumumda, üzerinde çalıştığım projenin birkaç modülü vardı. Bu hata için bulduğum çözümlerin hiçbiri bana yardımcı olmadı ve sonra bir şekilde test bağımlılıklarını build.gradle dosyalarının HER İKİSİNE eklersem testlerin sihirli bir şekilde çalışmaya başladığını fark ettim. Testlerinizin modüllerin yalnızca 1'inde yaşıyor olması önemli değil, her iki gradle dosyası bağımlılıkları ve testInstrumentationRunner değerini içermelidir.

Yani, benim gibi, diğer yanıtların hiçbiri size yardımcı olmadıysa, bu satırları modülünüzün her birinin build.gradle dosyasına eklemeyi deneyin:

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

ve ardından şunu da ekleyin:

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'

}

1

Dosyayı yeniden adlandırdım ve sorun çözüldü.


1

Aynı sorunu yaşadım ve bunun nedeni test sınıfımın sınıf adının sonunda Test olmamasıydı!


1

Sorunum, @BeforeClass test durumumun yönteminde . Bazı nedenler testin başarısız olmasına neden olmadı - sadece logcat çıktısını inceleyerek buldum.

İstisnayı düzelttim ve aniden testlerim çalışmaya başladı!


benim için aynı. BeforeClass'daki istisnaların çalışma panelinde düzgün bir şekilde gösterilmediği görülüyor
David Refaeli


0

Bu makale bana yardımcı oldu: Boş test paketi

Temel olarak , src dizinim altında bir paket - instrumentTest / java - oluşturmam ve tüm testleri oraya koymam gerekiyordu. O zaman bu testleri tek tek gerçekleştirebilirim.


0

Bunun gerçekleştiği yerde ham bir Java projem vardı. Basitçe Java + JUnit4. Kesinlikle .idea / veya .iml dosyalarınızda bir şey bulunur. Benimkini hurdaya çıkardım, yeniden ithal ettim ve sonunda testler tekrar yapıldı.


0

Test sınıfı derlemeden çıkarılabilir. Setting-compiler-exclude'da düzeltin.


0

İşte Android Studio aniden testleri çalıştırmayı / hata ayıklamayı durdurmaya karar verdiğinde uyguladığım hata ayıklama adımlarım (Ve çocuk bunu utanç verici bir şekilde sık sık yapıyor !!):

  • İnşa et: → Projeyi yeniden oluştur
  • Cihazı Yeniden Başlatın: Cihazınızı / emülatörünüzü yeniden başlatın ve tekrar deneyin
  • Cihaz değiştirme: Hem normal bir telefonunuz hem de bir emülatörünüz varsa, birini çıkarın ve cihazlardan yalnızca biriyle çalıştırmayı deneyin
  • Android Studio: Dosya -> Önbellekleri geçersiz kılın ve yeniden başlatın
  • Etkinlik Monitörü / Görev Yöneticisi: işlemleri ada göre sıralayın, çok fazla ram kullanan isimsiz bir işlem olup olmadığına bakın, bu Android stüdyosundan öldürülmesi gereken bir "hayalet" işlemidir
  • git revert: en son kodunuzu saklamayı / geri almayı deneyin. Bazen Android Studio / gradle'ın kaçırdığı bir derleme hatası vardır ve sadece derlenemeyen kodu çalıştırmaya çalışır.
  • Android Studio'yu kaldırıp yeniden yükleyin.

Onlarla karşılaştıkça daha fazla düzeltme ekleyeceğim!


0

Hiçbir şey yapmadım ve yarım günlük bir ağrının ardından sorun ortadan kalktı, projeleri defalarca açıp kapattım, her sınıf testini manuel olarak yaptım, belki bu benim sorunumu çözdü.


0

Spock çerçeveli Android stüdyosunda, gradle'ın sürümünü 2.2.2'den 3.2.1'e değiştirdim ve her şey yolunda gitti.


0

Kabul edilen cevap sorunumu çözmedi. Bu yüzden ExampleInstrumentedTestAndroid Studio'da varsayılan olarak oluşturulan ve sorunsuz çalışan kopyalamaya karar verdim , kopyalama işlemi sırasında yeniden adlandırdım (kopyaladıktan sonra Refactor-> Rename yok!) Ve birim testimin içeriğini içine yapıştırdım. Bundan sonra hata ortadan kalktı.


0

Android Studio 3.0 projemde yerel birim testleri çalıştırmaya çalışırken "Boş test paketi" hatasıyla karşılaştım.

Android Geliştirici belgelerini okuduktan sonra , sorunun aşağıdaki satırları içeren gradle yapılandırmamdan kaynaklandığını hemen anladım.

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

AndroidJUnitRunner sınıfı, Android cihazlarda JUnit 3- veya JUnit 4 tarzı test sınıflarını çalıştırmanıza izin veren bir JUnit test çalıştırıcısıdır. .

Testlerim yerel olduğundan ve bu nedenle herhangi bir cihazda çalıştırılması gerekmediğinden, yukarıdaki com.android.support.test ... girişlerini kaldırmak, birim testlerini yürütmemi sağladı.


0

@BeforeClass yönteminde bir db'ye bazı eklemeler yapıyordum. Bir nesne / veritabanı eşleme sorunum olduğunu fark ettim. Bu veri haritalama problemi benim için bu sorunun nedeniydi.


0

Benim durumumda, aletli testlerimi yaptırdım androidTest/java/<package.name>/MyTestingClass, ancak mevcut yapı varyantımı "ön üretim" olarak ayarlamıştım. Ve önemli olan burada! Android Studio belgelerinde belirtildiği gibi :

Varsayılan olarak, tüm testler hata ayıklama yapı türüne göre çalışır.

Bunu Class not found. Empty test suite.yapana kadar mesaj görünmeye devam etti:

  1. Bu satırı build.gradle'ıma ekle :

    android{
        [...]
        testBuildType "preproduction"
    }
  2. Senkronize gradle.
  3. Bu Gradle senkronizasyonunu hesaba katmadıkları için önceki test yapılandırmalarımı silin.

Sonra testleri tekrar yaptım ve bu sefer mükemmel çalışıyorlar !!!


0

Bu, sahte olmayan bir sınıf değişkenini yanlışlıkla ek açıklama ile işaretlediğimde @Mock ve testler başarıyla çalıştırıldığında başıma geldi . Bu, Android Studio'daki Junit 4.5 ile oldu


0

Bir çözüm değil, hızlı bir şekilde yolunuza geri dönmenizi sağlayacak bir geçici çözüm:

  1. İlk olarak, işe yarayan bir test bulun. 'Boş test paketi' hatası aldığım yeni bir test yazıyordum. Başka testler de yaptım ve her zamanki gibi çalışıyorlardı.

  2. Çalışan test dosyasını kopyalayın. Bu kopyanın orijinali gibi çalıştığından emin olmak için çalıştırın.

  3. Gövdeyi çıkarın ve yeni test kodunuzla değiştirin.

Test şimdi çalışmalıdır.

Nedeni bulmaya çalışmak için yaklaşık iki saat harcadık ama işe yaramadı.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.