Otomatik enstrümantasyonlu testler örneği

Bir enstrümantasyon testi başlatıldığında, hedef paketi enstrümantasyon kodu eklenmiş ve yürütme için başlatılmış şekilde yeniden başlatılır. Bunun tek istisnası, buradaki hedef paketin Android uygulama çerçevesinin kendisi (ör. android paketi) olmamasıdır. Aksi takdirde, Android çerçevesinin yeniden başlatılması gerekir. Bu da enstrümantasyon da dahil olmak üzere sistem işlevlerini destekleyen şeydir.

Bu, araç testinin kendisini Android'e yerleştiremeyeceği anlamına gelir. çerçeve, yani sistem sunucusu, yani yürütme için kullanılır. Android'i test etmek için çerçevesini kullanıyorsanız, test kodu yalnızca herkese açık API yüzeylerini veya açık olan API yüzeylerini Android Arayüz Tanımlama Dili'ni kullanarak AIDL mevcuttur. Bu test kategorisi için belirli bir paketi hedeflemek anlamlı değildir. Bu nedenle, bu tür kendi test uygulama paketini hedeflemek üzere beyan edilecek enstrümanlar AndroidManifest.xml içeren kendi <manifest> etiketinde tanımlanmıştır.

Gereksinimlere bağlı olarak, bu kategorideki test uygulama paketleri ayrıca:

  • Test için gerekli etkinlikleri gruplayın.
  • Kullanıcı kimliğini sistemle paylaşın.
  • Platform anahtarıyla imzalanmış olmalıdır.
  • Herkese açık SDK yerine çerçeve kaynağına göre derlenmiş olmalıdır.

Bu araç testleri kategorisi bazen kendi kendine enstrümantasyonu kullanabilir. Aşağıda, Google Ads'deki kendi kendine araç testlerine ilişkin platform kaynağı:

Burada ele alınan örnek, hedef ile yeni bir araç testi yazmaktır. paketinin kendi test uygulama paketinde ayarlanır. Bu kılavuzda örnek olarak aşağıdaki test kullanılmıştır:

Devam etmeden önce kabaca bir fikir edinmek için önce koda göz atmanız önerilir.

Kaynak konumu belirleyin

Genellikle ekibinizin kontrol etmesi gereken yerlerle ilgili belirli bir kalıbı vardır ve testlerin ekleneceği yerlerdir. Çoğu ekibin tek bir git deposu vardır veya bir deposu diğer ekiplerle paylaşır ancak bileşen kaynak kodunu içeren özel bir alt dizinleri vardır.

Bileşen kaynağınız için kök konumunun <component source root> konumunda olduğu varsayıldığında çoğu bileşenin altında src ve tests klasörleri, bazıları ise Android.mk gibi ek dosyalar (veya .mk ek dosyalara ayrılmış), manifest dosyası AndroidManifest.xml ve test yapılandırma dosyası "AndroidTest.xml".

Yepyeni bir test eklediğiniz için muhtemelen tests dizininizi src bulun ve içerikle doldurun.

Bazı durumlarda, farklı test paketlerinin tek tek apk'lara paketlenmesi gerektiğinden ekibinizin tests altında başka dizin yapıları olabilir. Ve Bu durumda, tests altında yeni bir alt dizin oluşturmanız gerekir.

Yapı ne olursa olsun, sonunda tests dizini veya dizindekilere benzer dosyaları içeren yeni oluşturulan Örnek değer değişikliğindeki instrumentation dizini. Dosyaların ayrıntıları bu belgenin ilerleyen bölümlerinde açıklanmıştır.

Manifest dosyası

Uygulama projesinde olduğu gibi, her enstrümantasyon testi modülü için AndroidManifest.xml adlı bir manifest dosyası gerekir. Otomatik olarak eklemek için BUILD_PACKAGE temel oluşturma dosyasını kullanarak bu dosyayı, Test modülünüz için Android.mk dosyası.

AndroidManifest.xml dosyası hakkında bilginiz yoksa şuraya bakın: Uygulama manifestine genel bakış

Aşağıda örnek bir AndroidManifest.xml dosyası verilmiştir:

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
  android:sharedUserId="android.uid.system"
  package="android.test.example.helloworld" >

    <application>
       <uses-library android:name="android.test.runner"/>
    </application>

    <instrumentation android:name="androidx.test.runner.AndroidJUnitRunner"
                     android:targetPackage="android.test.example.helloworld"
                     android:label="Hello World Test"/>

</manifest>

