Robolectric — bu nima, ishlash printsiplari va Android birlik testi

Muallif: IT Sectr Nashr etilgan: 2026-04-09 O'qish vaqti: 8 daq

Robolectric — Android ilovalari uchun birlik testlash freymvorki bo'lib, testlarni emulyator yoki jismoniy qurilmasiz to'g'ridan-to'g'ri JVMda ishga tushirish imkonini beradi. U Android SDK chaqiruvlarini tutib oladi va real komponentlarning xatti-harakatini emulyatsiya qiluvchi shadow-ob'ektlarni taqdim etadi. Robolectric Documentation, 2025 ma'lumotlariga ko'ra, shadow-ob'ektlar taxminan 15 ming Android API sinflarini almashtiradi, testlarning platformadan izolyatsiyasini ta'minlaydi.

Asosiy fikrlar

  • Robolectric — emulyatorsiz JVMda ishlaydigan Android birlik testlash freymvorki
  • Shadow-ob'ektlar Android SDK chaqiruvlarini tutib oladi va tizim xatti-harakatini emulyatsiya qiladi
  • Integratsiya JUnit 4 va 5 bilan standart test runnerlardan foydalanish imkonini beradi
  • Testlar emulyatordagi kabi daqiqalarda emas, balki soniyalarda bajariladi
  • Qo'llab-quvvatlash Jetpack Compose, fragmentlar, intentlar, ContentProvider va resurslar uchun

Robolectric nima

Robolectric — 2010-yilda Android ilovalarini testlashni tezlashtirish uchun yaratilgan ochiq manbali freymvork. Emulyator yoki qurilmada ishga tushirish o'rniga, Robolectric to'g'ridan-to'g'ri Java Virtual Machine (JVM)da ishlaydigan Android SDK sinflarining shadow-implementatsiyalarini taqdim etadi. Bu soniyalar ichida minglab testlarni bajarish imkonini beradi.

Robolectric hal qiladigan muammo

An'anaviy Android testlash emulyatorda ilovani ishga tushirishni talab qiladi, bu APK qurish, o'rnatish va ishga tushirish uchun 3–10 daqiqa vaqt oladi. Robolectric bu qadamni bartaraf qiladi: testlar oddiy Java/Kotlin testlari sifatida kompilyatsiya qilinadi va JUnit orqali ishga tushiriladi. Bu daqiqalar o'rniga bir necha soniya ichida qayta aloqa siklini beradi.

Qo'llab-quvvatlanadigan Android versiyalari

Robolectric API 16 (Android 4.1) dan boshlab eng so'nggi barqaror versiyagacha barcha Android versiyalarini qo'llab-quvvatlaydi. Har bir versiya uchun ilova test qilinayotgan platformaning aynan o'sha versiyasining xatti-harakatini emulyatsiya qiluvchi tegishli shadow-ob'ektlar to'plami taqdim etiladi.

Arxitektura va shadow-ob'ektlar

Robolectric arxitekturasi classloaderni almashtirish orqali chaqiruvlarni tutib olish mexanizmiga asoslangan. Test Android SDK metodini chaqirganda, Robolectric chaqiruvni tutib oladi va shadow-ob'ektga yo'naltiradi. Shadow-ob'ekt — Android komponentining real xatti-harakatini taqlid qiluvchi, ammo nativ platformasiz ishlaydigan Java sinfidir.

Shadowlar qanday ishlaydi

Shadow-ob'ektlar original Android sinflarining asosiy metodlarini implementatsiya qiladi. Masalan, ShadowTextView getText(), setText(), getCurrentTextColor() va boshqa metodlarni taqlid qiladi. textView.setText(“Hello”) chaqirilganda shadow stringni saqlaydi va getText() chaqirilganda uni qaytaradi. Bu testlarni real renderlash va tizim xizmatlaridan izolyatsiya qiladi.

Shadow-ierarxiyasi

Robolectric Android SDKning asosiy komponentlarini qamrab oluvchi 200 dan ortiq shadow-sinflarini qo'llab-quvvatlaydi: Activity, Fragment, TextView, Button, RecyclerView, WebView, LocationManager, ConnectivityManager va boshqalar. Shadow-ob'ektlar original Android sinflari bilan bir xil meros iyerarxiyasiga amal qiladi.

Robolectricni o'rnatish va sozlash

