Halaman ini menguraikan prinsip inti pengujian aplikasi Android, termasuk praktik terbaik utama dan manfaatnya.
Manfaat pengujian
Pengujian adalah bagian integral dari proses pengembangan aplikasi. Dengan menjalankan pengujian terhadap aplikasi secara konsisten, Anda dapat memverifikasi ketepatan, perilaku fungsional, dan kegunaan aplikasi sebelum merilisnya ke publik.
Anda dapat menguji aplikasi secara manual dengan membukanya. Anda dapat menggunakan perangkat dan emulator yang berbeda, mengubah bahasa sistem, dan mencoba membuat setiap error pengguna atau menjelajahi setiap alur pengguna.
Namun, pengujian manual tidak dapat diskalakan dengan baik, dan regresi dalam perilaku aplikasi Anda dapat dengan mudah diabaikan. Pengujian otomatis melibatkan penggunaan alat yang melakukan pengujian untuk Anda, yang lebih cepat, lebih berulang, dan umumnya memberi Anda masukan yang lebih bisa ditindaklanjuti tentang aplikasi Anda lebih awal dalam proses pengembangan.
Jenis pengujian di Android
Aplikasi seluler sangatlah rumit dan harus berfungsi dengan baik di banyak lingkungan. Dengan demikian, ada banyak jenis pengujian.
Subjek
Misalnya, ada berbagai jenis pengujian, bergantung pada subjeknya:
- Pengujian fungsional: apakah aplikasi saya melakukan fungsinya?
- Pengujian performa: apakah pengujian ini dilakukan dengan cepat dan efisien?
- Pengujian aksesibilitas: apakah berfungsi dengan baik dengan layanan aksesibilitas?
- Pengujian kompatibilitas: apakah berfungsi dengan baik di setiap perangkat dan level API?
Cakupan
Pengujian juga bervariasi, bergantung pada ukuran, atau tingkat isolasi:
- Pengujian unit atau pengujian kecil hanya memverifikasi sebagian kecil aplikasi, seperti metode atau class.
- Pengujian end-to-end atau pengujian besar memverifikasi bagian aplikasi yang lebih besar secara bersamaan, seperti seluruh layar atau alur penggunaan.
- Pengujian sedang berada di antara dan memeriksa integrasi antara dua unit atau beberapa.
Ada banyak cara untuk mengklasifikasikan pengujian. Namun, perbedaan yang paling penting bagi developer aplikasi adalah tempat pengujian dijalankan.
Pengujian berinstrumen versus lokal
Anda dapat menjalankan pengujian di perangkat Android atau di komputer lain:
- Pengujian berinstrumen berjalan di perangkat Android, baik fisik maupun yang diemulasi. Aplikasi ini dibuat dan diinstal bersama aplikasi pengujian yang memasukkan perintah dan membaca status. Pengujian berinstrumen biasanya adalah pengujian UI, yang meluncurkan aplikasi, lalu berinteraksi dengannya.
- Pengujian lokal dijalankan di mesin pengembangan atau server, sehingga pengujian ini juga disebut pengujian sisi host. Pengujian ini biasanya kecil dan cepat, yang mengisolasi subjek yang sedang diuji dari aplikasi lainnya.
Tidak semua pengujian unit bersifat lokal, dan tidak semua pengujian menyeluruh berjalan di perangkat. Contoh:
- Pengujian lokal besar: Anda dapat menggunakan simulator Android yang berjalan secara lokal, seperti Robolectric.
- Pengujian berinstrumen kecil: Anda dapat memverifikasi bahwa kode Anda berfungsi dengan baik dengan fitur framework, seperti database SQLite. Anda dapat menjalankan pengujian ini di beberapa perangkat untuk memeriksa integrasi dengan beberapa versi SQLite.
Contoh
Cuplikan berikut menunjukkan cara berinteraksi dengan UI dalam pengujian UI berinstrumen yang mengklik elemen dan memverifikasi bahwa elemen lain ditampilkan.
Espresso
// When the Continue button is clicked
onView(withText("Continue"))
.perform(click())
// Then the Welcome screen is displayed
onView(withText("Welcome"))
.check(matches(isDisplayed()))
Compose UI
// When the Continue button is clicked
composeTestRule.onNodeWithText("Continue").performClick()
// Then the Welcome screen is displayed
composeTestRule.onNodeWithText("Welcome").assertIsDisplayed()
Cuplikan ini menunjukkan bagian dari pengujian unit untuk ViewModel (pengujian lokal, sisi host):
// Given an instance of MyViewModel
val viewModel = MyViewModel(myFakeDataRepository)
// When data is loaded
viewModel.loadData()
// Then it should be exposing data
assertTrue(viewModel.data != null)
Arsitektur yang dapat diuji
Dengan arsitektur aplikasi yang dapat diuji, kode mengikuti struktur yang memungkinkan Anda menguji berbagai bagiannya secara terpisah dengan mudah. Arsitektur yang dapat diuji memiliki keunggulan lain, seperti keterbacaan, pemeliharaan, skalabilitas, dan penggunaan kembali yang lebih baik.
Arsitektur yang tidak dapat diuji menghasilkan hal berikut:
- Pengujian yang lebih besar, lebih lambat, dan tidak stabil. Class yang tidak dapat diuji unit mungkin harus dicakup oleh pengujian integrasi atau pengujian UI yang lebih besar.
- Lebih sedikit peluang untuk menguji berbagai skenario. Pengujian yang lebih besar lebih lambat, sehingga menguji semua kemungkinan status aplikasi mungkin tidak realistis.
Untuk mempelajari panduan arsitektur lebih lanjut, lihat panduan untuk arsitektur aplikasi.
Pendekatan untuk pemisahan
Jika Anda dapat mengekstrak bagian dari fungsi, class, atau modul dari yang lainnya, pengujiannya akan lebih mudah dan lebih efektif. Praktik ini dikenal sebagai pemisahan, dan adalah konsep yang paling penting untuk arsitektur yang dapat diuji.
Teknik pemisahan umum meliputi:
- Memisahkan aplikasi menjadi lapisan seperti Presentasi, Domain, dan Data. Anda juga dapat membagi aplikasi menjadi beberapa modul, satu per fitur.
- Hindari menambahkan logika ke entity yang memiliki dependensi besar, seperti aktivitas dan fragmen. Gunakan class ini sebagai titik entri ke framework dan pindahkan UI dan logika bisnis ke tempat lain, seperti ke Composable, ViewModel, atau lapisan domain.
- Hindari dependensi framework langsung di class yang berisi logika bisnis. Misalnya, jangan gunakan Konteks Android di ViewModel.
- Buat dependensi mudah diganti. Misalnya, gunakan antarmuka, bukan implementasi konkret. Gunakan Injeksi dependensi meskipun Anda tidak menggunakan framework DI.
Langkah berikutnya
Setelah mengetahui alasan Anda harus melakukan pengujian dan dua jenis pengujian utama, Anda dapat membaca Yang harus diuji atau mempelajari Strategi pengujian
Atau, jika Anda ingin membuat pengujian pertama dan belajar dengan melakukan, lihat Codelab pengujian.