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 — 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.
Ə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.
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.
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-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.
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 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.
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.
// 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ı 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 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-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.
@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());
}
}
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.
@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 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.
| Xarakteristika | Robolectric | Emulyator |
|---|---|---|
| Sürət | ~5 san 100 test üçün | ~5 dəq 100 test üçün |
| İşə salma | APK qurulmadan | APK qurulması tələb olunur |
| Real API | Shadow-emulyasiya | Nativ Android SDK |
| Out-of-the-box | Yalnız JUnit | İstənilən framework-lər |
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.
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.
@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)
}
}
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.
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.
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.
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.
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.
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.
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
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.
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 ç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.
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ə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ə
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.
Həm də oxuyun