Manifest dosyasıyla ilgili bazı önemli açıklamalar:

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="android.test.example.helloworld" >

package özelliği, uygulama paketi adıdır: Bu, benzersizdir Android uygulama çerçevesinin bir uygulamayı tanımlamak için kullandığı (veya bu bağlamda: test uygulamanız) ekleyebilirsiniz. Sistemdeki her bir kullanıcının bu paket adına sahip yalnızca bir uygulama yükleyebilir.

Ayrıca bu package özelliği, ComponentName#getPackageName() tarafından döndürülen değerle aynıdır ve adb shell kullanan çeşitli pm alt komutlarıyla etkileşimde bulunmak için kullanacağınız değerle de aynıdır.

Paket adının genelde aynı stilde olmasına rağmen bir Java paketi adı olduğu için, aslında bu adla pek ilgisi yok. Başka uygulamanız (veya test) paketiniz herhangi bir paket içeren sınıflar içerebilir Ancak diğer yandan sadeliği tercih edebilir ve en iyi düzeyindeki Java paketi adı veya testin aynısı paket adı.

android:sharedUserId="android.uid.system"

Bu, yükleme sırasında bu APK dosyasına temel platformla aynı kullanıcı kimliğinin (ör. çalışma zamanı kimliği) verilmesi gerektiğini belirtir. Not: apk'nin temel platformla aynı sertifikayla imzalanmasına bağlıdır (önceki bölümde LOCAL_CERTIFICATE bölümüne bakın), ancak bu iki değer birbirinden farklıdır: kavramlar:

  • bazı izinler veya API'ler imza korumalıdır. imzalayan sertifika
  • bazı izinler veya API'ler, arayanın system kullanıcı kimliğini gerektirir. system ile paylaşması için çağrı paketi gerekir; temel platformun kendisinden ayrı bir paket
<uses-library android:name="android.test.runner" />

İlgili sınıflar şunlardır: ayrı bir çerçeve JAR kitaplık dosyasında paketlendiğinden test paketi uygulama çerçevesi tarafından çağrıldığında sınıf yolu girişleri.

android:targetPackage="android.test.example.helloworld"

Buradaki targetPackage öğesinin Bu dosyanın manifest etiketinde package özelliği belirtilmiş. Şurada belirtildiği gibi: test temelleri gibi, bu araç testi kategorisi genellikle çerçeve API'lerini test etmek amacıyla kullanılır. Dolayısıyla kendine ait olmayan belirli bir hedeflenen uygulama paketine sahip olmalarını sağlar.

Basit yapılandırma dosyası

Her yeni test modülünün yönlendirme yapması için bir yapılandırma dosyası olmalıdır. modül meta verileri, derleme süresi bağımlılıkları ve paketleme ile derleme sistemi bakın. Çoğu durumda Shortg tabanlı Blueprint dosya seçeneği yeterli olacaktır. Ayrıntılar için bkz. Basit Test Yapılandırması.

Karmaşık yapılandırma dosyası

Bu daha karmaşık durumlarda, Android'in test donanımı Trade Federation için bir test yapılandırması dosyası da yazmanız gerekir.

Test yapılandırması, özel cihaz kurulumu seçenekleri ve varsayılan ayarlar belirtebilir bağımsız değişkenlerin tümünü kullanırsınız. Örneği şurada görebilirsiniz: /platform_testing/tests/example/instrumentation/AndroidTest.xml olarak değiştirebilirsiniz.

Kolaylık sağlamak amacıyla buraya bir anlık görüntü eklenmiştir:

<configuration description="Runs sample instrumentation test.">
  <target_preparer class="com.android.tradefed.targetprep.TestFilePushSetup"/>
  <target_preparer class="com.android.tradefed.targetprep.TestAppInstallSetup">
    <option name="test-file-name" value="HelloWorldTests.apk"/>
  </target_preparer>
  <target_preparer class="com.android.tradefed.targetprep.PushFilePreparer"/>
  <target_preparer class="com.android.tradefed.targetprep.RunCommandTargetPreparer"/>
  <option name="test-suite-tag" value="apct"/>
  <option name="test-tag" value="SampleInstrumentationTest"/>

  <test class="com.android.tradefed.testtype.AndroidJUnitTest">
    <option name="package" value="android.test.example.helloworld"/>
    <option name="runner" value="android.support.test.runner.AndroidJUnitRunner"/>
  </test>
</configuration>

Test yapılandırma dosyasındaki bazı açıklamalar:

