Bir Uygulama Örneği Hedefleme

Bu enstrümantasyon testi kategorisi, normal Android uygulamalarını hedefleyenlerden çok farklı değildir. Enstrümantasyon içeren test uygulamasının, hedeflediği uygulama ile aynı sertifika ile imzalanması gerektiğini belirtmekte fayda var.

Bu kılavuzun, platform kaynak ağacı iş akışı hakkında zaten biraz bilgi sahibi olduğunuzu varsaydığını unutmayın. Değilse, lütfen https://source.android.com/source/requirements adresine bakın. Burada ele alınan örnek, kendi test uygulama paketinde ayarlanan hedef paket ile yeni bir enstrümantasyon testi yazmaktır. Eğer konsepti haberiniz yoksa, lütfen dikkatlice okuyun Platformu test tanıtım .

Bu kılavuz, örnek teşkil etmesi için takip testini kullanır:

  • çerçeveler/taban/paketler/Kabuk/testler

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

Bir kaynak konumuna karar verme

Enstrümantasyon testi bir uygulama hedeflemesi olacağı için, kongre bir test kaynak kodunu yerleştirmektir tests platformu kaynak ağacında senin bileşen kaynak dizininin kökü altında dizine.

Kaynak konumu hakkında daha fazla tartışmaları bakın kendini instrumenting testler için uçtan uca örneğin .

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 tmodule 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.

Örnek gerrit değişikliği için manifest dosyasının en son sürümüne şu adresten erişilebilir: https://android.googlesource.com/platform/frameworks/base/+/master/packages/Shell/tests/AndroidManifest.xml

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="com.android.shell.tests">

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

        <activity
            android:name="com.android.shell.ActionSendMultipleConsumerActivity"
            android:label="ActionSendMultipleConsumer"
            android:theme="@android:style/Theme.NoDisplay"
            android:noHistory="true"
            android:excludeFromRecents="true">
            <intent-filter>
                <action android:name="android.intent.action.SEND_MULTIPLE" />
                <category android:name="android.intent.category.DEFAULT" />
                <data android:mimeType="*/*" />
            </intent-filter>
        </activity>
    </application>

    <instrumentation android:name="android.support.test.runner.AndroidJUnitRunner"
        android:targetPackage="com.android.shell"
        android:label="Tests for Shell" />

</manifest>

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

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.android.shell.tests">

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.

Bu test altında uygulama paketinden bağımsız bir test uygulama paketi, olduğundan farklı bir paket adı kullanılmalıdır: bir ortak kongre bir son ek eklemektir .test .

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.

<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="com.android.shell"

Bu kadar enstrümantasyon hedef paketini ayarlar com.android.shell . Enstrümantasyon üzerinden çağrıldığında am instrument komutu, çerçeve yeniden başlatılır com.android.shell süreci ve test yürütülmesi için işlemi enjeksiyon yaptığına enstrümantasyon kodu. Bu ayrıca, test kodunun, test edilen uygulamada çalışan tüm sınıf örneklerine erişimi olacağı ve açıkta kalan test kancalarına bağlı olarak durumu değiştirebileceği anlamına gelir.

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. Bkz Basit Testi Yapılandırma detayları için.

Karmaşık yapılandırma dosyası

Daha karmaşık testler için, ayrıca 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.

Numune gerrit değişim için yapılandırma dosyasının son sürümü erişilebilir: çerçeveler / baz / paketler / Shell / test / AndroidTest.xml

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

<configuration description="Runs Tests for Shell.">
    <target_preparer class="com.android.tradefed.targetprep.TestAppInstallSetup">
        <option name="test-file-name" value="ShellTests.apk" />
    </target_preparer>

    <option name="test-suite-tag" value="apct" />
    <option name="test-tag" value="ShellTests" />
    <test class="com.android.tradefed.testtype.AndroidJUnitTest" >
        <option name="package" value="com.android.shell.tests" />
        <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="ShellTests.apk"/>
</target_preparer>

Bu, Trade Federation'a belirli bir target_preparer kullanarak ShellTests.apk'yi 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="com.android.shell.tests"/>
  <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.

Hakkında daha fazla bilgi için buraya bakın Testi Modülü Yapılandırml

JUnit4 özellikleri

Kullanılması android-support-test testi koşucu olarak kütüphaneyi yeni JUnit4 stil testi sınıfların Uyarlamas sağlayan ve örnek gerrit değişim bazı özellikleri çok temel kullanımını içerir.

Örnek gerrit değişim için son kaynak kodu ile erişilebilir: çerçeveler / baz / paketler / Shell / test / src / com / robot / kabuk / BugreportReceiverTest.java

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

@SmallTest
@RunWith(AndroidJUnit4.class)
public final class FeatureFactoryImplTest {

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 Android JUnit4 testi olarak çalıştırılması talimatını veriyoruz.

@SmallTest açıklama tüm test sınıf için bir test boyutunu belirtilen: bu test sınıfa eklenen tüm test yöntemleri bu test boyutu ek açıklama devralır. Benzer: aşağı test sınıf kurulum, son test gözyaşı aşağı ve sonrası test sınıf gözyaşı ön setUp ve tearDown JUnit4 yöntemler. Test açıklama gerçek test eklenmesi için kullanılır.

    @Before
    public void setup() {
    ...
    @Test
    public void testGetProvider_shouldCacheProvider() {
    ...

@Before açıklama öncesi test kurulumunu gerçekleştirmek için JUnit4 tarafından yöntemleri kullanılır. Bu örnekte kullanılan olmasa da, orada da @After son test devrelerde için. 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 edilebilmektedir edilir. 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.

        Context context = InstrumentationRegistry.getTargetContext();

JUnit4 artık ortak bir taban sınıfı gereklidir testleri için, elde etmek için artık gerekli Context ile örneklerini getContext() ya da getTargetContext() temel sınıf yöntemlerle; Bunun yerine, yeni test koşucu yoluyla onları yöneten InstrumentationRegistry enstrümantasyon çerçevesi tarafından oluşturulan bağlamsal ve çevre kurulum saklanır. Bu sınıf aracılığıyla şunları da arayabilirsiniz:

  • getInstrumentation() : için, örneğin Instrumentation sınıfı
  • getArguments() : iletilen komut satırı argümanları am instrument aracılığıyla -e <key> <value>

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ı .