Robolectric — bu nədir, iş prinsipləri və Android vahid testi

Müəllif: IT Sectr Dərc olunub: 2026-04-09 Oxuma vaxtı: 8 dəq

Robolectric — Android proqramları üçün vahid test framework-üdür, testləri emulyator və ya fiziki cihaz olmadan birbaşa JVM-də işə salmağa imkan verir. O, Android SDK çağırışlarını tutur və real komponentlərin davranışını emulyasiya edən shadow-obyektlər təqdim edir. Robolectric Documentation, 2025-ə görə, shadow-obyektlər təxminən 15 min Android API sinfini əvəz edir, testlərin platformadan izolyasiyasını təmin edir.

Əsas məqamlar

  • Robolectric — emulyator olmadan JVM-də işləyən Android vahid testi framework-ü
  • Shadow-obyektlər Android SDK çağırışlarını tutur və sistem davranışını emulyasiya edir
  • İnteqrasiya JUnit 4 və 5 ilə standart test runner-lardan istifadə etməyə imkan verir
  • Testlər emulyatordakı kimi dəqiqələr yox, saniyələr ərzində icra olunur
  • Dəstək Jetpack Compose, fragmentlər, intentlər, ContentProvider və resurslar üçün

Robolectric nədir

Robolectric — 2010-cu ildə Android proqramlarının testini sürətləndirmək üçün yaradılmış açıq mənbə framework-üdür. Emulyator və ya cihazda işə salmaq əvəzinə, Robolectric birbaşa Java Virtual Machine (JVM) üzərində işləyən Android SDK siniflərinin shadow-implementasiyalarını təqdim edir. Bu, saniyələr ərzində minlərlə testi icra etməyə imkan verir.

Robolectric-in həll etdiyi problem

Ənənəvi Android testi proqramın emulyatorda işə salınmasını tələb edir, bu da APK qurulması, quraşdırma və işə salma üçün 3–10 dəqiqə çəkir. Robolectric bu addımı aradan qaldırır: testlər adi Java/Kotlin testləri kimi kompilyasiya olunur və JUnit vasitəsilə işə salınır. Bu, dəqiqələr əvəzinə bir neçə saniyə ərzində əks-əlaqə dövrü verir.

Dəstəklənən Android versiyaları

Robolectric API 16-dan (Android 4.1) başlayaraq son stabil versiyaya qədər bütün Android versiyalarını dəstəkləyir. Hər versiya üçün proqramın test edildiyi platformanın məhz həmin versiyasının davranışını emulyasiya edən müvafiq shadow-obyektlər dəsti təqdim olunur.

Arxitektura və shadow-obyektlər

Robolectric-in arxitekturası classloader-in dəyişdirilməsi vasitəsilə çağırışların tutulması mexanizminə əsaslanır. Test Android SDK metodunu çağırdıqda, Robolectric çağırışı tutur və shadow-obyektə yönləndirir. Shadow-obyekt — Android komponentinin real davranışını təqlid edən, lakin nativ platforma olmadan işləyən Java sinfidir.

Shadow-lar necə işləyir

Shadow-obyektlər orijinal Android siniflərinin əsas metodlarını implementasiya edir. Məsələn, ShadowTextView getText(), setText(), getCurrentTextColor() və digər metodları təqlid edir. textView.setText("Hello") çağırıldıqda shadow string-i saxlayır və getText() çağırıldıqda onu qaytarır. Bu, testləri real renderinqdən və sistem xidmətlərindən təcrid edir.

Shadow-iyerarxiyası

Robolectric Android SDK-nın əsas komponentlərini əhatə edən 200-dən çox shadow-sinfini dəstəkləyir: Activity, Fragment, TextView, Button, RecyclerView, WebView, LocationManager, ConnectivityManager və bir çox başqaları. Shadow-obyektlər orijinal Android sinifləri ilə eyni miras iyerarxiyasına əməl edir.

