Kendinden Aletli Testler Örneği

Bir enstrümantasyon testi başlatıldığında, hedef paketi enstrümantasyon kodu enjekte edilerek yeniden başlatılır ve yürütme için başlatılır. Bir istisna, buradaki hedef paketin Android uygulama çerçevesinin kendisi olamaz, yani android paketi olamaz, çünkü bunu yapmak, Android çerçevesinin yeniden başlatılması gereken paradoksal duruma yol açar, bu da enstrümantasyon dahil sistem işlevlerini destekler. kendisi.

Bu, bir enstrümantasyon testinin yürütmek için 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üzeylerini veya platform kaynak ağacında bulunan Android Arabirim Tanımlama Dili AIDL aracılığıyla gösterilenleri çağırabilir . Bu test kategorisi için belirli bir paketi hedeflemek anlamlı değildir. Bu nedenle, bu tür araçların kendi AndroidManifest.xml <manifest> etiketinde tanımlandığı gibi kendi test uygulama paketini hedefleyecek şekilde beyan edilmesi alışılmış bir durumdur.

Gereksinimlere bağlı olarak, bu kategorideki test uygulama paketleri şunları da yapabilir:

  • Test için gerekli aktiviteleri paketleyin.
  • Kullanıcı kimliğini sistemle paylaşın.
  • Platform anahtarı ile imzalanmalıdır.
  • Genel SDK yerine çerçeve kaynağına göre derlenmelidir.

Bu enstrümantasyon testleri kategorisine bazen kendi kendine enstrümantasyon denir. Platform kaynağındaki bazı kendi kendine enstrümantasyon testleri örnekleri:

Burada ele alınan örnek, hedef paketin kendi test uygulama paketinde ayarlandığı yeni bir cihaz testi yazmaktır. Bu kılavuz, örnek olarak aşağıdaki testi kullanır:

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

Bir kaynak konuma karar vermek

Tipik olarak ekibiniz, kodu kontrol etmek için önceden belirlenmiş bir yer kalıbına ve testlerin ekleneceği yerlere sahip olacaktır. Çoğu ekibin 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 'AndroidTest.xml' test yapılandırma dosyası.

Yepyeni bir test eklediğiniz için, muhtemelen bileşen src yanında tests dizinini oluşturmanız ve onu içerikle doldurmanız gerekecektir.

Bazı durumlarda, farklı test paketlerini tek tek apks olarak paketlemeniz gerektiğinden, ekibiniz tests altında başka dizin yapılarına sahip olabilir. Ve bu durumda, tests altında yeni bir alt dizin oluşturmanız gerekecektir.

Yapıdan bağımsız olarak, tests dizinini veya yeni oluşturulan alt dizini örnek gerrit değişikliğindeki instrumentation dizinindekilere benzer dosyalarla dolduracaksınız. Aşağıdaki bölümler, her dosyanın daha ayrıntılı olarak açıklanacaktır.

Manifest dosyası

Normal bir uygulama gibi, her enstrümantasyon test modülünün bir bildirim dosyasına ihtiyacı vardır. Dosyayı AndroidManifest.xml ve test modülünüz için Android.mk yanında Android.mk , BUILD_PACKAGE çekirdek dosya dosyası tarafından otomatik olarak BUILD_PACKAGE .

Daha fazla ilerlemeden önce, ilk olarak Uygulama Manifestine Genel Bakış bölümünden geçmeniz şiddetle tavsiye edilir.

Bu, bir bildirim dosyasının temel bileşenlerine ve işlevlerine genel bir bakış sağlar. Platform_testing / testing / example / instrumentation / AndroidManifest.xml adresindeki örneğe bakın.

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ında bazı açıklamalar seçilmiştir:

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

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

Ayrıca, bu package özniteliği, ComponentName#getPackageName() döndürdüğü ile aynıdır ve ayrıca adb shell aracılığıyla çeşitli pm alt komutlarıyla etkileşime girmek için kullanacağınız aynı ComponentName#getPackageName() .

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

android:sharedUserId="android.uid.system"