Robolectricni Gradle loyihasida o'rnatish testImplementation “org.robolectric:robolectric:4.x” bog'liqligini qo'shishni talab qiladi. Shuningdek build.gradle faylida android:sdk konfiguratsiyasini ko'rsatish va android:testInstrumentationRunner qo'shish kerak. Robolectric bilan ishlash uchun android-test plagini talab qilinmaydi.

Asosiy Gradle konfiguratsiyasi

Bog'liqlikni qo'shgandan so'ng, manifest, resurslar va aktivlar uchun katalogni konfiguratsiya qilish kerak. Robolectric AndroidManifest.xmlni avtomatik topadi, lekin @Config annotatsiyasi yoki tizim xususiyatlari orqali yo'lni qo'lda ko'rsatish talab qilinishi mumkin. Ko'p modulli loyihalar uchun konfiguratsiya har bir modul uchun alohida beriladi.

groovy
// build.gradle — Robolectric konfiguratsiyasi
android {
    testOptions {
        unitTests.includeAndroidResources = true
        unitTests.all {
            systemProperty 'robolectric.dependency.dir',
                project.rootDir.absolutePath + '/build/intermediates'
        }
    }
}

dependencies {
    testImplementation 'org.robolectric:robolectric:4.13'
    testImplementation 'org.junit.jupiter:junit-jupiter:5.10.0'
}

@Config annotatsiyasi

@Config annotatsiyasi test parametrlarini o'zgartirish imkonini beradi: sdk (API versiyasi), manifest (manifestga yo'l), qualifiers (ekran konfiguratsiyasi, til). Bu ilovaning xatti-harakatini turli Android versiyalarida, ekran yo'nalishlarida va lokalizatsiyalarda test qilish uchun foydalidir.

Robolectric bilan testlarni yozish

Robolectric testlari JUnit 4 uchun @RunWith(RobolectricTestRunner.class) yoki JUnit 5 uchun RobolectricExtension orqali oddiy birlik testlar sifatida yoziladi. ActivityController Activityning hayotiy siklini boshqaradi: create(), start(), resume(), pause(), stop(), destroy(). Bu har bir holat o'tishini batafsil test qilish imkonini beradi.

Activityni testlash

Activityni testlash uchun hayotiy sikl bosqichlaridan ketma-ket o'tuvchi ActivityController ishlatiladi. Activityga kirish controller.get() orqali amalga oshiriladi. Barcha ko'rinish komponentlari real ilovadagi kabi findViewById orqali mavjud. Shadow-ob'ektlar matnlarni, ko'rinishni, ranglarni va ko'rinishning boshqa atributlarini tekshirish imkonini beradi.

java
@RunWith(RobolectricTestRunner.class)
@Config(sdk = BuildConfig.SDK_INT)
public class MainActivityTest {

    @Test
    public void testActivityDisplaysGreeting() {
        ActivityController<MainActivity> controller =
            Robolectric.buildActivity(MainActivity.class);
        controller.create().start().resume();

        MainActivity activity = controller.get();
        TextView greeting = activity.findViewById(R.id.greeting);
        ShadowTextView shadow = Shadows.shadowOf(greeting);

        assertEquals("Welcome!", shadow.getText());
    }
}

Intentlar va navigatsiyani testlash

Robolectric startActivity() chaqiruvlarini tutib oladi va ShadowActivity orqali yuborilgan intentlarni tekshirish imkonini beradi. Bu navigatsiyani test qilish imkoniyatini beradi: tugma bosilganda to'g'ri Action, Data va Extra parametrlari bilan Intent yuborilishini tekshirish.

java
@Test
public void testNavigationToDetails() {
    controller.create().start().resume();
    MainActivity activity = controller.get();

    activity.findViewById(R.id.detailsButton).performClick();

    ShadowActivity shadowActivity = Shadows.shadowOf(activity);
    Intent intent = shadowActivity.getNextStartedActivity();
    assertEquals(
        DetailsActivity.class.getName(),
        intent.getComponent().getClassName()
    );
}

Robolectric emulyatorga qarshi

Robolectric va emulyator turli vazifalarni hal qiladi. Robolectric tez birlik testlar, UI mantig'ini, biznes komponentlarini va repozitoriylarni tekshirish uchun idealdir. Emulyator instrumental testlar, API bilan integratsiyani tekshirish, kamera, sensorlar va ishlash testi uchun zarurdir.

XarakteristikaRobolectricEmulyator
Tezlik~5 son 100 test uchun~5 daq 100 test uchun
Ishga tushirishAPK qurmasdanAPK qurish talab qilinadi
Real APIShadow-emulyatsiyaNativ Android SDK
Out-of-the-boxFaqat JUnitHar qanday freymvorklar