<target_preparer class="com.android.tradefed.targetprep.TestAppInstallSetup">
  <option name="test-file-name" value="HelloWorldTests.apk"/>
</target_preparer>

Bu, Ticaret Federasyonu'na HelloWorldTests.apk'yi hedefe yüklemesini söyler belirtilen bir target_preparer kullanarak cihaza yerleştirin. Hedef hazırlayan pek çok kişi vardır. Ticaret Federasyonu'ndaki geliştiriciler tarafından kullanılabiliyor ve bunlar, test yürütülmeden önce cihazın doğru şekilde kurulduğundan emin olun.

<test class="com.android.tradefed.testtype.AndroidJUnitTest">
  <option name="package" value="android.test.example.helloworld"/>
  <option name="runner" value="android.support.test.runner.AndroidJUnitRunner"/>
</test>

Bu, testi yürütmek için kullanılacak Ticaret Federasyonu test sınıfını belirtir ve yürütülecek cihazdaki pakete geçer ve test çalıştırıcı, JUnit'i seçin.

Daha fazla bilgi için bkz. Modül Yapılandırmalarını Test Et.

JUnit4 özellikleri

android-support-test kitaplığının test çalıştırıcısı olarak kullanılması, JUnit4 stil testi sınıfları ve örnek değer değişikliği, olduğunu söylüyor. Örneği şurada görebilirsiniz: /platform_testing/tests/example/instrumentation/src/android/test/example/helloworld/HelloWorldTest.java.

Test kalıpları genellikle bileşen ekiplerine özgüdür ancak test sırasında yaygın olarak kullanılan kullanım kalıplarından bahsedeceğiz.

@RunWith(JUnit4.class)
public class HelloWorldTest {

JUnit4'teki önemli bir fark, testlerin artık ortak bir temel test sınıfından devralınmasının gerekmemesidir. Bunun yerine, testleri düz Java sınıflarında yazar ve belirli test kurulumlarını ve kısıtlamalarını belirtmek için ek açıklama kullanırsınız. İçinde bu örnekte, bu sınıfın bir JUnit4 testi olarak çalıştırılması gerektiği talimatını veriyoruz.

    @BeforeClass
    public static void beforeClass() {
    ...
    @AfterClass
    public static void afterClass() {
    ...
    @Before
    public void before() {
    ...
    @After
    public void after() {
    ...
    @Test
    @SmallTest
    public void testHelloWorld() {
    ...

@Before ve @After ek açıklamaları, JUnit4 tarafından uygulanan yöntemlerde ve test sonrası desteğinin sonlandırılmasıyla ilgilidir. Benzer şekilde, @BeforeClass ve @AfterClass ek açıklamaları, JUnit4 tarafından bir test sınıfındaki tüm testleri çalıştırmadan önce kurulum yapmak ve sonrasında da yıkım işlemini gerçekleştirmek için yöntemlerde kullanılır. Lütfen sınıf kapsamlı kurulum ve söküm yöntemleri statik olmalıdır. Test yöntemleri konusunda ise JUnit'in önceki sürümünün aksine, artık yöntem adının başlatılmasına gerek yoktur. test yerine, her birine @Test ile ek açıklama eklenmelidir. Her zamanki gibi test yöntemleri herkese açık olmalı, değer döndürmemeli, parametre almamalı ve istisnalar yapabilir.

Enstrümantasyon sınıfına erişim

Temel Merhaba Dünya örneğinde ele alınmasa da bir Android testinin Instrumentation örneğine erişim gerektirmesi oldukça yaygındır: Bu, uygulama bağlamlarına, etkinlik yaşam döngüsü ile ilgili test API'lerine ve daha fazlasına erişim sağlayan temel API arayüzüdür.

JUnit4 testleri artık ortak bir temel sınıf gerektirmediğinden şunun üzerinden Instrumentation örneğini almak için gereklidir: InstrumentationTestCase#getInstrumentation() yerine yeni test kullanıcısı InstrumentationRegistry üzerinden yönetir enstrümantasyon çerçevesi tarafından oluşturulan bağlamsal ve çevresel kurulum saklanıyor.

Instrumentation sınıfı örneğine erişmek için statik yöntemi çağırmanız yeterlidir. InstrumentationRegistry sınıfta getInstrumentation():

Instrumentation instrumentation = InstrumentationRegistry.getInstrumentation()

Yerel olarak derleme ve test etme

En yaygın kullanım alanları için Atest'i kullanın.

Daha ağır özelleştirme gerektiren daha karmaşık durumlarda araç talimatlarına bakın.