Aktivitas berfungsi sebagai penampung untuk setiap interaksi pengguna dalam aplikasi Anda, jadi penting untuk menguji bagaimana perilaku aktivitas aplikasi Anda selama tingkat perangkat peristiwa seperti berikut:
- Aplikasi lain, seperti aplikasi ponsel perangkat, akan mengganggu aktivitas aplikasi Anda.
- Sistem akan mengakhiri dan membuat ulang aktivitas Anda.
- Pengguna menempatkan aktivitas Anda di lingkungan windowing baru, seperti picture-in-picture (PIP) atau multi-aplikasi.
Secara khusus, penting untuk memastikan bahwa aktivitas Anda berperilaku dengan benar di respons Anda terhadap peristiwa yang dijelaskan dalam Aktivitas siklus proses.
Panduan ini menjelaskan cara mengevaluasi kemampuan aplikasi Anda dalam mempertahankan data integritas data dan pengalaman pengguna yang baik saat transisi aktivitas aplikasi Anda melalui berbagai status dalam siklus hidupnya.
Mendorong status aktivitas
Salah satu aspek utama pengujian aktivitas aplikasi Anda melibatkan penempatan elemen
aktivitas di status tertentu. Untuk mendefinisikan "diberikan" ini sebagai bagian dari pengujian, gunakan
instance ActivityScenario,
bagian dari
Library AndroidX Test. Dengan menggunakan kelas ini, Anda dapat
menempatkan aktivitas dalam status yang menyimulasikan kejadian tingkat perangkat.
ActivityScenario adalah API lintas platform yang dapat Anda gunakan dalam pengujian unit lokal
dan pengujian integrasi di perangkat. Pada perangkat nyata atau virtual,
ActivityScenario menyediakan keamanan thread, menyinkronkan peristiwa antara
thread instrumentasi pengujian dan thread yang menjalankan aktivitas Anda yang sedang diuji.
API ini sangat cocok untuk mengevaluasi bagaimana aktivitas dalam perilakunya saat pengujian dihancurkan atau dibuat. Bagian ini menyajikan presentasi yang paling umum yang terkait dengan API ini.
Membuat aktivitas
Untuk membuat aktivitas yang sedang diuji, tambahkan kode yang ditampilkan dalam cuplikan berikut:
@RunWith(AndroidJUnit4::class) class MyTestSuite { @Test fun testEvent() { launchActivity<MyActivity>().use { } } }
Setelah membuat aktivitas, ActivityScenario mentransisikan aktivitas ke
status RESUMED. Status ini menunjukkan bahwa aktivitas Anda sedang berjalan dan
terlihat oleh pengguna. Dalam keadaan ini, Anda bebas untuk berinteraksi dengan
Elemen View menggunakan pengujian UI Espresso.
Google merekomendasikan agar Anda memanggil close pada aktivitas saat pengujian
selesai. Tindakan ini membersihkan resource terkait dan meningkatkan
stabilitas pengujian Anda. ActivityScenario mengimplementasikan Closeable sehingga Anda dapat
menerapkan ekstensi use, atau try-with-resources dalam pemrograman Java
sehingga aktivitas menutup secara otomatis.
Atau, Anda dapat menggunakan ActivityScenarioRule untuk memanggil secara otomatis
ActivityScenario.launch sebelum setiap pengujian dan ActivityScenario.close
saat pembongkaran pengujian. Contoh berikut menunjukkan cara menetapkan aturan dan mendapatkan
contoh skenario darinya:
@RunWith(AndroidJUnit4::class) class MyTestSuite { @get:Rule var activityScenarioRule = activityScenarioRule<MyActivity>() @Test fun testEvent() { val scenario = activityScenarioRule.scenario } }
Mendorong aktivitas ke status baru
Untuk mendorong aktivitas ke status yang berbeda, seperti CREATED atau STARTED, panggil
moveToState(). Tindakan ini menyimulasikan situasi saat aktivitas Anda
dihentikan atau dijeda, karena terganggu oleh aplikasi lain atau
tindakan sistem.
Contoh penggunaan moveToState() akan ditampilkan dalam cuplikan kode berikut:
@RunWith(AndroidJUnit4::class) class MyTestSuite { @Test fun testEvent() { launchActivity<MyActivity>().use { scenario -> scenario.moveToState(State.CREATED) } } }
Menentukan status aktivitas saat ini
Untuk menentukan status aktivitas yang sedang diuji, dapatkan nilai aktivitas
Kolom state dalam objek ActivityScenario Anda. Ini sangat membantu
untuk memeriksa status aktivitas yang sedang diuji jika aktivitas dialihkan ke
aktivitas lain atau selesai dengan sendirinya, seperti yang ditunjukkan dalam kode berikut
snippet:
@RunWith(AndroidJUnit4::class) class MyTestSuite { @Test fun testEvent() { launchActivity<MyActivity>().use { scenario -> scenario.onActivity { activity -> startActivity(Intent(activity, MyOtherActivity::class.java)) } val originalActivityState = scenario.state } } }
Membuat ulang aktivitas
Jika perangkat kekurangan resource, sistem mungkin akan menghancurkan aktivitas,
mengharuskan aplikasi Anda membuat ulang aktivitas tersebut ketika pengguna kembali ke aplikasi Anda.
Untuk menyimulasikan kondisi ini, panggil recreate():
@RunWith(AndroidJUnit4::class) class MyTestSuite { @Test fun testEvent() { launchActivity<MyActivity>().use { scenario -> scenario.recreate() } } }
Class ActivityScenario mempertahankan status instance aktivitas yang tersimpan dan
objek apa pun yang dianotasi menggunakan @NonConfigurationInstance. Objek ini dimuat
ke dalam instance baru dari aktivitas Anda yang sedang diuji.
Mengambil hasil aktivitas
Untuk mendapatkan kode hasil atau data yang terkait dengan aktivitas yang sudah selesai, dapatkan metode
nilai kolom result dalam objek ActivityScenario, seperti yang ditunjukkan di
cuplikan kode berikut:
@RunWith(AndroidJUnit4::class) class MyTestSuite { @Test fun testResult() { launchActivity<MyActivity>().use { onView(withId(R.id.finish_button)).perform(click()) // Activity under test is now finished. val resultCode = scenario.result.resultCode val resultData = scenario.result.resultData } } }
Memicu tindakan dalam aktivitas
Semua metode dalam ActivityScenario memblokir panggilan, sehingga API memerlukan
untuk menjalankannya di thread instrumentasi.
Untuk memicu tindakan dalam aktivitas yang sedang diuji, gunakan matcher tampilan Espresso untuk berinteraksi dengan elemen dalam tampilan Anda:
@RunWith(AndroidJUnit4::class) class MyTestSuite { @Test fun testEvent() { launchActivity<MyActivity>().use { onView(withId(R.id.refresh)).perform(click()) } } }
Akan tetapi, jika perlu memanggil metode pada aktivitas itu sendiri, Anda bisa melakukannya
secara aman dengan menerapkan ActivityAction:
@RunWith(AndroidJUnit4::class) class MyTestSuite { @Test fun testEvent() { launchActivity<MyActivity>().use { scenario -> scenario.onActivity { activity -> activity.handleSwipeToRefresh() } } } }