Enstrümantasyon testleri

Öncelikle developer.android.com'daki Uygulamanızı test etme başlıklı makaleyi okuyun. Platform testinde enstrümantasyon testlerinin kullanımında bazı farklılıklar olduğunu unutmayın.

Özetle, bir enstrümantasyon testi, am instrument komutuyla başlatılan özel bir test yürütme ortamı sağlar. Bu ortamda, hedeflenen uygulama işlemi yeniden başlatılır ve temel uygulama bağlamıyla başlatılır. Ayrıca, uygulama işlemi VM'sinde bir enstrümantasyon iş parçacığı başlatılır. Test kodunuz bu enstrümantasyon iş parçacığında yürütülmeye başlar ve test edilen uygulama bağlamına ve uygulama sürecini değiştirmeye yönelik API'lere erişim sağlayan bir Instrumentation örneğiyle birlikte verilir.

Temel kavramlar

  • Bir uygulama paketinde, uygulama paketi manifestinin <manifest> etiketi altında iç içe yerleştirilmiş bir <instrumentation> etiketiyle bir enstrüman beyan edilmelidir.
  • Bir uygulama paketi manifest dosyası teknik olarak birden fazla <instrumentation> etiketi içerebilir ancak bu şekilde kullanılması yaygın değildir.
  • Her <instrumentation> şunları içermelidir:
    • android:name özelliği: Bu özellik, test uygulamasında yer alan Instrumentation alt sınıfının adı olmalıdır.Bu genellikle kullanılan test çalıştırıcısıdır. Örneğin: android.support.test.runner.AndroidJUnitRunner
    • android:targetPackage özelliği tanımlanmalıdır. Değeri, test edilen uygulama paketi olarak ayarlanmalıdır.

Adımların özeti

  1. Aşağıda, çerçeve hizmetlerine karşı hermetik testler için yaygın hedefler verilmiştir:

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

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

  2. Yukarıdaki konumlardan birine test ekliyorsanız mevcut kurala uyun. Yeni bir test modülü oluşturuyorsanız lütfen yukarıdaki konumlardan birinde AndroidManifest.xml ve Android.mk kurulumunu yapın.

  3. Örnek için bkz. frameworks/base/core/tests/coretests/. Bu satırların ek uygulamalar yüklediğini unutmayın:

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

  5. Test modülünü m ile oluşturun (ör. m):

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

    m tradefed-all
    tradefed.sh run template/local_min --template:map test=FrameworksCoreTests
    
  7. Tradefed kullanılmıyorsa testleri manuel olarak yükleyip ç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'daki tüm testler

        adb shell am instrument -w com.android.frameworks.coretests\
          /android.support.test.runner.AndroidJUnitRunner
        
      2. Belirli bir Java paketindeki 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'leri kullanarak geçme veya kalma konusunda açık bir iddiada bulunabilir. Ayrıca, yakalanmayan tüm istisnalar da işlevsel bir hataya neden olur.

Performans metrikleri yayınlamak için test kodunuz, anahtar/değer çiftlerinin listesini göndermek üzere Instrumentation#sendStatus işlevini çağırabilir. Şunları unutmayın:

  1. Metrikler tam sayı veya kayan nokta olabilir.
  2. Sayısal olmayan tüm değerler silinir.
  3. Test APK'nız işlevsel testler veya metrik testleri olabilir ancak ikisinin birlikte kullanılması şu anda desteklenmemektedir.