Robolectric-in qurulması və konfiqurasiyası

Robolectric-in Gradle layihəsində qurulması testImplementation "org.robolectric:robolectric:4.x" asılılığının əlavə edilməsini tələb edir. Həmçinin build.gradle faylında android:sdk konfiqurasiyasını göstərmək və android:testInstrumentationRunner əlavə etmək lazımdır. Robolectric ilə işləmək üçün android-test plagini tələb olunmur.

Əsas Gradle konfiqurasiyası

Asılılığı əlavə etdikdən sonra manifest, resurslar və aktivlər üçün kataloqu konfiqurasiya etmək lazımdır. Robolectric AndroidManifest.xml-i avtomatik tapır, lakin @Config annotasiyası və ya sistem xüsusiyyətləri vasitəsilə yolu əl ilə göstərmək tələb oluna bilər. Çoxmodullu layihələr üçün konfiqurasiya hər modul üçün ayrıca verilir.

groovy
// build.gradle — Robolectric konfiqurasiyası
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 annotasiyası

@Config annotasiyası test parametrlərini dəyişməyə imkan verir: sdk (API versiyası), manifest (manifestə yol), qualifiers (ekran konfiqurasiyası, dil). Bu, proqramın davranışını müxtəlif Android versiyalarında, ekran oriyentasiyalarında və lokallarda test etmək üçün faydalıdır.

Robolectric ilə testlərin yazılması

Robolectric testləri JUnit 4 üçün @RunWith(RobolectricTestRunner.class) və ya JUnit 5 üçün RobolectricExtension vasitəsilə adi vahid testlər kimi yazılır. ActivityController Activity-nin həyat dövrünü idarə edir: create(), start(), resume(), pause(), stop(), destroy(). Bu, hər bir vəziyyət keçidini detallı şəkildə test etməyə imkan verir.

Activity-nin test edilməsi

Activity-ni test etmək üçün həyat dövrü mərhələlərindən ardıcıl keçən ActivityController istifadə olunur. Activity-yə giriş controller.get() vasitəsilə həyata keçirilir. Bütün görünüş komponentləri real proqramdakı kimi findViewById vasitəsilə əlçatandır. Shadow-obyektlər mətnləri, görünürlüyü, rəngləri və görünüşün digər atributlarını yoxlamağa imkan verir.

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());
    }
}

İntentlərin və naviqasiyanın test edilməsi

Robolectric startActivity() çağırışlarını tutur və ShadowActivity vasitəsilə göndərilmiş intentləri yoxlamağa imkan verir. Bu, naviqasiyanı test etmək imkanı verir: düymə klikləndikdə düzgün Action, Data və Extra parametrləri ilə Intent-in göndərildiyini yoxlamaq.

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 emulyatora qarşı

Robolectric və emulyator müxtəlif vəzifələri həll edir. Robolectric sürətli vahid testlər, UI məntiqinin, biznes komponentlərinin və repozitoriyaların yoxlanması üçün idealdır. Emulyator instrumental testlər, API ilə inteqrasiyanın yoxlanması, kamera, sensorlar və performans testi üçün zəruridir.

XarakteristikaRobolectricEmulyator
Sürət~5 san 100 test üçün~5 dəq 100 test üçün
İşə salmaAPK qurulmadanAPK qurulması tələb olunur
Real APIShadow-emulyasiyaNativ Android SDK
Out-of-the-boxYalnız JUnitİstənilən framework-lər

ViewModel və Repository-nin test edilməsi

Robolectric ViewModel, Repository və UseCase — Android SDK-dan istifadə edən, lakin real UI tələb etməyən komponentləri test etmək üçün əladır. ViewModel RobolectricExtension ilə adi JUnit testi vasitəsilə test edilir, həyat dövrü komponentləri (LiveData, StateFlow) mock-lar olmadan shadow-mühitdə işləyir.

LiveData-nın test edilməsi

