Kendi Kendine Enstrüman Testleri Örneği

Bir enstrümantasyon testi başlatıldığında, enstrümantasyon kodu enjekte edilerek hedef paketi yeniden başlatılır ve yürütme için başlatılır. Bir istisna burada hedef paket Android uygulaması çerçevesinde kendisi yani paket olamaz yani android bunu yaparken enstrümantasyon dahil sistem fonksiyonlarını destekler budur Android çerçeve yeniden başlatılması gerekir paradoksal durum, yol açacak, çünkü kendisi.

Bu, bir enstrümantasyon testinin yürütülmek üzere kendisini Android çerçevesine, yani sistem sunucusuna enjekte edemeyeceği anlamına gelir. Android çerçevesini test etmek için test kodu yalnızca genel API yüzeyleri çağırabilir veya Android Arayüz Tanımlama Dili yoluyla maruz olanlar AIDL platformu kaynak ağacında mevcut. Bu test kategorisi için belirli bir paketi hedeflemek anlamlı değildir. Kendi tanımlanan nedenle, bu tür instrumentations için 's alışılmış, kendi testi uygulama paketi hedef ilan edilecek <manifest> etiketinin AndroidManifest.xml .

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

  • Test için gerekli grup etkinlikleri.
  • Kullanıcı kimliğini sistemle paylaşın.
  • Platform anahtarıyla imzalayın.
  • Genel SDK yerine çerçeve kaynağına göre derlenir.

Bu enstrümantasyon testleri kategorisine bazen kendi kendine enstrümantasyon denir. Platform kaynağında kendi kendine enstrümantasyon testlerine ilişkin bazı örnekler:

Burada ele alınan örnek, kendi test uygulama paketinde ayarlanan hedef paket ile yeni bir enstrümantasyon testi yazmaktır. Bu kılavuz, örnek olması için aşağıdaki testi kullanır:

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

Bir kaynak konumuna karar verme

Tipik olarak ekibiniz, kodu kontrol etmek için yerleşik bir yer düzenine ve test eklemek için yerlere zaten sahip olacaktır. Çoğu takımın tek bir git deposu vardır veya birini diğer ekiplerle paylaşır ancak bileşen kaynak kodunu içeren özel bir alt dizine sahiptir.

Eğer bileşen kaynağı için kök konumunu varsayılırsa olan <component source root> , en bileşenleri var src ve tests gibi bunun altında klasörleri ve bazı ek dosyalar Android.mk (veya ek bölünmüştür .mk dosyaları), bildirim dosyasının AndroidManifest.xml ve test yapılandırma dosyasının 'AndroidTest.xml'.

Eğer yepyeni bir test ekleyerek olduğundan, muhtemelen oluşturmanız gerekir tests yanında bileşen dizini src ve içeriği ile doldurun.

Bazı durumlarda, takımın kapsamında ilave dizin yapıları olabilir tests nedeniyle bireysel apks içine testlerin farklı suit paketlemek için ihtiyaca. Ve bu durumda, sen altında yeni bir alt dizin oluşturmanız gerekir tests .

Ne olursa olsun yapının, sen doldurma bitireceğiz tests dizini veya içinde ne benzer dosyalarla yeni oluşturulan alt dizini instrumentation örnek gerrit değişimde dizinde. Aşağıdaki bölümlerde her dosyanın daha ayrıntılı ayrıntıları açıklanacaktır.

manifest dosyası

Normal bir uygulama gibi, her enstrümantasyon test modülünün bir manifest dosyasına ihtiyacı vardır. Eğer dosyayı isim ise AndroidManifest.xml ve yanındaki bunu sağlamak Android.mk test modülü için, bu otomatik olarak dahil olur BUILD_PACKAGE çekirdek makefile.

Daha ileri gitmeden, son derece geçmesi önerilir Uygulama Manifest Bakış ilk.

