Menarget contoh aplikasi

Kategori uji instrumentasi ini tidak jauh berbeda dengan pengujian yang menargetkan aplikasi Android biasa. Perlu diperhatikan bahwa aplikasi pengujian yang menyertakan instrumentasi harus ditandatangani dengan sertifikat yang sama dengan aplikasi yang ditargetkan.

Perhatikan bahwa panduan ini mengasumsikan bahwa Anda sudah memiliki pengetahuan tentang alur kerja pohon sumber platform. Jika belum, lihat Persyaratan. Contoh yang dibahas di sini adalah menulis uji instrumentasi baru dengan paket target yang ditetapkan di paket aplikasi pengujiannya sendiri. Jika Anda belum memahami konsep ini, baca Pengantar pengujian platform.

Panduan ini menggunakan pengujian berikut sebagai contoh:

  • frameworks/base/packages/Shell/tests

Sebaiknya telusuri kode terlebih dahulu untuk mendapatkan gambaran kasar sebelum melanjutkan.

Menentukan lokasi sumber

Karena pengujian instrumentasi akan menargetkan aplikasi, konvensinya adalah menempatkan kode sumber pengujian di direktori tests di bawah root direktori sumber komponen Anda di pohon sumber platform.

Lihat diskusi selengkapnya tentang lokasi sumber dalam contoh end-to-end untuk pengujian instrumentasi mandiri.

File manifes

Sama seperti aplikasi biasa, setiap modul uji instrumentasi memerlukan file manifes. Jika Anda memberi nama file sebagai AndroidManifest.xml dan menyediakannya di samping Android.mk untuk modul pengujian, file tersebut akan otomatis disertakan oleh makefile inti BUILD_PACKAGE.

Sebelum melanjutkan, sebaiknya baca Ringkasan Manifes Aplikasi terlebih dahulu.

Hal ini memberikan ringkasan komponen dasar file manifes dan fungsinya.

Versi terbaru file manifes untuk perubahan gerrit contoh dapat diakses di: https://android.googlesource.com/platform/frameworks/base/+/android17-release/packages/Shell/tests/AndroidManifest.xml

Snapshot disertakan di sini untuk memudahkan:

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

Beberapa catatan pilihan tentang file manifes:

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

Atribut package adalah nama paket aplikasi: ini adalah ID unik yang digunakan framework aplikasi Android untuk mengidentifikasi aplikasi (atau dalam konteks ini: aplikasi pengujian Anda). Setiap pengguna dalam sistem hanya dapat menginstal satu aplikasi dengan nama paket tersebut.

Karena ini adalah paket aplikasi pengujian, yang terpisah dari paket aplikasi yang sedang diuji, nama paket yang berbeda harus digunakan: salah satu konvensi umum adalah menambahkan akhiran .test.

Selain itu, atribut package ini sama dengan yang ditampilkan ComponentName#getPackageName(), dan juga sama dengan yang akan Anda gunakan untuk berinteraksi dengan berbagai sub perintah pm melalui adb shell.

Perhatikan juga bahwa meskipun nama paket biasanya memiliki gaya yang sama dengan nama paket Java, nama paket tersebut sebenarnya hanya memiliki sedikit kesamaan. Dengan kata lain, paket aplikasi (atau pengujian) Anda dapat berisi class dengan nama paket apa pun, meskipun di sisi lain, Anda dapat memilih kesederhanaan dan memiliki nama paket Java tingkat atas di aplikasi atau pengujian yang identik dengan nama paket aplikasi.

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

Hal ini diperlukan untuk semua pengujian Instrumentasi karena class terkait dikemas dalam file library jar framework terpisah, sehingga memerlukan entri classpath tambahan saat paket pengujian dipanggil oleh framework aplikasi.

android:targetPackage="com.android.shell"

Tindakan ini menetapkan paket target instrumentasi ke com.android.shell. Saat instrumentasi dipanggil melalui perintah am instrument, framework akan memulai ulang proses com.android.shell, dan menyuntikkan kode instrumentasi ke dalam proses untuk eksekusi uji. Hal ini juga berarti bahwa kode pengujian akan memiliki akses ke semua instance class yang berjalan di aplikasi yang sedang diuji dan mungkin dapat memanipulasi status yang bergantung pada hook pengujian yang diekspos.

File konfigurasi sederhana

Setiap modul pengujian baru harus memiliki file konfigurasi untuk mengarahkan sistem build dengan metadata modul, dependensi waktu kompilasi, dan petunjuk pengemasan. Dalam sebagian besar kasus, opsi file Blueprint berbasis Soong sudah cukup. Lihat Konfigurasi Pengujian Sederhana untuk mengetahui detailnya.