Robolectric LiveData-nı kutu çıxarıldığı kimi dəstəkləyir: testdə LiveData-ya abunə olmaq, ViewModel vasitəsilə vəziyyəti dəyişmək və emit edilmiş dəyəri yoxlamaq olar. Asinxron əməliyyatlar üçün InstantTaskExecutorRule və ya korutinlar üçün runBlocking istifadə olunur. Bu, arxitektura komponentlərini mock etmək ehtiyacını aradan qaldırır.

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)
    }
}

Xüsusi shadow-obyektlər

Robolectric-in standart shadow-obyektləri lazım olan Android SDK sinfini əhatə etmirsə, xüsusi Shadow yaradıla bilər. Bunun üçün @Implements(ClassName.class) annotasiyası ilə sinif yaradılır və @Implementation ilə lazım olan metodlar implementasiya edilir. Xüsusi shadow-lar @Config(shadows = [CustomShadow::class]) vasitəsilə qeydiyyatdan keçirilir.

ContentProvider və Resources-ın test edilməsi

Robolectric ContentProvider-in Robolectric.buildContentProvider() vasitəsilə test edilməsini dəstəkləyir. CRUD əməliyyatlarını, URI uyğunlaşdırılması ilə query və giriş hüquqlarının işlənməsini yoxlamaq olar. Resurslar (sətirlər, rənglər, ölçülər) həmçinin RuntimeEnvironment.application.resources vasitəsilə əlçatandır, bu da resurslardan asılı kodu test etməyə imkan verir.

Emulyatordan Robolectric-ə miqrasiya

Instrumental testlərdən Robolectric-ə keçid yanaşmanın dəyişdirilməsini tələb edir. Instrumental testlər (AndroidJUnit4) emulyatorda real davranışı yoxlayır, Robolectric — shadow-mühitdə izolə edilmiş məntiqi. Biznes məntiqini Robolectric testləri ilə əhatə etmək, instrumental testləri isə inteqrasiya ssenariləri üçün saxlamaq tövsiyə olunur.

Mövcud testlərin adaptasiyası

Miqrasiya zamanı: AndroidJUnit4-ü RobolectricTestRunner ilə əvəz etmək, hədəf SDK versiyası ilə @Config əlavə etmək, ActivityTestRule-i ActivityController ilə əvəz etmək və asılılıqları androidTestImplementation-dan testImplementation-a köçürmək lazımdır. Mock-lar (MockK, Mockito) Robolectric ilə dəyişikliksiz işləyir — onlar platformadan asılı deyil.

Miqrasiya zamanı məhdudiyyətlər

Robolectric dəstəkləmir: kamera (CameraX), NFC, Bluetooth, biometriya, real fayllarla iş və nativ kitabxanaların test edilməsi. Bu ssenarilər üçün emulyatorda instrumental testlər lazımdır. Robolectric həmçinin real renderinqi bərpa etmir — layout testlərini Compose Test Rule və ya Espresso vasitəsilə yerinə yetirmək daha yaxşıdır. Lakin biznes məntiqinin, naviqasiyanın və ViewModel vəziyyətlərinin yoxlanması üçün Robolectric 10 dəfə sürətləndirmə ilə emulyatoru tamamilə əvəz edir.

Java və Kotlin versiyaları ilə uyğunluq

Robolectric JDK 11 və ya daha yenisini tələb edir və AGP (Android Gradle Plugin) 7.0-dan son stabil versiyaya qədər uyğundur. Robolectric-in SDK meneceri ilk işə salmada lazım olan Android API versiyalarını avtomatik yükləyir — bu birdəfəlik əməliyyatdır. CI-serverlər üçün ilk test qaçışında gecikmələrin qarşısını almaq üçün SDK-nı əvvəlcədən sdkmanager vasitəsilə yükləmək tövsiyə olunur. Robolectric-in yeni versiyaya yenilənməsi adətən test kodunda dəyişiklik tələb etmir, yalnız build.gradle-də asılılıq nömrəsinin yenilənməsini tələb edir.

