Android Kitaplık Projesi nasıl test edilir


97

Yalnızca yardımcı sınıf (aktivite yok) içeren Android Bitmap sınıfına (AndroindLib deyin) dayalı bir Android Kitaplık Projesi yazıyorum. Android JUnit kullanarak test etmeye çalıştım, ancak AnroidLib.apk'yi bulamamaktan şikayet etmeye devam ediyor

Android Kitaplık Projesini Birim testi yapmanın doğru yolu nedir?


1
Veya ( utanmaz eklenti uyarısı ) oluşturduğum bir projeyi kullanabilirsiniz: Android Library Test Harness ("Alt H" olarak adlandırmaktan hoşlandığım şey). Git deposu olarak mevcuttur: gitorious.org/alth Proje halen geliştirme aşamasındadır ve dokümantasyon biraz azdır, bu nedenle herhangi bir sorunuz olursa bana ulaşabilirsiniz.
i41

Yanıtlar:


75

Belgelerden alıntı yapmak :

"Bir kitaplık projesinde kod ve kaynaklar üzerinde test kurmanın önerilen iki yolu vardır:

  • Kütüphane projesine bağlı olan bir uygulama projesini ölçen bir test projesi oluşturabilirsiniz. Daha sonra kütüphaneye özgü unsurlar için projeye testler ekleyebilirsiniz.

  • Kitaplığa bağlı standart bir uygulama projesi kurabilir ve enstrümantasyonu o projeye koyabilirsiniz. Bu, hem testleri / enstrümantasyonları hem de test edilecek kodu içeren bağımsız bir proje oluşturmanıza olanak tanır. "


27
Yani temelde yapmanız gereken tek şey kitaplığı test projenize eklemek ve test projesini test etmektir.
njzk2

Bağlantı artık geçerli değil, bizi şu anki bağlantıya yönlendirme şansınız var mı?
Abdullah Jibaly


4
Başka birinin bu önerilerle başarılı olup olmadığından emin değilim ama ben başaramadım. İlk olarak ikinci çözümü denedim ve Eclipse'de çalıştırmayı denediğimde şunu alıyorum: <ProjectName> bir android.test.InstrumentationTestRunner enstrümantasyonunu belirtmiyor veya AndroidManifest.xml dosyasında uses-library android.test.runner'ı bildirmiyor. Bu, Manifest'ime hem enstrümantasyon hem de kullanım kütüphanesi öğelerini eklememe rağmen.
Bellinghammer

2
İkincisi var (ve tercih edilen çalışma şekli). Kullanım kitaplığı ve enstrümantasyon öğelerini bildiriminizde doğru konumda almanız çok önemlidir. Enstrümantasyon öğesi, kök bildirim öğesinin bir alt öğesidir ve kullanım kitaplığı öğesi, uygulama öğesinin bir alt öğesidir. Kullanım kitaplığını manifest öğesinin altına koyuyordum ve testleri çalıştırmaya çalışırken yukarıdaki hata mesajıyla bitiyordum.
Bellinghammer

17

Test projenizde, kitaplığınızın paketiyle aynı olacak şekilde paket adını değiştirmeniz yeterlidir. Örneğin, paketi olan bir kitaplığınız var "com.example.lib". Kitaplığınızı hedefleyen bir test projesi oluşturun. Manifest dosyasında göreceksiniz package="com.example.lib.test"ve targetPackage="com.example.lib". Paketi "com.example.lib.test" yerine "com.example.lib" olarak değiştirin ( targetPackageolduğu gibi bırakın).

Ayrıca, kitaplığın test projenize Java derleme yolunda DEĞİL , normal bir Android kitaplığı olarak başvurulduğundan emin olun : Eclipse'de kitaplık Project->Properties->Androidsekmede değil , Project->Properties->Java Build Pathsekmede kitaplık olarak gösterilmelidir .

Sonra testlerinizi çalıştırın.


Fikirleriniz bana mantıklı geldi, böylece test kendini (uygulama olarak) hedefledi ve uygulama kitaplıkla bağlantılı .... ancak ne ant build ne de IntelliJ aracılığıyla çalışmasını sağlayamadım .... .apk (test edilen uygulama için bekleniyordu), "test / bin /.- debug.apk" olarak derlendiğinden, yüklemeye çalışırken mevcut değildi
Andrew Mackenzie

Sadece kendi manifestindeki test projesinin paket adını (ve test edilen paketi - ki bu aynı olmalıdır) kütüphane projesinin paket adı ile uyuşmayacak şekilde değiştirerek ve hedef teste referansı kaldırarak çalıştırdım. ant.properties dosyasındaki proje.
Andrew Mackenzie

1
Sanırım bu, kabul edilen yanıttan daha iyi bir cevap, sadece dokümantasyonu yansıtıyor - IMHO.
Andrew Mackenzie


5

Başına belgeler :

Bir kitaplık modülünü test etmek, bir uygulamayı test etmekle aynıdır. Temel fark, kitaplığın ve bağımlılıklarının otomatik olarak test APK'sının bağımlılıkları olarak dahil edilmesidir. Bu, test APK'sinin yalnızca kendi kodunu değil, aynı zamanda kitaplığın AAR'sını ve tüm bağımlılıklarını da içerdiği anlamına gelir. Ayrı bir "test edilen uygulama" olmadığından, androidTest görevi yalnızca test APK'sını yükler (ve kaldırır). Birden çok bildirim dosyasını birleştirirken, Gradle varsayılan öncelik sırasını izler ve kitaplığın bildirimini test APK'sının ana bildirimiyle birleştirir.


testleri çalıştırmak için hangi görev? gradle testi mi yoksa gradle androidTest mi? androidTest bir görev değildir.
Sunnyday

