Saat menguji elemen atau sistem elemen, Anda melakukannya secara terpisah. Misalnya, untuk menguji ViewModel, Anda tidak perlu memulai emulator dan meluncurkan UI karena tidak (atau tidak boleh) bergantung pada framework Android.
Namun, subjek yang sedang diuji mungkin bergantung pada subjek lain agar dapat berfungsi. Misalnya, ViewModel mungkin bergantung pada repositori data agar dapat berfungsi.
Jika Anda perlu memberikan dependensi ke subjek yang sedang diuji, praktik umum adalah membuat duplikat pengujian (atau objek pengujian). Test double adalah objek yang terlihat dan berfungsi sebagai komponen di aplikasi Anda, tetapi dibuat dalam pengujian untuk memberikan perilaku atau data tertentu. Keuntungan utamanya adalah membuat pengujian Anda lebih cepat dan lebih sederhana.
Jenis double pengujian
Ada berbagai jenis double pengujian:
Palsu | Pasangan pengujian yang memiliki implementasi class yang "berfungsi", tetapi diterapkan dengan cara yang membuatnya baik untuk pengujian, tetapi tidak cocok untuk produksi.
Contoh: database dalam memori. Fake tidak memerlukan framework tiruan dan bersifat ringan. Format ini lebih disarankan. |
---|---|
Mock | Test double yang berperilaku seperti yang Anda programkan dan memiliki ekspektasi tentang interaksinya. Mock akan gagal dalam pengujian jika interaksinya tidak cocok dengan persyaratan yang Anda tentukan. Mock biasanya dibuat dengan framework tiruan untuk mencapai semua ini.
Contoh: Memverifikasi bahwa metode dalam database dipanggil tepat satu kali. |
Konfirmasi | Test double yang berperilaku seperti yang Anda programkan, tetapi tidak memiliki ekspektasi tentang interaksinya. Biasanya dibuat dengan framework tiruan. Palsu lebih disukai daripada stub untuk memudahkan. |
Dummy | Pasangan pengujian yang diteruskan tetapi tidak digunakan, seperti jika Anda hanya perlu memberikannya sebagai parameter.
Contoh: fungsi kosong yang diteruskan sebagai callback klik. |
Mata-mata | Wrapper atas objek nyata yang juga melacak beberapa informasi tambahan, mirip dengan tiruan. Hal ini biasanya dihindari karena menambah kompleksitas. Oleh karena itu, palsu atau tiruan lebih disukai daripada mata-mata. |
Bayangan | Palsu digunakan di Robolectric. |
Contoh penggunaan palsu
Misalnya, Anda ingin melakukan pengujian unit pada ViewModel yang bergantung pada antarmuka
yang disebut UserRepository
dan mengekspos nama pengguna pertama ke UI. Anda dapat
membuat duplikat pengujian palsu dengan menerapkan antarmuka dan menampilkan data
yang diketahui.
object FakeUserRepository : UserRepository {
fun getUsers() = listOf(UserAlice, UserBob)
}
val const UserAlice = User("Alice")
val const UserBob = User("Bob")
UserRepository
palsu ini tidak perlu bergantung pada sumber data lokal dan jarak jauh
yang akan digunakan versi produksi. File ini berada dalam set sumber
pengujian dan tidak akan dikirim bersama aplikasi produksi.
Pengujian berikut memverifikasi bahwa ViewModel mengekspos nama pengguna pertama dengan benar ke tampilan.
@Test
fun viewModelA_loadsUsers_showsFirstUser() {
// Given a VM using fake data
val viewModel = ViewModelA(FakeUserRepository) // Kicks off data load on init
// Verify that the exposed data is correct
assertEquals(viewModel.firstUserName, UserAlice.name)
}
Mengganti UserRepository
dengan palsu mudah dilakukan dalam pengujian unit, karena
ViewModel dibuat oleh penguji. Namun, mengganti elemen arbitrer dalam pengujian yang lebih besar dapat menjadi tantangan.
Mengganti komponen dan injeksi dependensi
Jika pengujian tidak memiliki kontrol atas pembuatan sistem yang sedang diuji, penggantian komponen untuk duplikat pengujian menjadi lebih rumit dan memerlukan arsitektur aplikasi Anda untuk mengikuti desain yang dapat diuji.
Bahkan pengujian menyeluruh yang besar dapat memanfaatkan penggunaan duplikat pengujian, seperti pengujian UI berinstrumen yang menavigasi alur penggunaan lengkap di aplikasi Anda. Dalam hal ini, Anda mungkin ingin membuat pengujian hermetis. Pengujian hermetis menghindari semua dependensi eksternal, seperti mengambil data dari internet. Hal ini akan meningkatkan keandalan dan performa.
Anda dapat mendesain aplikasi untuk mencapai fleksibilitas ini secara manual, tetapi sebaiknya gunakan framework injeksi dependensi seperti Hilt untuk mengganti komponen di aplikasi Anda pada waktu pengujian. Lihat Panduan pengujian Hilt.
Langkah berikutnya
Halaman Strategi pengujian menunjukkan cara meningkatkan produktivitas menggunakan berbagai jenis pengujian.