Hi Kawan-kawan Peserta KADE,
Apa submission tugas ke-4 mu pernah direject karena gagal instrumentation test? Kalau iya, kamu nggak sendirian. Wajib ikuti tutorial ini yah.
Kenapa Kerap Gagal?
Buat kamu-kamu yang belum tahu, kelas Kotlin Android Developer Expert punya sebuah modul yang membahas tentang testing pada aplikasi Android. Di sana juga dijelaskan step-by-step penerapan unit test dan instrumentation test. Pada akhir modul peserta diminta mengirimkan tugas berisi project yang menerapkan unit test dan instrumentation test.
💻 Mulai Belajar Pemrograman
Belajar pemrograman di Dicoding Academy dan mulai perjalanan Anda sebagai developer profesional.
Daftar SekarangSalah satu kendala umum bagi peserta pada tugas tersebut adalah instrumentation testing. Rata-rata tidak berhasil. Apa pasal?
Proses asynchronous pada aplikasi, jawabnya. Tepatnya ketika aplikasi masih perlu menjalankan proses pada background thread seperti menunggu hasil response dari API, sementara Espresso tak mau menunggu dan tetap menjalankan pengujian.
Cara Mengatasinya?
Untuk mengatasi kendala tersebut, berikut beberapa solusi yang sering digunakan.
- Fungsi Thread.sleep()
Cara yang paling mudah adalah dengan menerapkan fungsi Thread.sleep() atau delay. Namun cara tersebut kurang fleksibel karena kita menunda pengujian sesuai dengan waktu yang kita tentukan. Cara ini akan menyebabkan pengujian menjadi kaku karena bisa jadi proses asynchronous sudah selesai sebelum waktu delay selesai. Bahkan bisa juga waktu delay selesai namun ternyata koneksi internet sedang lambat sehingga butuh waktu lebih lama. - Espresso Idling Resource
Cara yang kedua adalah dengan menerapkan Espresso Idling Resource. Idling resource ini akan merepresentasikan operasi asynchronous yang hasilnya mempengaruhi operasi selanjutnya pada UI test. Dengan mendaftarkan Espresso Idling Resource, kita bisa memvalidasi proses asynchronous dengan lebih mudah dan fleksibel saat menguji aplikasi.
Nah, dari kedua solusi tersebut, Espresso Idling resource lah yang sangat direkomendasikan. Lalu bagaimana sih cara menerapkannya ke dalam project Android? Mari ikuti langkah-langkah berikut.
- Tambahkan library Espresso Idling Resource ke dalam build.gradle :
1implementation 'com.android.support.test.espresso:espresso-idling-resource:3.0.2' - Buat sebuah object EspressoIdlingResource:
123456789101112131415object EspressoIdlingResource {private val RESOURCE = "GLOBAL"private val countingIdlingResource = CountingIdlingResource(RESOURCE)val idlingresource: IdlingResourceget() = countingIdlingResourcefun increment() {countingIdlingResource.increment()}fun decrement() {countingIdlingResource.decrement()}}
Object EspressoIdlingResource dan fungsi-fungsinya inilah yang nantinya akan digunakan dalam menandai proses asynchronous yang berjalan pada aplikasi.Pada kelas tersebut gunakan CountingIdlingResource yang berfungsi sebagai penghitung dari tugas-tugas yang dikerjakan. Jika counter-nya 0, tandanya aplikasi sedang tidak menjalankan tugas apa pun.
- Supaya idling resource ini bekerja, lakukan increment() setiap aplikasi akan menjalankan proses asynchronous. Misalnya terapkan ini saat aplikasi akan melakukan load data dari API.
123//Memberitahukan Espresso bahwa aplikasi sedang sibukEspressoIdlingResource.increment()presenter.getTeamList(leagueName)
Kode EspressoIdlingResource.increment() di atas akan memberitahukan Espresso bahwa aplikasi sedang sibuk sampai pemberitahuan berikutnya. Pada tahap ini Espresso akan menghentikan sementara pengujian sampai aplikasi kembali dinyatakan idle atau sudah bebas dari tugasnya.Ketika proses load data dari internet sudah selesai, beritahukan Espresso bahwa tugas sudah selesai dijalankan dengan menggunakan kode EspressoIdlingResource.decrement().
12345678910override fun showTeamList(data: List<Team>) {if (!EspressoIdlingResource.idlingresource.isIdleNow) {//Memberitahukan bahwa tugas sudah selesai dijalankanEspressoIdlingResource.decrement()}swipeRefresh.isRefreshing = falseteams.clear()teams.addAll(data)adapter.notifyDataSetChanged()}
Ketika counter dari idling resource ini sudah kembali 0 atau aplikasi sedang idle maka Espresso akan kembali melanjutkan pengujian. - Terakhir daftarkan EspressoIdlingResource kita ini ke dalam pengujian.
123456789@Beforefun setUp() {IdlingRegistry.getInstance().register(EspressoIdlingResource.idlingresource)}@Afterfun tearDown() {IdlingRegistry.getInstance().unregister(EspressoIdlingResource.idlingresource)}
Kita cukup menambahkan idling resource yang sudah kita buat tadi ke dalam IdlingRegistry setiap kita akan melakukan pengujian. Jangan lupa ya, hapus idling resource tersebut sesaat setelah pengujian selesai. Gunanya untuk menghindari memory leak.
Nah, segitu saja tutorial kali ini. Semoga bermanfaat untuk kamu-kamu yang pusing menghadapi instrumentation testing. Dokumentasi resmi tentang idling resource tersedia di tautan https://developer.android.com/training/testing/espresso/idling-resource.
Salam coba lagi!
“Code less, build more”
Penulis: Widyarso Joko Purnomo
Editor: Nur Rohman, Mutiara Arumsari