Robolectric یک چارچوب منبع باز است که توسط Google نگهداری می شود که به شما امکان می دهد آزمایش ها را در یک محیط اندروید شبیه سازی شده در داخل JVM اجرا کنید، بدون سربار و ورقه ورقه شدن یک شبیه ساز. از تمام نسخه های اندروید از زمان Lollipop (سطح API 21) پشتیبانی می کند.
بسیاری از پروژههای بزرگ از Robolectric برای افزایش سرعت و قابلیت اطمینان تستهای خود و کاهش هزینههای مربوط به اجرای آزمایشها بر روی دستگاههای واقعی یا شبیهسازها استفاده میکنند. این شامل اکثر برنامه های Google است که به شدت به Robolectric متکی هستند.
Robolectric جایگزین کاملی برای شبیه ساز نیست زیرا از همه ویژگی ها و API ها پشتیبانی نمی کند. به عنوان مثال، Robolectric مانند یک شبیه ساز صفحه نمایش ندارد و برخی از API ها فقط تا حدی پشتیبانی می شوند. با این حال، به اندازه کافی بخشهای اندروید را شبیهسازی میکند تا تستهای واحد و اکثر تستهای UI را به طور قابل اعتماد اجرا کند.
استراتژی های تست
دو نوع استراتژی تست وجود دارد که می توانید با Robolectric دنبال کنید: تست واحد و تست UI.
تست واحد
Robolectric به عنوان راهی برای فعال کردن "تست واحد" در برنامه های Android تصور شد. برای مثال، میتوانید راهاندازی یک Activity را شبیهسازی کنید و منطق درون آن را آزمایش کنید و تمام متدهای چرخه حیات را فراخوانی کنید.
همچنین می توانید از تقلبی های Robolectric (به نام سایه ها) به عنوان وابستگی برای تست های واحد استفاده کنید. به عنوان مثال، اگر کلاس شما از یک Bundle استفاده می کند یا باید اتصال بلوتوث را جعل کنید.
به طور کلی، اگر یک معماری قابل آزمایش پیادهسازی میکنید، نیازی به استفاده از Robolectric برای آزمایش واحد ندارید، زیرا کد شما باید بهصورت مجزا قابل آزمایش باشد، بدون وابستگی به چارچوب اندروید.
تست رابط کاربری
Robolectric همچنین می تواند تست های UI مانند تست Espresso یا Compose را اجرا کند. میتوانید با انتقال آن به مجموعه منبع test
و تنظیم وابستگیهای Robolectric، یک تست ابزاری را به Robolectric تبدیل کنید.
android {
testOptions {
unitTests {
isIncludeAndroidResources = true
}
}
}
dependencies {
testImplementation("junit:junit:4.13.2")
testImplementation("org.robolectric:robolectric:4.13")
}
هر آزمایش رابط کاربری موجود در مجموعه منبع test
با Robolectric اجرا میشود.
import androidx.test.espresso.Espresso.onView
@RunWith(AndroidJUnit4::class)
class AddContactActivityTest {
@Test
fun inputTextShouldBeRetainedAfterActivityRecreation() {
// GIVEN
val contactName = "Test User"
val scenario = ActivityScenario.launchActivity<AddContactActivity>()
// WHEN
// Enter contact name
onView(withId(R.id.contact_name_text))
.perform(typeText(contactName))
// Destroy and recreate Activity
scenario.recreate()
// THEN
// Check contact name was preserved.
onView(withId(R.id.contact_name_text))
.check(matches(withText(contactName)))
}
}
اکثر تستهای رابط کاربری با فریمورک تعاملی ندارند و میتوانید آنها را روی Robolectric اجرا کنید. می توانید تست های رفتاری را روی Robolectric اجرا کنید زیرا وفاداری مورد نیاز برای آن بیش از حد کافی است. به عنوان مثال، هنگامی که یک تست Compose تأیید می کند که رابط کاربری پس از کلیک کردن روی یک دکمه تغییر کرده است.
میتوانید سایر آزمایشهای رابط کاربری را با Robolectric اجرا کنید، مانند تستهای اسکرین شات. با این حال وفاداری کمتر است زیرا دستگاه های مختلف صفحه نمایش را کمی متفاوت نشان می دهند.
شما باید تصمیم بگیرید که آیا اجرای Robolectric برای هر مورد استفاده به اندازه کافی خوب است یا خیر، اما در اینجا چند توصیه وجود دارد:
- از Robolectric برای تستهای رفتار رابط کاربری مجزا برای تستهای اجزا، ویژگی یا برنامه استفاده کنید. به طور کلی این تستها مدیریت حالت و رفتار رابطهای کاربری را بررسی میکنند و با وابستگیهای خارجی تعاملی ندارند.
- از Robolectric برای گرفتن اسکرین شات زمانی که دقت پیکسل مهم نیست استفاده کنید. به عنوان مثال، برای آزمایش چگونگی واکنش یک مؤلفه به اندازههای فونت یا تمهای مختلف.
توجه : Robolectric میتواند به صورت بومی اسکرینشات بگیرد، اما برای انجام تست اسکرینشات با آن به یک کتابخانه شخص ثالث نیاز دارید.
تست های روبولکتریک در مقابل دستگاه
به طور خلاصه، Robolectric وفاداری کافی برای اجرای اکثر تستهای UI ارائه میکند، اما برخی از موارد همچنان به تستهای دستگاه نیاز دارند، برای مثال موارد مربوط به رابط کاربری سیستم مانند لبه به لبه یا تصویر در تصویر، یا زمانی که به ویژگیهای پشتیبانینشده مانند WebView
تکیه میکنند. .