ViewModel va Repositoryni testlash

Robolectric ViewModel, Repository va UseCase — Android SDKdan foydalanuvchi, ammo real UI talab qilmaydigan komponentlarni testlash uchun ajoyib. ViewModel RobolectricExtension bilan oddiy JUnit testi orqali test qilinadi, hayotiy sikl komponentlari (LiveData, StateFlow) moklarsiz shadow-muhitda ishlaydi.

LiveData ni testlash

Robolectric LiveData ni qutidan chiqqandek qo'llab-quvvatlaydi: testda LiveData-ga obuna bo'lish, ViewModel orqali holatni o'zgartirish va emit qilingan qiymatni tekshirish mumkin. Asinxron operatsiyalar uchun InstantTaskExecutorRule yoki korutinlar uchun runBlocking ishlatiladi. Bu arxitektura komponentlarini moklash zaruratini bartaraf qiladi.

kotlin
@RunWith(RobolectricTestRunner::class)
@Config(sdk = [BuildConfig.SDK_INT])
class ProfileViewModelTest {

    private val repository = FakeUserRepository()
    private val viewModel = ProfileViewModel(repository)

    @Test
    fun `loading profile sets state to success`() = runBlocking {
        viewModel.loadProfile("user123")
        val state = viewModel.profileState.getOrAwaitValue()
        Assertions.assertTrue(state is UiState.Success)
    }
}

Maxsus shadow-ob'ektlar

Robolectricning standart shadow-ob'ektlari kerakli Android SDK sinfini qamrab olmasa, maxsus Shadow yaratilishi mumkin. Buning uchun @Implements(ClassName.class) annotatsiyasi bilan sinf yaratiladi va @Implementation bilan kerakli metodlar implementatsiya qilinadi. Maxsus shadowlar @Config(shadows = [CustomShadow::class]) orqali ro'yxatdan o'tkaziladi.

ContentProvider va Resurslarni testlash

Robolectric ContentProvider ni Robolectric.buildContentProvider() orqali testlashni qo'llab-quvvatlaydi. CRUD operatsiyalari, URI moslashtirish bilan query va kirish huquqlarini qayta ishlashni tekshirish mumkin. Resurslar (satrlar, ranglar, o'lchamlar) RuntimeEnvironment.application.resources orqali ham mavjud bo'lib, resurslarga bog'liq kodni testlash imkonini beradi.

Emulyatordan Robolectricga migratsiya

Instrumental testlardan Robolectricga o'tish yondashuvni o'zgartirishni talab qiladi. Instrumental testlar (AndroidJUnit4) emulyatorda real xatti-harakatni tekshiradi, Robolectric — shadow-muhitda izolyatsiyalangan mantiqni. Biznes mantiqini Robolectric testlari bilan qoplash, instrumental testlarni esa integratsiya stsenariylari uchun saqlash tavsiya etiladi.

Mavjud testlarni adaptatsiya qilish

Migratsiya paytida: AndroidJUnit4 ni RobolectricTestRunner bilan almashtirish, maqsadli SDK versiyasi bilan @Config qo'shish, ActivityTestRule ni ActivityController bilan almashtirish va bog'liqliklarni androidTestImplementation dan testImplementation ga ko'chirish kerak. Moklar (MockK, Mockito) Robolectric bilan o'zgarishsiz ishlaydi — ular platformaga bog'liq emas.

Migratsiya paytidagi cheklovlar

Robolectric qo'llab-quvvatlamaydi: kamera (CameraX), NFC, Bluetooth, biometriya, real fayllar bilan ishlash va nativ kutubxonalarni testlash. Bu stsenariylar uchun emulyatorda instrumental testlar kerak. Robolectric shuningdek real renderlashni takrorlamaydi — layout testlarini Compose Test Rule yoki Espresso orqali bajarish yaxshiroq. Ammo biznes mantig'i, navigatsiya va ViewModel holatlarini tekshirish uchun Robolectric 10 marta tezlashtirish bilan emulyatorni to'liq almashtiradi.

Java va Kotlin versiyalari bilan moslik

