وقتی یک عنصر یا سیستمی از عناصر را آزمایش می کنید، این کار را به صورت مجزا انجام می دهید. برای مثال، برای آزمایش ViewModel، نیازی به راهاندازی شبیهساز و راهاندازی یک رابط کاربری ندارید، زیرا به چارچوب اندروید بستگی ندارد (یا نباید).
با این حال، موضوع مورد آزمایش ممکن است برای کارکرد آن به دیگران بستگی داشته باشد . به عنوان مثال، یک ViewModel ممکن است به یک مخزن داده برای کار بستگی داشته باشد.
زمانی که نیاز به ایجاد وابستگی به موضوع مورد آزمایش دارید، یک روش معمول ایجاد یک تست دوبل (یا شیء آزمایشی ) است. دوبل های تست اشیایی هستند که به عنوان اجزای برنامه شما به نظر می رسند و عمل می کنند اما در آزمایش شما برای ارائه یک رفتار یا داده خاص ایجاد شده اند. مزایای اصلی این است که آنها تست های شما را سریع تر و ساده تر می کنند.
انواع تست دوبل
انواع مختلف تست دوبل وجود دارد:
جعلی | یک تست دوبل که دارای یک پیاده سازی "کار" کلاس است، اما به گونه ای پیاده سازی شده است که برای تست ها خوب است اما برای تولید نامناسب است. مثال: یک پایگاه داده در حافظه. تقلبی ها نیازی به چارچوب تمسخر آمیز ندارند و سبک وزن هستند. آنها ترجیح داده می شوند. |
---|---|
مسخره کردن | یک تست دوتایی که نحوه برنامه ریزی شما برای رفتار کردن و انتظاراتی در مورد تعاملاتش دارد. اگر تقلبها با الزاماتی که شما تعریف کردهاید مطابقت نداشته باشد، در آزمونها شکست خواهند خورد. برای دستیابی به همه اینها، ماک ها معمولاً با یک چارچوب تمسخر آمیز ساخته می شوند. مثال: بررسی کنید که یک متد در پایگاه داده دقیقا یک بار فراخوانی شده باشد. |
خرد | یک تست دوتایی که نحوه برنامهریزی شما را برای رفتار برنامهریزی میکند، اما در مورد تعاملات آن انتظاری ندارد. معمولا با یک چارچوب تمسخر آمیز ایجاد می شود. تقلبی ها به دلیل سادگی به خرد ترجیح داده می شوند. |
ساختگی | یک تست دوتایی که در اطراف ارسال می شود اما استفاده نمی شود، مثلاً اگر فقط باید آن را به عنوان یک پارامتر ارائه کنید. مثال: یک تابع خالی به عنوان یک کلیک برگشتی ارسال می شود. |
جاسوس | یک لفاف بر روی یک شی واقعی که برخی از اطلاعات اضافی را نیز مانند مسخره کردن، ردیابی می کند. معمولاً برای افزودن پیچیدگی از آنها اجتناب می شود. بنابراین جعلی یا مسخره بر جاسوسان ترجیح داده می شود. |
سایه | جعلی مورد استفاده در Robolectric. |
مثال استفاده از جعلی
فرض کنید که می خواهید یک ViewModel را واحد آزمایش کنید که به رابطی به نام UserRepository
وابسته است و نام اولین کاربر را در معرض یک UI قرار می دهد. شما می توانید با پیاده سازی رابط و برگرداندن داده های شناخته شده، یک تست جعلی ایجاد کنید.
object FakeUserRepository : UserRepository {
fun getUsers() = listOf(UserAlice, UserBob)
}
val const UserAlice = User("Alice")
val const UserBob = User("Bob")
این UserRepository
جعلی نیازی به وابستگی به منابع داده محلی و راه دوری ندارد که نسخه تولیدی از آنها استفاده می کند. فایل در مجموعه منبع آزمایشی زندگی می کند و با برنامه تولید ارسال نمی شود.
آزمایش زیر تأیید می کند که ViewModel به درستی اولین نام کاربری را در معرض دید قرار می دهد.
@Test
fun viewModelA_loadsUsers_showsFirstUser() {
// Given a VM using fake data
val viewModel = ViewModelA(FakeUserRepository) // Kicks off data load on init
// Verify that the exposed data is correct
assertEquals(viewModel.firstUserName, UserAlice.name)
}
جایگزین کردن UserRepository
با یک جعلی در تست واحد آسان است، زیرا ViewModel توسط تستر ایجاد میشود. با این حال، جایگزینی عناصر دلخواه در آزمایش های بزرگتر می تواند چالش برانگیز باشد.
جایگزینی اجزا و تزریق وابستگی
وقتی تستها هیچ کنترلی بر ایجاد سیستمهای تحت آزمایش ندارند، جایگزینی اجزا برای دوتاییهای آزمایشی بیشتر درگیر میشود و به معماری برنامهتان نیاز دارد که از طراحی قابل آزمایش پیروی کند.
حتی تستهای انتها به انتها بزرگ نیز میتوانند از استفاده از تستهای دوتایی بهره ببرند، مانند تست UI ابزاری که در جریان یک کاربر کامل در برنامه شما حرکت میکند. در این صورت ممکن است بخواهید آزمایش خود را هرمتیک کنید. تست هرمتیک از تمام وابستگی های خارجی مانند واکشی داده ها از اینترنت جلوگیری می کند. این قابلیت اطمینان و عملکرد را بهبود می بخشد.
شما می توانید برنامه خود را طوری طراحی کنید که به این انعطاف پذیری دستی دست یابد، اما توصیه می کنیم از یک چارچوب تزریق وابستگی مانند Hilt برای جایگزینی اجزای برنامه خود در زمان تست استفاده کنید. راهنمای تست Hilt را ببینید.
مراحل بعدی
صفحه استراتژیهای تست نشان میدهد که چگونه میتوانید بهرهوری خود را با استفاده از انواع مختلف تستها افزایش دهید.