Aktivitas berfungsi sebagai penampung untuk setiap interaksi pengguna dalam aplikasi, oleh karena itu, sebaiknya uji bagaimana aktivitas aplikasi Anda berperilaku selama peristiwa di tingkat perangkat, seperti berikut ini:
- 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, sebaiknya pastikan aktivitas Anda berperilaku dengan benar sebagai respons terhadap peristiwa yang dijelaskan dalam Memahami Siklus Hidup Aktivitas.
Panduan ini menjelaskan cara mengevaluasi kemampuan aplikasi Anda untuk mempertahankan integritas data dan pengalaman pengguna yang baik saat aktivitas aplikasi Anda bertransisi melalui status yang berbeda dalam siklus prosesnya.
Mendorong status aktivitas
Salah satu aspek utama pengujian aktivitas aplikasi Anda melibatkan penempatan aktivitas aplikasi dalam status tertentu. Untuk menentukan bagian "tersebut" pada pengujian Anda, gunakan instance ActivityScenario
, bagian dari library AndroidX Test. Dengan menggunakan class ini, Anda dapat menempatkan aktivitas pada status yang menyimulasikan peristiwa tingkat perangkat yang dijelaskan di awal halaman ini.
ActivityScenario
adalah API lintas platform yang dapat digunakan dalam pengujian unit lokal dan pengujian integrasi pada perangkat. Pada perangkat sungguhan atau virtual, ActivityScenario
memberikan keamanan thread, menyinkronkan peristiwa antara thread instrumentasi pengujian dan thread dalam pengujian yang menjalankan aktivitas Anda.
API tersebut juga sangat cocok untuk mengevaluasi bagaimana aktivitas yang sedang diuji berperilaku saat aktivitas tersebut diakhiri atau dibuat.
Bagian berikut menunjukkan kasus penggunaan 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() { val scenario = launchActivity<MyActivity>() } }
Setelah membuat aktivitas, ActivityScenario
mentransisikan aktivitas ke status RESUMED
. Status ini menunjukkan bahwa aktivitas Anda sedang berjalan dan dapat dilihat oleh pengguna. Dalam status ini, Anda bebas berinteraksi dengan elemen View
aktivitas Anda menggunakan Pengujian UI Espresso.
Atau, Anda dapat menggunakan ActivityScenarioRule
untuk otomatis memanggil ActivityScenario.launch
sebelum setiap pengujian, dan ActivityScenario.close
pada saat penguraian pengujian. Contoh di bawah ini menunjukkan cara menetapkan aturan dan mendapatkan instance skenario dari aturan tersebut:
@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 dihentikan atau dijeda, karena terhenti oleh aplikasi lain atau tindakan sistem.
Contoh penggunaan moveToState()
ditampilkan dalam cuplikan kode berikut:
@RunWith(AndroidJUnit4::class) class MyTestSuite { @Test fun testEvent() { val scenario = launchActivity<MyActivity>() scenario.moveToState(State.CREATED) } }
Menentukan status aktivitas saat ini
Untuk menentukan status aktivitas saat ini yang sedang diuji, dapatkan nilai kolom state
dalam objek ActivityScenario
Anda. Sebaiknya periksa status aktivitas yang sedang diuji jika aktivitas tersebut mengalihkan ke aktivitas lain atau diakhiri dengan sendirinya, seperti yang ditunjukkan dalam cuplikan kode berikut:
@RunWith(AndroidJUnit4::class) class MyTestSuite { @Test fun testEvent() { val scenario = launchActivity<MyActivity>() scenario.onActivity { activity -> startActivity(Intent(activity, MyOtherActivity::class.java)) } val originalActivityState = scenario.state } }
Membuat ulang aktivitas
Jika perangkat kekurangan resource, sistem mungkin akan mengakhiri aktivitas, yang mengharuskan aplikasi Anda membuat ulang aktivitas tersebut saat pengguna kembali ke aplikasi Anda. Untuk menyimulasikan kondisi ini, panggil recreate()
:
@RunWith(AndroidJUnit4::class) class MyTestSuite { @Test fun testEvent() { val scenario = launchActivity<MyActivity>() scenario.recreate() } }
Class ActivityScenario
mempertahankan status instance tersimpan aktivitas dan setiap objek yang dianotasikan menggunakan @NonConfigurationInstance
. Objek ini dimuat ke dalam instance baru aktivitas Anda yang sedang diuji.
Mengambil hasil aktivitas
Untuk mendapatkan kode hasil atau data yang terkait dengan aktivitas yang sudah selesai, dapatkan nilai kolom result
dalam objek ActivityScenario
Anda, seperti yang ditampilkan dalam cuplikan kode berikut:
@RunWith(AndroidJUnit4::class) class MyTestSuite { @Test fun testResult() { val scenario = launchActivity<MyActivity>() 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
akan memblokir panggilan, sehingga API mengharuskan Anda 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() { val scenario = launchActivity<MyActivity>() onView(withId(R.id.refresh)).perform(click()) } }
Namun, jika perlu memanggil metode pada aktivitas itu sendiri, Anda dapat melakukannya secara aman dengan mengimplementasikan ActivityAction
:
@RunWith(AndroidJUnit4::class) class MyTestSuite { @Test fun testEvent() { val scenario = launchActivity<MyActivity>() scenario.onActivity { activity -> activity.handleSwipeToRefresh() } } }
Untuk mempelajari lebih lanjut cara threading berfungsi dalam pengujian Android, lihat Memahami thread dalam pengujian.