Bu, yükleme sırasında bu apk'nin çekirdek platformla aynı kullanıcı kimliğini, yani çalışma zamanı kimliğini vermesi gerektiğini bildirir. Bunun çekirdek platformla aynı sertifikayla imzalanan LOCAL_CERTIFICATE bağlı olduğunu unutmayın (yukarıdaki bölümde LOCAL_CERTIFICATE bölümüne bakın), ancak bunlar farklı kavramlardır:

  • bazı izinler veya API'ler, aynı imzalama sertifikasını gerektiren imza korumalıdır
  • Bazı izinler veya API'ler, arayan paketin, çekirdek platformun kendisinden ayrı bir paketse, kullanıcı kimliğini system paylaşmasını gerektiren arayanın system kullanıcı kimliğini gerektirir.
<uses-library android:name="android.test.runner" />

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

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

Buradaki targetPackage , bu dosyanın manifest etiketinde manifest package özniteliğiyle aynı şekilde bildirildiğini fark etmiş olabilirsiniz. Test temellerinde bahsedildiği gibi, bu enstrümantasyon testi kategorisi tipik olarak çerçeve API'lerini test etmeye yöneliktir, bu nedenle kendisinden başka belirli bir hedeflenen uygulama paketine sahip olmak onlar için çok anlamlı değildir.

Basit konfigürasyon dosyası

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

Karmaşık yapılandırma dosyası

Bu daha karmaşık durumlar için, Android'in test koşum takımı olan Ticaret Federasyonu için bir test yapılandırma dosyası da yazmanız gerekir.

Test yapılandırması, test sınıfını sağlamak için özel cihaz kurulum seçeneklerini ve varsayılan bağımsız değişkenleri belirtebilir. /Platform_testing/tests/example/instrumentation/AndroidTest.xml adresindeki örneğe bakın.

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ında bazı seçkin 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'i belirtilen bir target_preparer kullanarak hedef cihaza yüklemesini söyler. Ticaret Federasyonu'ndaki geliştiricilere sunulan birçok hedef hazırlayıcı vardır ve bunlar, test yürütmeden ö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 Ticaret Federasyonu test sınıfını ve yürütülecek cihazdaki pakette geçişleri ve bu durumda JUnit olan test çalıştırıcısı çerçevesini belirtir.

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

JUnit4 özellikleri

Test çalıştırıcısı olarak android-support-test kitaplığını kullanmak, yeni JUnit4 tarzı test sınıflarının benimsenmesini sağlar ve örnek gerrit değişikliği, özelliklerinin bazı çok temel kullanımlarını içerir. /Platform_testing/tests/example/instrumentation/src/android/test/example/helloworld/HelloWorldTest.java adresindeki örneğe bakın.

Test kalıpları genellikle bileşen ekiplerine özel olsa da, genel olarak yararlı bazı kullanım modelleri 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ına gerek olmamasıdır; bunun yerine, düz Java sınıflarında testler yazarsınız ve belirli test kurulumunu ve kısıtlamalarını 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 ek açıklamaları, ön test kurulumu ve test sonrası sökme işlemi gerçekleştirmek için JUnit4 tarafından yöntemlerde kullanılır. Benzer şekilde, @BeforeClass ve @AfterClass ek açıklamaları, bir test sınıfındaki tüm testleri yürütmeden önce kurulumu gerçekleştirmek ve daha sonra sökmek için JUnit4 tarafından yöntemlerde kullanılır. Sınıf kapsamı kurulumunun ve sökme yöntemlerinin statik olması gerektiğini unutmayın. Test yöntemlerine gelince, JUnit'in önceki sürümünden farklı olarak, artık yöntem adını test ile başlatmaları gerekmez, bunun yerine her birine @Test ile açıklama @Test . Her zaman olduğu gibi, test yöntemleri herkese açık olmalı, dönüş değeri bildirmemeli, parametre almamalı ve istisnalar atabilir.

Önemli : test yöntemlerinin kendileri @Test ek açıklaması ile @Test ; 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 . Ek açıklama, yöntem kapsamında veya sınıf kapsamında uygulanabilir.

instrumentation 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 arabirimidir.

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 Atest'i kullanın.

Daha ağır özelleştirme gerektiren daha karmaşık durumlar için enstrümantasyon talimatlarını izleyin.