Robolectric adalah framework open source yang dikelola oleh Google yang memungkinkan Anda menjalankan pengujian di lingkungan Android simulasi di dalam JVM, tanpa overhead dan ketidakstabilan emulator. Library ini mendukung semua versi Android sejak Lollipop (API level 21).
Banyak project besar menggunakan Robolectric untuk meningkatkan kecepatan dan keandalan pengujian serta mengurangi biaya yang terkait dengan menjalankan pengujian di perangkat atau emulator sungguhan. Hal ini mencakup sebagian besar aplikasi Google yang sangat mengandalkan Robolectric.
Robolectric bukan pengganti lengkap untuk emulator karena tidak mendukung semua fitur dan API. Misalnya, Robolectric tidak memiliki layar seperti emulator, dan beberapa API hanya didukung sebagian. Namun, sistem ini mengemulasikan cukup banyak bagian Android untuk menjalankan pengujian unit dan sebagian besar pengujian UI dengan andal.
Strategi pengujian
Ada dua jenis strategi pengujian yang dapat Anda terapkan dengan Robolectric: pengujian unit dan pengujian UI.
Pengujian unit
Robolectric dimaksudkan sebagai cara untuk mengaktifkan "pengujian unit" dalam aplikasi Android. Misalnya, Anda dapat menyimulasikan peluncuran Aktivitas dan menguji logika di dalamnya, dengan memanggil semua metode siklus proses.
Anda juga dapat menggunakan palsu Robolectric (disebut bayangan) sebagai dependensi untuk pengujian unit. Misalnya, jika class Anda menggunakan Bundle atau Anda perlu memalsukan koneksi Bluetooth.
Secara umum, jika Anda menerapkan arsitektur yang dapat diuji, Anda tidak perlu menggunakan Robolectric untuk pengujian unit karena kode Anda harus dapat diuji secara terpisah, tanpa dependensi pada framework Android.
Pengujian UI
Robolectric juga dapat menjalankan pengujian UI seperti pengujian Espresso atau Compose. Anda
dapat mengonversi pengujian berinstrumen ke Robolectric dengan memindahkannya ke set sumber
test
dan menyiapkan dependensi Robolectric.
android {
testOptions {
unitTests {
isIncludeAndroidResources = true
}
}
}
dependencies {
testImplementation("junit:junit:4.13.2")
testImplementation("org.robolectric:robolectric:4.13")
}
Setiap pengujian UI yang ada dalam set sumber test
berjalan dengan Robolectric.
import androidx.test.espresso.Espresso.onView
@RunWith(AndroidJUnit4::class)
class AddContactActivityTest {
@Test
fun inputTextShouldBeRetainedAfterActivityRecreation() {
// GIVEN
val contactName = "Test User"
val scenario = ActivityScenario.launchActivity<AddContactActivity>()
// WHEN
// Enter contact name
onView(withId(R.id.contact_name_text))
.perform(typeText(contactName))
// Destroy and recreate Activity
scenario.recreate()
// THEN
// Check contact name was preserved.
onView(withId(R.id.contact_name_text))
.check(matches(withText(contactName)))
}
}
Sebagian besar pengujian UI tidak berinteraksi dengan framework dan Anda dapat menjalankannya di Robolectric. Anda dapat menjalankan pengujian perilaku di Robolectric karena fidelitas yang diperlukan sudah lebih dari cukup. Misalnya, saat pengujian Compose memverifikasi bahwa UI telah berubah setelah mengklik tombol.
Anda dapat menjalankan pengujian UI lainnya dengan Robolectric, seperti pengujian screenshot. Namun, fidelitasnya lebih rendah karena perangkat yang berbeda merender layar sedikit berbeda.
Anda harus memutuskan apakah penerapan Robolectric sudah cukup baik untuk setiap kasus penggunaan, tetapi berikut beberapa rekomendasinya:
- Gunakan Robolectric untuk pengujian perilaku UI terisolasi untuk pengujian komponen, fitur, atau aplikasi. Secara umum, pengujian ini memeriksa pengelolaan status dan perilaku UI serta tidak berinteraksi dengan dependensi eksternal.
- Gunakan Robolectric untuk mengambil screenshot saat akurasi piksel tidak terlalu penting. Misalnya, untuk menguji bagaimana komponen bereaksi terhadap berbagai ukuran font atau tema.
Catatan: Robolectric dapat mengambil screenshot secara native, tetapi Anda memerlukan library pihak ketiga untuk melakukan pengujian screenshot dengan library tersebut.
Pengujian Robolectric versus perangkat
Singkatnya, Robolectric menyediakan fidelitas yang cukup untuk menjalankan sebagian besar pengujian UI, tetapi beberapa kasus masih memerlukan pengujian perangkat, misalnya yang terkait dengan UI sistem seperti edge-to-edge atau picture-in-picture, atau saat mengandalkan fitur yang tidak didukung, seperti WebView
.