Robolectric JDK 11 yoki undan yuqorisini talab qiladi va AGP (Android Gradle Plugin) 7.0 dan so'nggi barqaror versiyagacha mos keladi. Robolectricning SDK menejeri birinchi ishga tushirishda kerakli Android API versiyalarini avtomatik yuklaydi — bu bir martalik operatsiya. CI serverlar uchun birinchi test o'tkazishdagi kechikishlarni oldini olish uchun SDKni oldindan sdkmanager orqali yuklab olish tavsiya etiladi. Robolectricni yangi versiyaga yangilash odatda test kodida o'zgartirishlarni talab qilmaydi, faqat build.gradle da bog'liqlik raqamini yangilash kerak.

MockK va Mockito bilan integratsiya

Robolectric mashhur mocking freymvorklari bilan mos keladi: Kotlin uchun MockK va Java uchun Mockito. Moklar bog'liqliklarni izolyatsiya qilish uchun ishlatiladi: repozitoriylar, API-mijozlar, SharedPreferences. Asosiy qoida — Android SDK sinflarini moklamang, buning uchun shadow-ob'ektlar mavjud. Faqat ilova qatlamlarini moklang: UseCase, Repository, DataSource va biznes mantig'ining boshqa komponentlari. Shadow-ob'ektlar va moklarning bunday kombinatsiyasi test yozish uchun minimal xarajat bilan maksimal moslashuvchanlikni beradi.

Tez-tez beriladigan savollar

Robolectric Espressodan nima bilan farq qiladi?

Espresso — emulyator yoki qurilmada ishlaydigan instrumental freymvork. Robolectric — JVMda ishlaydigan birlik test freymvorki. Espresso real xatti-harakatni test qiladi, Robolectric — shadow-muhitda izolyatsiyalangan mantiqni. Ular bir-birini to'ldiradi.

Jetpack Compose ni Robolectric bilan testlash mumkinmi?

Ha, Robolectric 4.8 versiyasidan Jetpack Compose ni qo'llab-quvvatlaydi. Compose komponentlarining testlari emulyatordagi kabi ComposeTestRule orqali bajariladi. Biroq Robolectricdagi Compose testlari real renderlashni tekshirmaydi — faqat kompozitsiya mantig'ini.

Robolectric Gradle modullari bilan qanday ishlaydi?

Robolectric ko'p modulli loyihalarni qo'llab-quvvatlaydi. Har bir modul o'z manifesti va resurslari bilan alohida sozlanadi. UI komponentlari bo'lmagan modullar uchun android plaginisiz kutubxona moduli yetarli. O'nlab modulli katta loyihalarda Robolectric testlari parallel ishga tushiriladi, bu emulyatorda ketma-ket bajarish bilan solishtirganda qo'shimcha tezlik ustunligini beradi.

Nega Robolectric resurslarni topa olmaydi?

Resurslar bilan bog'liq muammo build.gradle da unitTests.includeAndroidResources = true ko'rsatilmaganida yoki manifestga to'g'ri yo'l bilan @Config annotatsiyasi bo'lmaganida yuzaga keladi. Robolectric build/intermediates dan kompilyatsiya qilingan resurslardan foydalanadi.

Robolectric testlarini qanday tuzatish mumkin?

Robolectric testlari Android Studio da oddiy Java/Kotlin testlari kabi tuzatiladi. Breakpoint, step-through debug, shadow-ob'ektlar va ularning holatini tekshirish mavjud. Logging VM opsiyalarida -Drobolectric.logging=debug orqali yoqiladi.

Xulosa

  • Robolectric — emulyatorsiz JVMda tez Android birlik testlash freymvorki
  • Shadow-ob'ektlar 200 dan ortiq Android SDK sinfini almashtiradi, ularning xatti-harakatini emulyatsiya qiladi
  • Hayotiy sikl Activity va Fragment ActivityController orqali boshqariladi holatlarni tekshirish bilan
  • Intent testi ShadowActivity orqali navigatsiya va ma'lumot uzatishni tekshirish imkonini beradi
  • JUnit bilan integratsiya va Gradle qo'shimcha instrumental runnerlarni talab qilmaydi
  • @Config annotatsiyasi API versiyasini, tilni, ekran konfiguratsiyasini va resurslarni belgilaydi
  • Robolectric va Espresso bir-birini to'ldiradi: tez birlik testlar instrumental testlarga qarshi

Biz kalit topshirig'i bilan mobil ilovani ishlab chiqamiz

IT Sectr 2017-yildan beri startaplar va korxonalar uchun iOS va Android ilovalarini yaratadi. Biz sizga maslahat beramiz va eng yaxshi yechimni taklif qilamiz.

Loyihani muhokama qilish

Shuningdek o'qing