ancak Firebase Test Lab gibi araçlar bir APK veya AAB gerektirir ve kütüphanenin montaj görevinin çıktısı olan bir AAR dosyasını kabul etmez
Mustafa Berkay Mutlu

1

NOT: Bu çözüm Eclipse Indigo (3.8.2) kullanımına dayanmaktadır ve temel ilkeler aynı olsa da başka bir IDE için biraz farklı şekilde uygulanması gerekebilir.

Benzer sorunlar yaşadım ve aşağıdakilerin her zaman işe yaradığını öğrendim:

( NOT: Bu talimatlar sıfırdan yeni bir proje grubu oluşturmak içindir. Proje grubunun parçalarını zaten oluşturduysanız, projelerinizi aynı şekilde bağlanacak şekilde değiştirmeniz gerekebilir. )

  1. Oluşturma sırasında "Kitaplık" onay kutusunu işaretleyerek yeni bir Android Kitaplığı projesi oluşturun. (örneğin, "RemingtonAndroidTools" adlı bir Android projesi).
  2. Android Kitaplığı projesini oluşturun ve bin klasöründe bir jar dosyası oluşturduğunu doğrulayın. (örneğin, "RemingtonAndroidTools.jar" adlı bir jar dosyası.)
  3. Android Test Uygulaması olarak hizmet verecek Android uygulamasını test etmek için boş bir Android Projesi oluşturun. (Örneğin, "RemingtonAndroidToolsTestApp" adlı bir Android projesi). Test için eklenmesi gereken bir şey olmadıkça Android Test Uygulaması projesinin kaynak kodunu veya kaynaklarını değiştirmenize gerek yoktur. Android Test Uygulaması Projesinde herhangi bir değişiklik yapılmadan birçok şey test edilebilir. Android Test Uygulaması projesi, Android Kitaplığı projeniz ile Android Kitaplığı projesinin Android Junit aracılığıyla test edilmesini mümkün kılan Android Junit projesi arasında bir köprüdür.
  4. Android Test Uygulaması projesi için Java Derleme Yolu'nun Kitaplık sekmesine gidin (bu örnekte "RemingtonAndroidToolsTestApp").
  5. Android Kitaplık Projesi'nin jar dosyasını (bu örnekte "RemingtonAndroidTools.jar") (bu örnekte "RemingtonAndroidTools") "Kavanoz Ekle ..." düğmesini kullanarak ekleyin.
  6. Android Kitaplık Test Cihazı olarak hizmet verecek yeni bir Android Test projesi (örneğin "RemingtonAndroidToolsTester") oluşturun ve hedef olarak Android Test Uygulaması projesini (bu örnekte "RemingtonAndroidToolsTestApp") seçin.
  7. Android Kitaplık Test Aracı projesi için Java Derleme Yolu'nun Kitaplık sekmesine gidin (bu örnekte "RemingtonAndroidToolsTester").
  8. Android Kitaplık Projesi'nin jar dosyasını (bu örnekte "RemingtonAndroidTools.jar") (bu örnekte "RemingtonAndroidTools") "Kavanoz Ekle ..." düğmesini kullanarak ekleyin.
  9. Android Kitaplık Test Aracı projesinde (örneğin "danny.remington.remington_android_tools_test_app.test") Android paketinizin son klasörünü bulun ve ActivityInstrumentationTestCase2'den devralan bir test sınıfı (örneğin "MainActivityTest") ekleyin.
  10. ActivityInstrumentationTestCase2 parametresi olarak Android Test Uygulamasının (bu örnekte "RemingtonAndroidToolsTestApp") etkinliğini (örneğin "TestActivity") kullanmak için test sınıfını (bu örnekte "TestActivityTest") düzenleyin.
  11. Test sınıfını (bu örnekte "TestActivityTest") düzenleyin ve super (Class) 'a bir çağrı yapan ve Android Test Uygulaması sınıfını (örneğin "TestActivity.class") ileten varsayılan bir kurucu oluşturun.

Şuna benzer görünen üç proje (Android Kitaplığı, Android Test Uygulaması, Android Kitaplık Test Edicisi) bulmalısınız:

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

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

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

Android Kitaplığınızı test etmek için aşağıdakine benzer bir sınıf bulmalısınız:

package danny.remington.remington_android_tools_test_app.test;

import android.test.ActivityInstrumentationTestCase2;
import danny.remington.remington_android_tools_test_app.TestActivity;

/**
 * 
 */
public class TestActivityTest extends
      ActivityInstrumentationTestCase2<TestActivity> {

   public TestActivityTest() {
      super(TestActivity.class);
   }

}

Daha sonra istediğiniz herhangi bir testi ekleyebilirsiniz. Android'e özgü bir bileşene (örneğin Varlıklar klasörü gibi) erişim gerektirmedikçe, testlerinizi çalıştırmak için Android Test Uygulamasına (bu örnekte "RemingtonAndroidToolsTestApp") başvurmanız gerekmeyecektir. Herhangi bir Android bileşenine erişmeniz gerekiyorsa, bunu Android Test Uygulamasını (bu örnekte "RemingtonAndroidToolsTestApp") değiştirip ardından standart Android Junit API tarafından sağlanan araçlar aracılığıyla referans göstererek yapabilirsiniz. (Bununla ilgili daha fazla bilgiyi buradan okuyabilirsiniz: http://developer.android.com/tools/testing/testing_android.html )


0

Ulitiy sınıflarınız herhangi bir android koduna bağlı değilse, sadece standart JUnit birim testlerini kullanabilirsiniz. Android sürümlerini kullanmaya gerek yok.


2
Bu işe yaramaz çünkü standart JUnit standart JVM'ye derlenirken Android java dosyaları Dalvik VM'de derlenir.
Danny Remington - OMS
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.