Bu, bir bildirim dosyasının temel bileşenlerine ve işlevlerine genel bir bakış sunar. Örneğe bakın / alet / AndroidManifest.xml platform_testing / testler / örneğin .

Kolaylık sağlamak için buraya bir anlık görüntü eklenmiştir:

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

    <uses-sdk android:minSdkVersion="21" android:targetSdkVersion="21" />

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

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

</manifest>

Manifest dosyasındaki bazı seçkin açıklamalar:

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

package özellik uygulama paketi adı: bu Android uygulaması çerçevesinde kullandığı bir uygulamayı belirlemek için bu benzersiz tanımlayıcı (veya bu bağlamda: Test uygulaması). Sistemdeki her kullanıcı, o paket adıyla yalnızca bir uygulama kurabilir.

Ayrıca, bu package nitelik nedir aynıdır ComponentName#getPackageName() iadeler ve ayrıca çeşitli etkileşim için kullanacağınız aynı pm yoluyla alt komutları adb shell .

Paket adının genellikle bir Java paket adıyla aynı tarzda olmasına rağmen, aslında bununla çok az ilgisi olduğunu lütfen unutmayın. Diğer bir deyişle, uygulama (veya test) paketiniz herhangi bir paket adına sahip sınıflar içerebilir, ancak diğer yandan basitliği tercih edebilir ve uygulamanızda en üst düzey Java paket adınızı veya testinizi uygulama paketi adıyla aynı tutabilirsiniz.

android:sharedUserId="android.uid.system"

Bu, kurulum zamanında, bu apk'ye çekirdek platformla aynı kullanıcı kimliğini, yani çalışma zamanı kimliğini verilmesi gerektiğini beyan eder. Not bu çekirdek platformu aynı sertifika ile imzalanmış Apk'nizin bağlıdır (bakınız LOCAL_CERTIFICATE yukarıdaki bölümde), yine de farklı bir kavram olan:

  • bazı izinler veya API'ler, aynı imzalama sertifikasını gerektiren imza korumalıdır
  • Bazı izinler veya API'ler gerektirir system ile paylaşmak kullanıcı kimliğine çağıran paketi gerektirir arayanın, kullanıcı kimliğini system bu çekirdek platformu kendisinden ayrı paket halinde,
<uses-library android:name="android.test.runner" />

İlgili sınıflar ayrı bir çerçeve jar kitaplığı dosyasında paketlendiğinden bu, tüm Enstrümantasyon testleri için gereklidir, bu nedenle test paketi uygulama çerçevesi tarafından çağrıldığında ek sınıf yolu girişleri gerektirir.

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

Bunu fark etmiş olabilirsiniz targetPackage olarak burada aynı bildirildi package niteliği ilan manifest Bu dosyanın etiketi. Bahsedildiği üzere test temelleri , enstrümantasyon testin bu kategori genellikle onları belirli bir hedef uygulama paketi olması için bu nedenle diğer ardından kendisi çok anlamlı değil, çerçeve API'leri test etmek için tasarlanmıştır.

Basit yapılandırma dosyası

Her yeni test modülü, yapı sistemini modül meta verileri, derleme zamanı bağımlılıkları ve paketleme talimatlarıyla yönlendirmek için bir yapılandırma dosyasına sahip olmalıdır. Çoğu durumda, Soong tabanlı Blueprint dosyası seçeneği yeterlidir. Ayrıntılar için bkz Basit Testi Yapılandırma .

Karmaşık yapılandırma dosyası

Bunlar daha karmaşık vakalarda da Android'in testi koşum, için bir test yapılandırma dosyası yazmak gerekir Federasyon'dan .

Test konfigürasyonu, test sınıfını sağlamak için özel cihaz kurulum seçeneklerini ve varsayılan argümanları belirleyebilir. En örneğe bakın /platform_testing/tests/example/instrumentation/AndroidTest.xml .

Kolaylık sağlamak için 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ına ilişkin bazı seçme açıklamalar:

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

