Enstrümantasyon Testleri

İlk önce uygulamanızı geliştirici.android.com'da test edin bölümünü okuyun. Platform testinde enstrümantasyon testlerinin nasıl kullanıldığı konusunda bazı farklılıklar olduğunu unutmayın.

Özetle, bir enstrümantasyon testi, hedeflenen uygulama sürecinin yeniden başlatıldığı ve temel uygulama bağlamı ile başlatıldığı ve uygulama süreci VM içinde bir enstrümantasyon dizisinin başlatıldığı am instrument komutu aracılığıyla başlatıldığı gibi özel bir test yürütme ortamı sağlar. Test kodunuz bu enstrümantasyon dizisinde yürütülmeye başlar ve test edilen uygulama sürecini işlemek için uygulama bağlamına ve API'lere erişim sağlayan bir Instrumentation örneği ile sağlanır.

Anahtar kavramlar

  • uygulama paketi <manifest> etiketi altında yuvalanmış bir <instrumentation> etiketi ile bir uygulama paketinde bir enstrümantasyon bildirilmelidir.
  • bir uygulama paketi bildirimi, bu şekilde yaygın olarak kullanılmasa da teknik olarak birden çok <instrumentation> etiketi içerebilir.
  • her <instrumentation> şunları içermelidir:
    • bir android:name özniteliği: genellikle kullanılan test çalıştırıcısı olan test uygulamasında bulunan Instrumentation alt sınıfının adı olmalıdır, örneğin: android.support.test.runner.AndroidJUnitRunner
    • bir android:targetPackage niteliği tanımlanmalıdır. Değeri, test edilen uygulama paketine ayarlanmalıdır.

Adımların özeti

  1. Çerçeve hizmetlerine karşı hermetik testler için ortak hedefler aşağıdadır:

    frameworks/base/core/tests/coretests
    frameworks/base/services/tests/servicestests
    

    Bileşeniniz için yepyeni bir enstrümantasyon modülü ekliyorsanız, bkz.

  2. Yukarıdaki konumlardan birine testler ekliyorsanız, mevcut sözleşmeyi takip edin. Yeni bir test modülü kuruyorsanız, lütfen yukarıdaki konumlardan birinde AndroidManifest.xml ve Android.mk kurulumunu takip edin.

  3. Örnek için çerçeveler/taban/çekirdek/testler/çekirdek testleri/ konusuna bakın. Bu satırların ekstra uygulamalar yüklediğini unutmayın:

    <option name="test-file-name" value="FrameworksCoreTests.apk" />
    <option name="test-file-name" value="BstatsTestApp.apk" />
    
  4. @SmallTest , @MediumTest veya @LargeTest olarak işaretlemeyi unutmayınız.

  5. Test modülünü m ile oluşturun, örneğin:

    m FrameworksCoreTests
    
  6. Testleri çalıştırın:

    m tradefed-all
    tradefed.sh run template/local_min --template:map test=FrameworksCoreTests
    
  7. Tradefed kullanmıyorsanız, testleri manuel olarak kurun ve çalıştırın:

    1. Oluşturulan apk'yı yükleyin:
    adb install -r ${OUT}/data/app/FrameworksCoreTests/FrameworksCoreTests.apk
    
    1. Testleri çeşitli seçeneklerle çalıştırın:

      1. apk içindeki tüm testler

        adb shell am instrument -w com.android.frameworks.coretests\
          /android.support.test.runner.AndroidJUnitRunner
        
      2. belirli bir Java paketi altındaki tüm testler

        adb shell am instrument -w -e package android.animation \
          com.android.frameworks.coretests\
          /android.support.test.runner.AndroidJUnitRunner
        
      3. belirli bir sınıf altındaki tüm testler

        adb shell am instrument -w -e class \
          android.animation.AnimatorSetEventsTest \
          com.android.frameworks.coretests\
          /android.support.test.runner.AndroidJUnitRunner
        
      4. belirli bir test yöntemi

        adb shell am instrument -w -e class \
          android.animation.AnimatorSetEventsTest#testCancel \
          com.android.frameworks.coretests\
          /android.support.test.runner.AndroidJUnitRunner
        

Testiniz, JUnit API'lerini kullanarak başarılı veya başarısız olduğunda açık bir iddiada bulunabilir; ayrıca, yakalanmayan istisnalar da işlevsel bir arızaya neden olacaktır.

Performans ölçümlerini yaymak için test kodunuz, bir anahtar/değer çiftleri listesi göndermek için Instrumentation#sendStatus çağırabilir. Şuna dikkat etmek önemlidir:

  1. metrikler tamsayı veya kayan nokta olabilir
  2. sayısal olmayan değerler atılacak
  3. test apk'nız işlevsel testler veya ölçüm testleri olabilir, ancak her ikisinin de karıştırılması şu anda desteklenmemektedir.