Kategori uji instrumentasi ini tidak jauh berbeda dengan penargetan yang aplikasi Android biasa. Perlu diperhatikan bahwa aplikasi pengujian yang mencakup instrumentasi harus ditandatangani dengan sertifikat yang sama sebagai aplikasi yang ditargetkannya.
Perhatikan bahwa panduan ini mengasumsikan bahwa Anda sudah memiliki pengetahuan dalam alur kerja hierarki sumber platform. Jika belum, lihat Persyaratan. Contoh yang dibahas di sini adalah menulis uji instrumentasi baru dengan target paket data pada paket aplikasi pengujiannya sendiri. Jika Anda tidak terbiasa dengan , baca Pengantar pengujian platform.
Panduan ini menggunakan pengujian berikut sebagai contoh:
- framework/dasar/paket/Shell/pengujian
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 di hierarki sumber platform.
Lihat diskusi lebih lanjut tentang lokasi sumber di contoh menyeluruh untuk uji instrumentasi mandiri.
File manifes
Sama seperti aplikasi biasa, setiap modul uji instrumentasi memerlukan
manifes. Jika Anda memberi nama file sebagai AndroidManifest.xml
dan memberikannya berikutnya
ke Android.mk
untuk modul pengujian Anda, modul ini akan disertakan secara otomatis oleh
Makefile inti BUILD_PACKAGE
.
Sebelum melanjutkan, sebaiknya Anda mempelajari Ringkasan Manifes Aplikasi terlebih dahulu.
Ini memberikan gambaran umum tentang komponen dasar dari file manifes dan fungsionalitas.
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 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 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, terpisah dari aplikasi
paket yang sedang diuji, nama paket yang berbeda harus digunakan: satu konvensi umum
adalah menambahkan akhiran .test
.
Selain itu, atribut package
ini sama dengan yang
ComponentName#getPackageName()
dan juga hal yang sama yang akan Anda gunakan untuk berinteraksi dengan berbagai sub-kelompok pm
perintah melalui adb shell
.
Perhatikan juga bahwa meskipun nama paket biasanya memiliki gaya yang sama sebagai nama paket Java, sebenarnya hanya ada sedikit keterkaitan dengannya. Di kata, paket aplikasi (atau pengujian) Anda dapat berisi class dengan paket apa pun lengkap, meskipun di sisi lain, Anda dapat memilih kesederhanaan dan memiliki nama paket Java level dalam aplikasi atau pengujian identik dengan aplikasi nama paket.
<uses-library android:name="android.test.runner" />
Ini diperlukan untuk semua Uji instrumentasi karena class terkait dikemas dalam file library jar framework terpisah, sehingga memerlukan entri classpath 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
memulai ulang proses com.android.shell
, dan memasukkan kode instrumentasi ke dalam
proses untuk menjalankan uji coba. Ini juga berarti bahwa kode
pengujian akan memiliki
akses ke semua instance class yang berjalan di aplikasi yang sedang diuji dan dapat
dapat memanipulasi status tergantung
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 paket petunjuk. Pada umumnya, opsi file {i>Blueprint <i}berbasis Soong memadai. Lihat Konfigurasi Pengujian Sederhana untuk mengetahui detailnya.
File konfigurasi 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 setelan default argumen 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 komentar tertentu dalam 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 Federasi Perdagangan untuk menginstal ShellTests.apk ke target perangkat menggunakan target_preparer yang ditentukan. Ada banyak persiapan target tersedia untuk developer di Federasi Perdagangan dan ini dapat digunakan untuk memastikan perangkat disiapkan dengan benar sebelum eksekusi uji coba.
<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 kelas uji Federasi Perdagangan yang akan digunakan untuk menjalankan pengujian dan meneruskan paket pada perangkat yang akan dieksekusi dan runner pengujian yakni JUnit dalam kasus ini.
Lihat di sini untuk mengetahui informasi selengkapnya tentang Konfigurasi Modul Pengujian
Fitur JUnit4
Dengan menggunakan library android-support-test
sebagai runner pengujian, Anda dapat mengadopsi
Kelas pengujian gaya JUnit4, dan perubahan gerrit sampel berisi beberapa
penggunaan fitur-fiturnya.
Kode sumber terbaru untuk contoh perubahan gerrit dapat diakses di: frameworks/base/packages/Shell/tests/src/com/android/shell/BugreportReceiverTest.java
Walaupun pola pengujian biasanya hanya untuk tim komponen, ada beberapa pola penggunaan yang umumnya berguna.
@SmallTest
@RunWith(AndroidJUnit4.class)
public final class FeatureFactoryImplTest {
Perbedaan yang signifikan di JUnit4 adalah pengujian tidak lagi diperlukan untuk diwarisi dari class pengujian dasar yang umum; sebagai gantinya, Anda menulis pengujian dalam class Java biasa dan menggunakan anotasi untuk menunjukkan penyiapan dan batasan pengujian tertentu. Di beberapa contoh ini, kami menginstruksikan bahwa class ini harus dijalankan sebagai Android Pengujian 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 setelah 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 pembongkaran pasca-pengujian.
Demikian pula, anotasi @BeforeClass
dan @AfterClass
dapat digunakan di
oleh JUnit4 untuk melakukan pengaturan sebelum mengeksekusi semua pengujian dalam kelas pengujian,
dan pembongkaran
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, mendeklarasikan nilai yang ditampilkan,
tidak mengambil parameter, dan dapat melemparkan pengecualian.
Context context = InstrumentationRegistry.getTargetContext();
Karena pengujian JUnit4 tidak lagi memerlukan
class dasar umum, maka
yang diperlukan untuk mendapatkan instance Context
melalui getContext()
atau
getTargetContext()
melalui metode class dasar; sebagai gantinya, runner pengujian baru
mengelolanya melalui InstrumentationRegistry
dengan konfigurasi kontekstual dan lingkungan yang dibuat oleh framework instrumentasi
disimpan. Melalui kelas ini, Anda juga dapat memanggil:
getInstrumentation()
: instance ke classInstrumentation
getArguments()
: argumen command line yang diteruskan keam instrument
melalui-e <key> <value>
Membangun 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.