MockK və Mockito ilə inteqrasiya

Robolectric məşhur mocking framework-ləri ilə uyğundur: Kotlin üçün MockK və Java üçün Mockito. Mock-lar asılılıqların izolyasiyası üçün istifadə olunur: repozitoriyalar, API-klientlər, SharedPreferences. Əsas qayda — Android SDK siniflərini mock etməmək, bunun üçün shadow-obyektlər var. Yalnız tətbiqin təbəqələrini mock edin: UseCase, Repository, DataSource və biznes məntiqinin digər komponentləri. Shadow-obyektlər və mock-ların belə kombinasiyası test yazmaq üçün minimal xərclə maksimum çeviklik verir.

Tez-tez verilən suallar

Robolectric Espresso-dan nə ilə fərqlənir?

Espresso — emulyator və ya cihazda işləyən instrumental framework-dür. Robolectric — JVM-də işləyən vahid test framework-üdür. Espresso real davranışı test edir, Robolectric — shadow-mühitdə izolə edilmiş məntiqi. Onlar bir-birini tamamlayır.

Jetpack Compose-u Robolectric ilə test etmək olarmı?

Bəli, Robolectric 4.8 versiyasından Jetpack Compose-u dəstəkləyir. Compose komponentlərinin testləri emulyatordakı kimi ComposeTestRule vasitəsilə yerinə yetirilir. Lakin Robolectric-də Compose testləri real renderinqi yoxlamır — yalnız kompozisiya məntiqini.

Robolectric Gradle modulları ilə necə işləyir?

Robolectric çoxmodullu layihələri dəstəkləyir. Hər modul öz manifesti və resursları ilə ayrıca konfiqurasiya olunur. UI komponentləri olmayan modullar üçün android-plagini olmayan kitabxana modulu kifayətdir. Onlarla modulu olan böyük layihələrdə Robolectric testləri paralel işə salınır ki, bu da emulyatorda ardıcıl icra ilə müqayisədə əlavə sürət üstünlüyü verir.

Robolectric niyə resursları tapa bilmir?

Resurslarla bağlı problem build.gradle-də unitTests.includeAndroidResources = true göstərilmədikdə və ya manifestə düzgün yolu olan @Config annotasiyası olmadıqda yaranır. Robolectric build/intermediates-dən kompilyasiya olunmuş resurslardan istifadə edir.

Robolectric testlərini necə debug etmək olar?

Robolectric testləri Android Studio-da adi Java/Kotlin testləri kimi debug edilir. Breakpoint, step-through debug, shadow-obyektlərin və onların vəziyyətinin yoxlanması mövcuddur. Logging VM options-da -Drobolectric.logging=debug vasitəsilə açılır.

Nəticə

  • Robolectric — emulyator olmadan JVM-də sürətli Android vahid testi framework-ü
  • Shadow-obyektlər 200-dən çox Android SDK sinfini əvəz edir, onların davranışını emulyasiya edir
  • Həyat dövrü Activity və Fragment ActivityController vasitəsilə idarə olunur vəziyyətlərin yoxlanması ilə
  • İntent testi ShadowActivity vasitəsilə naviqasiyanı və məlumat ötürülməsini yoxlamağa imkan verir
  • JUnit ilə inteqrasiya və Gradle əlavə instrumental runner-lar tələb etmir
  • @Config annotasiyası API versiyasını, dili, ekran konfiqurasiyasını və resursları təyin edir
  • Robolectric və Espresso bir-birini tamamlayır: sürətli vahid testlər instrumental testlərə qarşı

Açar təslim mobil tətbiq hazırlayacağıq

IT Sectr 2017-ci ildən startaplar və bizneslər üçün iOS və Android tətbiqləri yaradır. Sizə məsləhət verəcəyik və ən yaxşı həlli təklif edəcəyik.

Layihəni müzakirə et

Həm də oxuyun