Robolectric Android ایپلیکیشنز کی یونٹ ٹیسٹنگ کے لیے ایک فریم ورک ہے جو ایمولیٹر یا فزیکل ڈیوائس کے بغیر براہ راست JVM پر ٹیسٹ چلانے کی اجازت دیتا ہے۔ یہ Android SDK کالز کو روکتا ہے اور شیڈو آبجیکٹ فراہم کرتا ہے جو اصلی اجزاء کے رویے کی نقل کرتے ہیں۔ Robolectric Documentation, 2025 کے مطابق، شیڈو آبجیکٹ تقریباً 15 ہزار Android API کلاسز کو بدل دیتے ہیں، جو پلیٹ فارم سے ٹیسٹوں کو الگ کرتے ہیں۔
اہم نکات
Robolectric ایک اوپن سورس فریم ورک ہے جو 2010 میں Android ایپلیکیشن ٹیسٹنگ کو تیز کرنے کے لیے بنایا گیا تھا۔ ایمولیٹر یا ڈیوائس پر چلنے کے بجائے، Robolectric Android SDK کلاسز کی شیڈو تعمیلات فراہم کرتا ہے جو براہ راست جاوا ورچوئل مشین (JVM) پر چلتی ہیں۔ یہ سیکنڈوں میں ہزاروں ٹیسٹ چلانے کی اجازت دیتا ہے۔
روایتی Android ٹیسٹنگ کے لیے ایپلیکیشن کو ایمولیٹر پر چلانا ضروری ہے، جس میں APK بنانے، انسٹال کرنے اور شروع کرنے میں 3–10 منٹ لگتے ہیں۔ Robolectric اس مرحلے کو ختم کرتا ہے: ٹیسٹ عام Java/Kotlin ٹیسٹ کی طرح کمپائل ہوتے ہیں اور JUnit کے ذریعے چلتے ہیں۔ یہ منٹوں کے بجائے سیکنڈوں میں فیڈ بیک لوپ فراہم کرتا ہے۔
Robolectric API 16 (Android 4.1) سے لے کر تازہ ترین مستحکم ریلیز تک تمام Android ورژنز کو سپورٹ کرتا ہے۔ ہر ورژن کے لیے شیڈو آبجیکٹ کا متعلقہ سیٹ فراہم کیا جاتا ہے جو اس پلیٹ فارم ورژن کے رویے کی نقل کرتا ہے جس پر ایپلیکیشن کی جانچ کی جا رہی ہے۔
Robolectric کا فن تعمیر کلاس لوڈر کی تبدیلی کے ذریعے کالز کو روکنے کے طریقہ کار پر مبنی ہے۔ جب کوئی ٹیسٹ Android SDK کا طریقہ کال کرتا ہے، Robolectric کال کو روکتا ہے اور اسے شیڈو آبجیکٹ کی طرف بھیجتا ہے۔ ایک شیڈو آبجیکٹ ایک Java کلاس ہے جو Android جزو کے حقیقی رویے کی نقل کرتی ہے لیکن مقامی پلیٹ فارم کے بغیر کام کرتی ہے۔
شیڈو آبجیکٹ اصلی Android کلاسز کے کلیدی طریقوں کو نافذ کرتے ہیں۔ مثال کے طور پر، ShadowTextView getText()، setText()، getCurrentTextColor() اور دیگر طریقوں کی نقل کرتا ہے۔ جب textView.setText("ہیلو") کال کیا جاتا ہے، شیڈو سٹرنگ کو محفوظ کرتا ہے اور getText() کال کرنے پر اسے واپس کرتا ہے۔ یہ ٹیسٹوں کو حقیقی رینڈرنگ اور سسٹم سروسز سے الگ کرتا ہے۔
Robolectric 200 سے زیادہ شیڈو کلاسز کو سپورٹ کرتا ہے جو Android SDK کے اہم اجزاء کا احاطہ کرتی ہیں: Activity، Fragment، TextView، Button، RecyclerView، WebView، LocationManager، ConnectivityManager اور بہت سے دیگر۔ شیڈو آبجیکٹ اصلی Android کلاسز کی طرح وراثت کے درجہ بندی کی پیروی کرتے ہیں۔
Gradle پروجیکٹ میں Robolectric انسٹال کرنے کے لیے testImplementation "org.robolectric:robolectric:4.x" انحصار شامل کرنا ضروری ہے۔ build.gradle فائل میں androidsdk کنفیگریشن بتانا اور android:testInstrumentationRunner ریزولوشن شامل کرنا بھی ضروری ہے۔ Robolectric کے ساتھ کام کرنے کے لیے Android ٹیسٹ پلگ ان کی ضرورت نہیں ہے۔
انحصار شامل کرنے کے بعد، مینی فیسٹ، وسائل اور اثاثوں کے لیے ڈائریکٹری کنفیگر کرنی ہوگی۔ Robolectric خود بخود AndroidManifest.xml ڈھونڈ لیتا ہے، لیکن @Config اینوٹیشن یا سسٹم پراپرٹیز کے ذریعے راستہ دستی طور پر بتانے کی ضرورت ہو سکتی ہے۔ ملٹی ماڈیول پروجیکٹس کے لیے، کنفیگریشن ہر ماڈیول کے لیے الگ سے سیٹ کی جاتی ہے۔
// build.gradle — Robolectric کنفیگریشن
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 اینوٹیشن ٹیسٹ پیرامیٹرز کو اوور رائیڈ کرنے کی اجازت دیتی ہے: sdk (API ورژن)، manifest (مینی فیسٹ کا راستہ)، qualifiers (اسکرین کنفیگریشن، زبان)۔ یہ مختلف Android ورژنز، اسکرین اورینٹیشنز اور لوکلائزیشنز پر ایپلیکیشن کے رویے کی جانچ کے لیے مفید ہے۔
Robolectric ٹیسٹ JUnit 4 کے لیے @RunWith(RobolectricTestRunner.class) یا JUnit 5 کے لیے RobolectricExtension کے ساتھ عام یونٹ ٹیسٹ کی طرح لکھے جاتے ہیں۔ ActivityController Activity کے لائف سائیکل کو منظم کرتا ہے: create()، start()، resume()، pause()، stop()، destroy()۔ یہ ہر حالت کی منتقلی کو تفصیل سے جانچنے کی اجازت دیتا ہے۔
Activity کی جانچ کے لیے ActivityController استعمال کیا جاتا ہے، جو ترتیب وار لائف سائیکل کے مراحل سے گزرتا ہے۔ Activity تک رسائی controller.get() کے ذریعے ہوتی ہے۔ تمام ویو اجزاء حقیقی ایپلیکیشن کی طرح findViewById کے ذریعے قابل رسائی ہیں۔ شیڈو آبجیکٹ ٹیکسٹس، مرئیت، رنگوں اور دیگر ویو خصوصیات کی جانچ کرنے کی اجازت دیتے ہیں۔
@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() کالز کو روکتا ہے اور ShadowActivity کے ذریعے بھیجے گئے انٹینٹس کی جانچ کرنے کی اجازت دیتا ہے۔ یہ نیویگیشن کی جانچ ممکن بناتا ہے: تصدیق کرنا کہ بٹن کلک کرنے پر صحیح Action، Data اور Extra پیرامیٹرز والا Intent بھیجا جاتا ہے۔
@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 اور ایمولیٹر مختلف کام حل کرتے ہیں۔ Robolectric تیز یونٹ ٹیسٹس، UI منطق، کاروباری اجزاء اور ذخیروں کی جانچ کے لیے مثالی ہے۔ ایمولیٹر انسٹرومینٹیشن ٹیسٹس، API کے ساتھ انضمام کی تصدیق، کیمرہ، سینسرز اور کارکردگی کی جانچ کے لیے ضروری ہے۔
| خصوصیت | Robolectric | ایمولیٹر |
|---|---|---|
| رفتار | 100 ٹیسٹ میں ~5 سیکنڈ | 100 ٹیسٹ میں ~5 منٹ |
| شروع | APK بنانے کی ضرورت نہیں | APK بنانا ضروری |
| حقیقی API | شیڈو ایمولیشن | مقامی Android SDK |
| آؤٹ آف دی باکس | صرف JUnit | کوئی بھی فریم ورک |
Robolectric ViewModel، Repository اور UseCase — ان اجزاء کی جانچ کے لیے بہترین ہے جو Android SDK استعمال کرتے ہیں لیکن حقیقی یوزر انٹرفیس کی ضرورت نہیں رکھتے۔ ViewModel RobolectricExtension کے ساتھ عام JUnit ٹیسٹ کے ذریعے جانچا جاتا ہے، جبکہ لائف سائیکل اجزاء (LiveData، StateFlow) بغیر موک کے شیڈو ماحول میں کام کرتے ہیں۔
Robolectric LiveData کو فوری طور پر سپورٹ کرتا ہے: آپ ٹیسٹ میں LiveData کو سبسکرائب کر سکتے ہیں، ViewModel کے ذریعے حالت تبدیل کر سکتے ہیں اور خارج شدہ قدر کی جانچ کر سکتے ہیں۔ غیر متزامن کارروائیوں کے لیے InstantTaskExecutorRule یا کوروٹینز کے لیے runBlocking استعمال کیا جاتا ہے۔ یہ آرکیٹیکچرل اجزاء کو موک کرنے کی ضرورت کو ختم کرتا ہے۔
@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 شیڈو آبجیکٹ کسی ضروری Android SDK کلاس کا احاطہ نہیں کرتے، تو آپ اپنی مرضی کا شیڈو بنا سکتے ہیں۔ اس کے لیے @Implements(ClassName.class) اینوٹیشن والی کلاس بنائیں اور @Implementation کے ساتھ ضروری طریقے نافذ کریں۔ اپنی مرضی کے شیڈو @Config(shadows = [CustomShadow::class]) کے ذریعے رجسٹر کیے جاتے ہیں۔
Robolectric Robolectric.buildContentProvider() کے ذریعے ContentProvider کی جانچ کو سپورٹ کرتا ہے۔ آپ CRUD کارروائیاں، URI مماثلت کے ساتھ استفسار اور رسائی کے حقوق کا انتظام جانچ سکتے ہیں۔ وسائل (سٹرنگز، رنگ، طول و عرض) RuntimeEnvironment.application.resources کے ذریعے بھی قابل رسائی ہیں، جو وسائل پر منحصر کوڈ کی جانچ کرنے کی اجازت دیتا ہے۔
انسٹرومینٹیشن ٹیسٹ سے Robolectric میں منتقلی کے لیے نقطہ نظر میں تبدیلی ضروری ہے۔ انسٹرومینٹیشن ٹیسٹ (AndroidJUnit4) ایمولیٹر پر حقیقی رویے کی جانچ کرتے ہیں، جبکہ Robolectric شیڈو ماحول میں الگ تھلگ منطق کی جانچ کرتا ہے۔ کاروباری منطق کو Robolectric ٹیسٹ سے ڈھانپنے اور انسٹرومینٹیشن ٹیسٹ کو انضمام کے منظرناموں کے لیے چھوڑنے کی سفارش کی جاتی ہے۔
منتقلی کرتے وقت: AndroidJUnit4 کو RobolectricTestRunner سے بدلیں، ہدف SDK ورژن کے ساتھ @Config شامل کریں، ActivityTestRule کو ActivityController سے بدلیں، اور انحصار androidTestImplementation سے testImplementation میں منتقل کریں۔ موک (MockK, Mockito) بغیر تبدیلی کے Robolectric کے ساتھ کام کرتے ہیں — وہ پلیٹ فارم سے آزاد ہیں۔
Robolectric سپورٹ نہیں کرتا: کیمرہ (CameraX)، NFC، بلوٹوتھ، بائیو میٹرکس، حقیقی فائلوں اور مقامی لائبریریوں کے ساتھ کام۔ ان منظرناموں کے لیے ایمولیٹر پر انسٹرومینٹیشن ٹیسٹ ضروری ہیں۔ Robolectric حقیقی رینڈرنگ بھی دوبارہ پیش نہیں کرتا — لے آؤٹ ٹیسٹ Compose Test Rule یا Espresso کے ذریعے بہتر کیے جاتے ہیں۔ تاہم، کاروباری منطق، نیویگیشن اور ViewModel حالتوں کی جانچ کے لیے، Robolectric 10 گنا تیز رفتاری کے ساتھ ایمولیٹر کو مکمل طور پر بدل دیتا ہے۔
Robolectric کو JDK 11 یا اس سے اوپر کی ضرورت ہے اور یہ AGP (Android Gradle Plugin) 7.0 سے تازہ ترین مستحکم ورژن تک مطابقت رکھتا ہے۔ Robolectric کا SDK مینیجر پہلی بار چلانے پر ضروری Android API ورژن خود بخود ڈاؤن لوڈ کرتا ہے — یہ ایک بار کا عمل ہے۔ CI سرورز کے لیے، پہلے ٹیسٹ رن میں تاخیر سے بچنے کے لیے sdkmanager کے ذریعے SDK پہلے سے لوڈ کرنے کی سفارش کی جاتی ہے۔ Robolectric کو نئے ورژن میں اپ ڈیٹ کرنے کے لیے عام طور پر ٹیسٹ کوڈ میں تبدیلی کی ضرورت نہیں ہوتی، صرف build.gradle میں انحصار نمبر اپ ڈیٹ کرنا ہوتا ہے۔
Robolectric مقبول موکنگ فریم ورکس کے ساتھ مطابقت رکھتا ہے: Kotlin کے لیے MockK اور Java کے لیے Mockito۔ موک انحصار کو الگ کرنے کے لیے استعمال ہوتے ہیں: ذخیرے، API کلائنٹس، SharedPreferences۔ اہم اصول یہ ہے کہ Android SDK کلاسز کو موک نہ کریں — اس کے لیے شیڈو آبجیکٹ موجود ہیں۔ صرف ایپلیکیشن کی تہوں کو موک کریں: UseCase، Repository، DataSource اور دیگر کاروباری منطق کے اجزاء۔ شیڈو آبجیکٹ اور موک کا یہ مجموعہ کم سے کم ٹیسٹ لکھنے کی کوشش کے ساتھ زیادہ سے زیادہ لچک فراہم کرتا ہے۔
اکثر پوچھے گئے سوالات
Espresso ایک انسٹرومینٹیشن فریم ورک ہے جو ایمولیٹر یا ڈیوائس پر چلتا ہے۔ Robolectric ایک یونٹ ٹیسٹنگ فریم ورک ہے جو JVM پر چلتا ہے۔ Espresso حقیقی رویے کی جانچ کرتا ہے، Robolectric شیڈو ماحول میں الگ تھلگ منطق کی جانچ کرتا ہے۔ یہ ایک دوسرے کی تکمیل کرتے ہیں۔
ہاں، Robolectric ورژن 4.8 سے Jetpack Compose کو سپورٹ کرتا ہے۔ Compose اجزاء کے ٹیسٹ ComposeTestRule کے ساتھ چلائے جاتے ہیں، ایمولیٹر کی طرح۔ تاہم، Robolectric پر Compose ٹیسٹ حقیقی رینڈرنگ کی جانچ نہیں کرتے — صرف کمپوزیشن منطق کی جانچ کرتے ہیں۔
Robolectric ملٹی ماڈیول پروجیکٹس کو سپورٹ کرتا ہے۔ ہر ماڈیول اپنے مینی فیسٹ اور وسائل کے ساتھ الگ سے کنفیگر کیا جاتا ہے۔ UI اجزاء کے بغیر ماڈیولز کے لیے Android پلگ ان کے بغیر لائبریری ماڈیول کافی ہے۔ درجنوں ماڈیولز والے بڑے پروجیکٹس میں، ہر ماڈیول کے Robolectric ٹیسٹ متوازی چلتے ہیں، جو ایمولیٹر پر ترتیب وار چلانے کے مقابلے میں اضافی رفتار فراہم کرتا ہے۔
وسائل کا مسئلہ اس وقت ہوتا ہے جب build.gradle میں unitTests.includeAndroidResources = true نہ ہو یا مینی فیسٹ کے صحیح راستے کے ساتھ @Config اینوٹیشن غائب ہو۔ Robolectric build/intermediates سے مرتب کردہ وسائل استعمال کرتا ہے۔
Robolectric ٹیسٹ Android Studio میں عام Java/Kotlin ٹیسٹوں کی طرح ڈیبگ کیے جاتے ہیں۔ بریک پوائنٹس، سٹیپ تھرو ڈیبگنگ، شیڈو آبجیکٹ اور ان کی حالت کا معائنہ دستیاب ہے۔ لاگنگ VM آپشنز میں -Drobolectric.logging=debug کے ذریعے فعال کی جاتی ہے۔
خلاصہ
ہم ایک موبائل ایپلیکیشن ٹرنکی تیار کریں گے
IT Sectr 2017 سے اسٹارٹ اپس اور کاروبار کے لیے iOS اور Android ایپلیکیشنز بناتا ہے۔ ہم آپ کو مشورہ دیں گے اور بہترین حل تجویز کریں گے۔
مزید پڑھیں