Kategori uji instrumentasi ini tidak jauh berbeda dengan kategori 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 dalam alur kerja hierarki sumber platform. Jika tidak, lihat Persyaratan. Contoh yang dibahas di sini adalah menulis pengujian instrumentasi baru dengan paket target yang ditetapkan di paket aplikasi pengujiannya sendiri. Jika Anda tidak terbiasa dengan konsep ini, baca Pengantar pengujian platform.
Panduan ini menggunakan pengujian berikut sebagai contoh:
- frameworks/base/packages/Shell/tests
Sebaiknya jelajahi kode terlebih dahulu untuk mendapatkan tayangan kasar sebelum melanjutkan.
Menentukan lokasi sumber
Karena uji instrumentasi akan menargetkan aplikasi, konvensi
adalah menempatkan kode sumber pengujian di direktori tests
di bawah root
direktori sumber komponen Anda dalam hierarki sumber platform.
Lihat diskusi selengkapnya tentang lokasi sumber di contoh menyeluruh 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 memberikannya di samping
Android.mk
untuk modul pengujian, file tersebut akan otomatis disertakan oleh
makefile inti BUILD_PACKAGE
.
Sebelum melanjutkan lebih lanjut, sebaiknya baca Ringkasan Manifes Aplikasi terlebih dahulu.
Bagian ini memberikan ringkasan tentang komponen dasar file manifes dan fungsinya.
Versi terbaru file manifes untuk contoh perubahan gerrit dapat diakses di: https://android.googlesource.com/platform/frameworks/base/+/main/packages/Shell/tests/AndroidManifest.xml
Snapshot disertakan di sini untuk kemudahan:
<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 komentar tertentu pada 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 independen 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 oleh
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 sebenarnya tidak memiliki banyak hubungan dengan nama paket Java. Dengan kata lain, paket aplikasi (atau pengujian) dapat berisi class dengan nama paket apa pun, meskipun di sisi lain, Anda dapat memilih agar lebih sederhana dan menetapkan nama paket Java level atas dalam aplikasi atau pengujian yang identik dengan nama paket aplikasi.
<uses-library android:name="android.test.runner" />
Hal ini diperlukan untuk semua uji 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 memasukkan 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 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 paket. Dalam sebagian besar kasus, opsi file Blueprint berbasis Soong sudah memadai. Lihat Konfigurasi Pengujian Sederhana untuk mengetahui detailnya.
File konfigurasi yang kompleks
Untuk pengujian yang lebih kompleks, Anda juga perlu menulis file konfigurasi pengujian untuk harness pengujian Android, Trade Federation.
Konfigurasi pengujian dapat menentukan opsi penyiapan perangkat khusus dan argumen default untuk menyediakan class pengujian.
Versi terbaru file konfigurasi untuk contoh perubahan gerrit 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 komentar pilihan pada file konfigurasi pengujian:
<target_preparer class="com.android.tradefed.targetprep.TestAppInstallSetup">
<option name="test-file-name" value="ShellTests.apk"/>
</target_preparer>
Tindakan ini akan memberi tahu Trade Federation untuk menginstal ShellTests.apk ke perangkat target menggunakan target_preparer yang ditentukan. Ada banyak pembuat target yang tersedia bagi developer di Trade Federation dan alat ini dapat digunakan untuk memastikan perangkat disiapkan dengan benar sebelum dieksekusi.
<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>
Ini menentukan class pengujian Trade Federation yang akan digunakan untuk menjalankan pengujian dan meneruskan paket di perangkat yang akan dijalankan dan framework runner pengujian yang dalam hal ini adalah JUnit.
Lihat di sini untuk mengetahui informasi selengkapnya tentang Konfigurasi Modul Pengujian
Fitur JUnit4
Penggunaan library android-support-test
sebagai runner pengujian memungkinkan
penerapan class pengujian gaya JUnit4 baru, dan contoh perubahan gerrit berisi beberapa penggunaan
fitur yang sangat mendasar.
Kode sumber terbaru untuk contoh perubahan gerrit 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 bahwa pengujian tidak lagi perlu mewarisi dari class pengujian dasar umum. Sebagai gantinya, Anda dapat menulis pengujian di 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 class pengujian ini mewarisi anotasi ukuran pengujian ini.
penyiapan class pra-pengujian, penghapusan class pasca-pengujian, dan penghapusan class pasca-pengujian:
mirip dengan metode setUp
dan tearDown
di JUnit4.
Anotasi Test
digunakan untuk menganotasi pengujian yang 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 pemisahan 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 penghapusan cakupan class
harus bersifat statis.
Untuk metode pengujian, tidak seperti di JUnit versi sebelumnya, metode tersebut tidak perlu lagi
memulai nama metode dengan test
, tetapi masing-masing harus dianotasi
dengan @Test
. Seperti biasa, metode pengujian harus bersifat publik, tidak mendeklarasikan nilai yang ditampilkan,
tidak menggunakan parameter, dan dapat menampilkan pengecualian.
Context context = InstrumentationRegistry.getTargetContext();
Karena pengujian JUnit4 tidak lagi memerlukan class dasar umum, Anda tidak perlu lagi
mendapatkan instance Context
melalui getContext()
atau
getTargetContext()
melalui metode class dasar; sebagai gantinya, runner pengujian 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 classInstrumentation
getArguments()
: argumen command line yang diteruskan keam instrument
melalui-e <key> <value>
Mem-build dan menguji secara lokal
Untuk kasus penggunaan yang paling umum, gunakan Atest.
Untuk kasus lebih kompleks yang memerlukan penyesuaian lebih berat, ikuti petunjuk instrumentasi.