Menggunakan dummy pengujian di Android

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.

Dependensi palsu dapat menampilkan data yang diketahui tanpa bergantung pada sumber data jarak jauh
Gambar 1: Dependensi palsu dalam pengujian unit.

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.

Gambar 2: Pengujian besar yang mencakup sebagian besar aplikasi dan memalsukan data jarak jauh.

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.