Aktivitas berfungsi sebagai penampung untuk setiap interaksi pengguna dalam aplikasi Anda, sehingga penting untuk menguji perilaku aktivitas aplikasi selama peristiwa tingkat perangkat 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 sebagai respons terhadap peristiwa yang dijelaskan dalam Siklus proses aktivitas.
Panduan ini menjelaskan cara mengevaluasi kemampuan aplikasi Anda untuk mempertahankan integritas data dan pengalaman pengguna yang baik saat aktivitas aplikasi bertransisi melalui berbagai status dalam siklus prosesnya.
Mendorong status aktivitas
Salah satu aspek utama pengujian aktivitas aplikasi melibatkan penempatan aktivitas
aplikasi dalam status tertentu. Untuk menentukan bagian "tertentu" dalam pengujian, gunakan
instance ActivityScenario
,
yang merupakan bagian dari
library AndroidX Test. Dengan menggunakan class ini, Anda dapat
menempatkan aktivitas dalam status yang menyimulasikan peristiwa tingkat perangkat.
ActivityScenario
adalah API lintas platform yang dapat Anda gunakan dalam pengujian unit lokal
dan pengujian integrasi di perangkat. Pada perangkat sungguhan atau virtual,
ActivityScenario
memberikan keamanan thread, menyinkronkan peristiwa antara
thread instrumentasi pengujian dan thread yang menjalankan aktivitas yang sedang diuji.
API ini sangat cocok untuk mengevaluasi perilaku aktivitas yang sedang diuji saat dihancurkan atau dibuat. Bagian ini menampilkan kasus penggunaan paling umum yang terkait dengan API ini.
Membuat sebuah 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
akan mentransisikan aktivitas ke
status RESUMED
. Status ini menunjukkan bahwa aktivitas Anda sedang berjalan dan
terlihat oleh pengguna. Dalam status ini, Anda bebas berinteraksi dengan elemen
View
aktivitas menggunakan pengujian UI Espresso.
Google merekomendasikan agar Anda memanggil close
pada aktivitas saat pengujian
selesai. Tindakan ini akan membersihkan resource terkait dan meningkatkan
stabilitas pengujian Anda. ActivityScenario
mengimplementasikan Closeable
, sehingga Anda dapat menerapkan ekstensi use
, atau try-with-resources
dalam bahasa pemrograman Java, sehingga aktivitas menutup secara otomatis.
Atau, Anda dapat menggunakan ActivityScenarioRule
untuk memanggil ActivityScenario.launch
secara otomatis sebelum setiap pengujian dan ActivityScenario.close
saat pemisahan pengujian. Contoh berikut menunjukkan cara menentukan 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 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 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 menyelesaikan dengan sendirinya, seperti yang ditunjukkan dalam cuplikan kode berikut:
@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 mengakhiri aktivitas,
yang mengharuskan aplikasi membuat ulang aktivitas tersebut saat 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 tersimpan aktivitas dan
objek apa pun yang dianotasi 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 ditunjukkan dalam
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 mengharuskan
Anda 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()) } } }
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() { launchActivity<MyActivity>().use { scenario -> scenario.onActivity { activity -> activity.handleSwipeToRefresh() } } } }