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 | এমুলেটর |
|---|---|---|
| গতি | ~5 সেকেন্ড প্রতি 100 টেস্ট | ~5 মিনিট প্রতি 100 টেস্ট |
| চালু | APK বিল্ডের দরকার নেই | APK বিল্ড প্রয়োজন |
| বাস্তব API | শ্যাডো ইমুলেশন | নেটিভ Android SDK |
| রেডি-টু-ইউজ | শুধু JUnit | যেকোনো ফ্রেমওয়ার্ক |
Robolectric ViewModel, Repository এবং UseCase — যেসব কম্পোনেন্ট Android SDK ব্যবহার করে কিন্তু বাস্তব UI প্রয়োজন হয় না — সেগুলি পরীক্ষার জন্য উপযুক্ত। 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 10x দ্রুত নির্বাহে এমুলেটরকে সম্পূর্ণরূপে প্রতিস্থাপন করে।
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 অ্যাপ্লিকেশন তৈরি করে। আমরা আপনাকে পরামর্শ দেব এবং সেরা সমাধান প্রস্তাব করব।
আরও পড়ুন