File konfigurasi kompleks

Untuk pengujian yang lebih kompleks, Anda juga perlu menulis file konfigurasi pengujian untuk test harness Android, Trade Federation.

Konfigurasi pengujian dapat menentukan opsi penyiapan perangkat khusus dan argumen default untuk menyediakan class pengujian.

Versi terbaru file konfigurasi untuk perubahan gerrit contoh dapat diakses di: frameworks/base/packages/Shell/tests/AndroidTest.xml

Snapshot disertakan di sini untuk memudahkan:

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

Beberapa catatan pilihan tentang file konfigurasi pengujian:

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

Hal ini memberi tahu Trade Federation untuk menginstal ShellTests.apk ke perangkat target menggunakan target_preparer yang ditentukan. Ada banyak preparer target yang tersedia untuk developer di Trade Federation dan dapat digunakan untuk memastikan perangkat disiapkan dengan benar sebelum eksekusi uji.

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

Hal ini menentukan class pengujian Trade Federation yang akan digunakan untuk menjalankan pengujian dan meneruskan paket di perangkat yang akan dieksekusi dan framework test runner yang dalam hal ini adalah JUnit.

Lihat di sini untuk mengetahui informasi selengkapnya tentang Konfigurasi Modul Pengujian

Fitur JUnit4

Menggunakan library android-support-test sebagai test runner memungkinkan adopsi class pengujian gaya JUnit4 baru, dan perubahan gerrit contoh berisi beberapa penggunaan fitur yang sangat mendasar.

Kode sumber terbaru untuk perubahan gerrit contoh dapat diakses di: frameworks/base/packages/Shell/tests/src/com/android/shell/BugreportReceiverTest.java

Meskipun pola pengujian biasanya khusus untuk tim komponen, ada beberapa pola penggunaan yang umumnya berguna.

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

Perbedaan signifikan dalam JUnit4 adalah pengujian tidak lagi diperlukan untuk mewarisi dari class pengujian dasar umum; sebagai gantinya, Anda menulis pengujian dalam class Java biasa dan menggunakan anotasi untuk menunjukkan penyiapan dan batasan pengujian tertentu. Dalam contoh ini, kami menginstruksikan bahwa class ini harus dijalankan sebagai pengujian Android JUnit4.

Anotasi @SmallTest menentukan ukuran pengujian untuk seluruh class pengujian: semua metode pengujian yang ditambahkan ke dalam class pengujian ini mewarisi anotasi ukuran pengujian ini. penyiapan class pra-pengujian, penguraian pasca-pengujian, dan penguraian class pasca-pengujian: mirip dengan metode setUp dan tearDown di JUnit4. Anotasi Test digunakan untuk menganotasi pengujian sebenarnya.

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

Anotasi @Before digunakan pada metode oleh JUnit4 untuk melakukan penyiapan pra-pengujian. Meskipun tidak digunakan dalam contoh ini, ada juga @After untuk penguraian pasca-pengujian. Demikian pula, anotasi @BeforeClass dan @AfterClass dapat digunakan pada metode oleh JUnit4 untuk melakukan penyiapan sebelum menjalankan semua pengujian dalam class pengujian, dan penguraian setelahnya. Perhatikan bahwa metode penyiapan dan penguraian cakupan class harus statis.

Untuk metode pengujian, tidak seperti pada versi JUnit sebelumnya, metode pengujian tidak lagi perlu memulai nama metode dengan test, tetapi setiap metode harus dianotasi dengan @Test. Seperti biasa, metode pengujian harus bersifat publik, tidak mendeklarasikan nilai yang ditampilkan, tidak mengambil parameter, dan dapat menampilkan pengecualian.

        Context context = InstrumentationRegistry.getTargetContext();

Karena pengujian JUnit4 tidak lagi memerlukan class dasar umum, tidak perlu lagi mendapatkan Context instance melalui getContext() atau getTargetContext() melalui metode class dasar; sebagai gantinya, test runner baru mengelolanya melalui InstrumentationRegistry tempat penyiapan kontekstual dan lingkungan yang dibuat oleh framework instrumentasi disimpan. Melalui class ini, Anda juga dapat memanggil:

  • getInstrumentation(): instance ke class Instrumentation
  • getArguments(): argumen command line yang diteruskan ke am instrument melalui -e <key> <value>

Membuat dan menguji secara lokal

Untuk kasus penggunaan yang paling umum, gunakan Atest.

Untuk kasus yang lebih kompleks yang memerlukan penyesuaian yang lebih berat, ikuti petunjuk instrumentasi.