Bu, Trade Federation'a HelloWorldTests.apk'yi belirtilen bir target_preparer kullanarak hedef cihaza yüklemesini söyler. Trade Federation'da geliştiricilerin kullanabileceği birçok hedef hazırlayıcı vardır ve bunlar, testin yürütülmesinden önce cihazın doğru şekilde kurulduğundan emin olmak için kullanılabilir.

<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 Trade Federation test sınıfını ve yürütülecek cihazdaki pakette ve bu durumda JUnit olan test çalıştırıcı çerçevesini belirtir.

Daha fazla bilgi için, bkz Testi Modülü yapılandırmaları .

JUnit4 özellikleri

Kullanılması android-support-test testi koşucu olarak kütüphaneyi yeni JUnit4 stil testi sınıflarının kabulü sağlar ve örnek gerrit değişim bazı özellikleri çok temel kullanımını içerir. En örneğe bakın /platform_testing/tests/example/instrumentation/src/android/test/example/helloworld/HelloWorldTest.java .

Test kalıpları genellikle bileşen ekiplerine özel olsa da, genel olarak faydalı bazı kullanım kalıpları vardır.

@RunWith(JUnit4.class)
public class HelloWorldTest {

JUnit4'teki önemli bir fark, testlerin artık ortak bir temel test sınıfından miras alması gerekmemesidir; bunun yerine, testleri düz Java sınıflarında yazar ve belirli test kurulumlarını ve kısıtlamaları belirtmek için açıklama kullanırsınız. Bu örnekte, bu sınıfın bir JUnit4 testi olarak çalıştırılması 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 açıklamalar ön test setup ve son test devrelerde gerçekleştirmek için JUnit4 tarafından yöntemleri kullanılır. Benzer şekilde, @BeforeClass ve @AfterClass ek açıklamaları söküm sonradan bir test sınıftaki tüm testleri yürütmeden önce kurulumunu gerçekleştirmek için JUnit4 tarafından yöntemleri kullanılır ve. Sınıf kapsamı kurulum ve sökme yöntemlerinin statik olması gerektiğini unutmayın. Test yöntemlerinin gelince, JUnit önceki sürümünde aksine, bunlar artık gerek ile yöntem adı başlatmak için test yerine, bunların her biri ile açıklamalı olmalıdır @Test . Her zamanki gibi, test yöntemleri herkese açık olmalı, dönüş değeri bildirmemeli, parametre almamalı ve istisnalar atabilir.

Önemli: kendileri not eklenmiş test yöntemleri @Test açıklama; ve testler APCT ile yürütülecek için, bu deney boyutları ile açıklamalı gereken dikkat edin: Örnek açıklamalı yöntem testHelloWorld olarak @SmallTest . Açıklama, yöntem kapsamında veya sınıf kapsamında uygulanabilir.

erişme instrumentation

Temel merhaba dünya örnekte yer almayan rağmen bir Android test erişim gerektiren için, oldukça yaygındır Instrumentation örneği: Bu uygulama bağlamlarda, etkinlik yaşam döngüsü ile ilgili test API ve daha erişim sağlar çekirdek API arayüzüdür.

JUnit4 artık testleri aynı temel sınıfa gerektirdiğinden, bu elde etmek artık gerekli Instrumentation yoluyla örneğini InstrumentationTestCase#getInstrumentation() yerine, yeni test koşucu yoluyla yönetir InstrumentationRegistry enstrümantasyon çerçevesi tarafından oluşturulan bağlamsal ve çevre kurulum saklanır.

Örneğini erişmek için Instrumentation sınıfında, sadece statik yöntem çağrı getInstrumentation() üzerine InstrumentationRegistry sınıfının:

Instrumentation instrumentation = InstrumentationRegistry.getInstrumentation()

Yerel olarak derleyin ve test edin

En yaygın kullanım durumları için, istihdam ATEST .

Ağır özelleştirme gerektiren daha karmaşık vakalarda izleyin enstrümantasyon talimatları .