Robolectric با ایجاد یک محیط زمان اجرا که شامل کد فریم ورک واقعی Android است ، کار می کند. این بدان معناست که وقتی تست ها یا کد شما تحت تست به چارچوب Android فراخوانی می کنید ، تجربه واقع بینانه تری کسب می کنید ، همانطور که در بیشتر قسمت ها همان کد را اجرا می شود که در یک دستگاه واقعی انجام می شود. با این حال محدودیت هایی وجود دارد:
- کد بومی - کد بومی اندروید نمی تواند در دستگاه توسعه شما اجرا شود.
- خارج از تماس های فرآیند - هیچ سرویس سیستم اندرویدی در دستگاه توسعه شما کار نمی کند.
- API های آزمایش ناکافی - Android شامل No API های مناسب برای آزمایش است
Robolectric این شکاف ها را با مجموعه ای از کلاس های معروف به سایه ها پر می کند. هر سایه می تواند رفتار یک کلاس مربوطه را در سیستم عامل Android اصلاح یا گسترش دهد. هنگامی که یک کلاس Android فوری می شود ، Robolectric به دنبال یک کلاس سایه مربوطه است و اگر یکی از آنها را پیدا کند ، یک شی سایه ایجاد می کند تا با آن ارتباط برقرار کند.
با استفاده از ابزار ابزار بایت ، Robolectric قادر به بافندگی در پیاده سازی های جعلی Cross Platform برای جایگزینی کد بومی و اضافه کردن API های اضافی برای آزمایش امکان پذیر است.
اسم چیست؟
چرا "سایه؟"اشیاء سایه کاملاً پروکسی نیستند ، کاملاً جعلی نیستند ، کاملاً مسخره و خرد نیستند. سایه ها گاهی پنهان هستند ، گاهی دیده می شوند و می توانند شما را به سمت شیء واقعی سوق دهند. حداقل ما آنها را "گوسفند" نمی نامیدیم ، که در نظر داشتیم.
کلاسهای سایه
کلاسهای سایه همیشه به یک سازنده بدون ARG عمومی احتیاج دارند تا چارچوب رولکتریک بتواند آنها را فوری کند. آنها با کلاس همراه هستند که با حاشیه نویسی @implements در اعلامیه کلاس سایه می زنند.
کلاسهای سایه باید سلسله مراتب وراثت کلاسهای تولید را تقلید کنند. به عنوان مثال ، اگر شما در حال اجرای سایه ای برای ViewGroup ، ShadowViewGroup هستید ، کلاس سایه شما باید Shadow ، ShadowView SuperClass ViewGroup را گسترش دهد.
. تصاویر(گروه.طبقه) عمومی طبقه گروه Shadowviewgroup تمدید کردن نمایش سایه .
مواد و روش ها
اشیاء Shadow روش هایی را اجرا می کنند که دارای امضای مشابه کلاس Android هستند. هنگامی که روشی با همان امضای روی شیء اندرویدی فراخوانی می شود ، Robolectric روش را روی یک شی سایه فراخوانی می کند.
فرض کنید یک برنامه خط زیر کد را تعریف کرده است:
. این.تصویر.setimageresource(R.کشیده پذیر.pivotallabs_logo); .
در زیر تست ، روش ShadowImageView#SetImagerEsource (INT SAIN) در نمونه سایه فراخوانی می شود.
روشهای سایه باید با حاشیه نویسی IMPLATEMENTATION مشخص شود. Robolectric شامل یک آزمایش خط برای کمک به اطمینان از انجام این کار به درستی است.
تصاویر(تصویر.طبقه) عمومی طبقه ShadowImageView تمدید کردن نمایش سایه . @پیاده سازی حفاظت شده خالی setimageresource(در نظر گرفتن باقیمانده) // اجرای اینجا. > >
Robolectric از سایه زدن تمام روش های کلاس اصلی ، از جمله خصوصی ، استاتیک ، نهایی یا بومی پشتیبانی می کند.
به طور معمول روشهای implementation نیز باید دارای اصلاح کننده محافظت شده باشند. قصد کاهش سطح API سایه ها است. نویسنده آزمون همیشه باید چنین روشهایی را در کلاس Android Framework مستقیماً فراخوانی کند.
این مهم است که روش های سایه ای بر روی سایه مربوط به کلاس که در ابتدا تعریف شده بودند ، پیاده سازی می شوند. در غیر این صورت مکانیسم جستجوی Robolectric آنها را پیدا نمی کند (حتی اگر آنها در زیر کلاس سایه اعلام شده باشند.) به عنوان مثال ، روش تنظیم شده () در نمای تعریف می شود. اگر یک روش setEnabled () در ShadowViewGroup به جای ShadowView تعریف شود ، در زمان اجرا حتی در صورت نامگذاری () در نمونه ای از ViewGroup پیدا نمی شود.
سازندگان سایه دار
هنگامی که یک شیء سایه فوری شود ، Robolectric به دنبال روشی به نام __constructor__ و حاشیه نویسی با iMplementation است که دارای همان استدلال هایی است که سازنده ای دارد که در شیء واقعی فراخوانی شده است.
به عنوان مثال ، اگر کد برنامه می خواست از سازنده TextView که یک زمینه را دریافت می کند فراخوانی کند:
جدید نمایش متن(متن نوشته);
Robolectric روش زیر __constructor__ را که زمینه ای دریافت می کند ، فراخوانی می کند:
تصاویر(نمایش متن.طبقه) عمومی طبقه ShadowTextView . @پیاده سازی حفاظت شده خالی __constructor__(متن نوشته متن نوشته) این.متن نوشته = متن نوشته; > .
دسترسی به نمونه واقعی
بعضی اوقات کلاسهای سایه ممکن است بخواهند به شیء مورد نظر خود مراجعه کنند ، به عنوان مثال. برای دستکاری در زمینه ها. یک کلاس سایه می تواند با اعلام یک حاشیه حاشیه نویسی realobject این کار را انجام دهد:
تصاویر(نقطه.طبقه) عمومی طبقه نقطه سایه realobject خصوصی نقطه نقطه نظر; . عمومی خالی __constructor__(در نظر گرفتن x, در نظر گرفتن y) نقطه نظر.x = x; نقطه نظر.y = y; > >
Robolectric قبل از استناد به هر روش دیگر ، نقطه واقعی را به نمونه واقعی نقطه تعیین می کند.
توجه به این نکته مهم است که روش های فراخوانی شده روی شی واقعی همچنان توسط Robolectric رهگیری و هدایت می شوند. این اغلب در کد تست اهمیتی ندارد، اما پیامدهای مهمی برای پیاده کننده های کلاس Shadow دارد. از آنجایی که سلسله مراتب وراثت کلاس Shadow همیشه منعکس کننده کلاس های Android مرتبط با آنها نیست، گاهی اوقات لازم است از طریق این اشیاء واقعی تماس هایی برقرار شود تا زمان اجرا Robolectric این فرصت را داشته باشد که آنها را به کلاس Shadow صحیح بر اساس کلاس واقعی هدایت کند. از شیدر غیر این صورت متدهای موجود در Shadows از کلاس های پایه قادر به دسترسی به متدهای موجود در Shadows زیر کلاس های خود نیستند.
متدهای کلاس shadow شما می توانند با استفاده از Shadow. directlyOn() کد سیستم عامل اندروید را فراخوانی کنند.
سایه های سفارشی
Robolectric یک کار در حال پیشرفت است و ما به کمک های جامعه برای رفع اشکال ها و شکاف های ویژگی اعتماد، استقبال می کنیم و قویاً تشویق می کنیم. با این حال، اگر می خواهید رفتار سایه ها را به گونه ای تغییر دهید که برای اشتراک گذاری مناسب نیست، یا نمی توانید منتظر نسخه جدیدی باشید که یک اصلاح مهم را شامل شود، ما از سایه های سفارشی پشتیبانی می کنیم.
نوشتن یک سایه سفارشی
ساختار سایه های سفارشی تقریباً مشابه کلاس های سایه معمولی است. آنها باید حاشیه نویسی @Implements(AndroidClassName. class) را در تعریف کلاس درج کنند. می توانید از گزینه های اجرای سایه معمولی استفاده کنید، مانند روش های نمونه سایه با استفاده از @Implementation یا سایه زنی سازنده ها با استفاده از public void __constructor__(. ) . اگر بخواهید، کلاس سایه شما ممکن است یکی از سایه های استوک روبولکتریک را نیز گسترش دهد.
تصاویر(بیت مپ.طبقه) عمومی طبقه MyShadowBitmap realobject خصوصی بیت مپ realBitmap; خصوصی در نظر گرفتن کیفیت بیت مپ = -1; @پیاده سازی عمومی بولی فشرده کردن(بیت مپ.فرمت فشرده قالب, در نظر گرفتن کیفیت, خروجی جریان جریان) کیفیت بیت مپ = کیفیت; برگشت realBitmap.فشرده کردن(قالب, کیفیت, جریان); > عمومی در نظر گرفتن دریافت کیفیت() برگشت کیفیت بیت مپ; > >
استفاده از سایه های سفارشی
سایه های سفارشی با استفاده از حاشیه نویسی @Config در کلاس تست یا روش تست، با استفاده از ویژگی آرایه سایه ها به Robolectric متصل می شوند. برای استفاده از کلاس MyShadowBitmap که در بخش قبل ذکر شد، می توانید تست مورد نظر را با @Config(shadows=) حاشیه نویسی کنید و چندین سایه سفارشی را شامل شود: @Config(shadows=). این باعث می شود که Robolectric سایه سفارشی شما را هنگام اجرای کد در برابر کلاسی که سایه کرده اید شناسایی کرده و از آن استفاده کند.
اگر می خواهید سایه های سفارشی شما در تمام تست های موجود در مجموعه خود یا یک بسته خاص اعمال شود ، می توانید سایه ها را از طریق پرونده robolectric. properties پیکربندی کنید.
توجه داشته باشید ، به طور پیش فرض Shadows. shadowof () روش با سایه های سفارشی کار نمی کند. در عوض می توانید از Shadow. Extract () استفاده کنید و مقدار بازگشت را به کلاس Shadow Custom که پیاده سازی کرده اید ریخته کنید.
ساختن یک کتابخانه از سایه های سفارشی.
اگر خود را در حال ساختن کتابخانه ای از سایه های سفارشی می دانید ، باید در مورد پردازنده آنوالیت سایه Robolectric در کتابخانه سایه های خود در نظر بگیرید. این تعدادی از مزایا مانند
- ایجاد روش های ShadowOf برای هر یک از سایه های شما.
- ایجاد یک سرویس دهنده به طوری که سایه های سفارشی شما به طور خودکار اعمال می شود در صورتی که در ClassPath یافت می شود
- استفاده از هر روش استاتیک RESETTER در Teardown برای اینکه شما را قادر به تنظیم مجدد حالت استاتیک کنید.
- اعتبار سنجی اضافی و بررسی سایه های خود را انجام دهید.
اندروید پیش فرض جاواسموپی حاشیه نویسی فرآیند نام کلاس 'org. robolectric. aotation. Processing. RobolectricProcessor' استدلال = [ 'org. Robolectric. Aotation. Processing. ShadowPackage' : 'com. example. myshadowpackage' ] > > > > وابستگی فرآیند حاشیه نویسی طرح(": پردازنده") . >
بهترین روشها
محدوده سطح API سایه ها را محدود کنید.
از آنجا که روش های Robolectric 3. 7 Implementation از جمله روش های __constructor__ را می توان محافظت کرد. این مطلوب است زیرا کد آزمون با استفاده از روشهای iMplementation از شما محافظت می کند که از این روشها استفاده نمی کند ، شما نویسندگان آزمون را ترغیب می کنید تا به جای آن با API های Android عمومی تماس بگیرند.
از UseInheritImplementationMethods استفاده نکنید
این معمولاً غیر ضروری است و در Robolectric 3. 8 برداشته می شود
برابر با برابر ، هاشکد و در سایه ها غلبه نکنید.
از این کار خودداری کنید مگر اینکه در حال سایه زدن به رفتار باشید. برای آزمایش برابری برای مقایسه در آزمون ها ، یاران یا پسوندهای کتابخانه ادعای را ترجیح می دهند. ترجیح می دهید یک روش توصیف () به جای سایه زدن toString ()
سایه های با کیفیت بالایی بنویسید که به جای اجرای ، رفتار آزمایش را ارتقا می بخشد.
به جای استفاده از سایه ها به عنوان ارکانس استدلال جلال ، نوشتن سایه ای را ترجیح می دهد که رفتار آزمایش را ترغیب کند. به عنوان مثال ، روشی را اضافه نکنید که شنوندگان ثبت شده را در معرض نمایش بگذارد ، بلکه یک روش را برای روشی که از آن شنوندگان فراخوانده می شود ، اضافه کنید.
هنگام سایه زدن کد خود از احتیاط استفاده کنید.
Robolectric قدرت زیادی را فراهم می کند که نیاز به استفاده مسئولانه دارد. سایه ها برای آزمایش تعامل با چارچوب Android ایده آل هستند زیرا این چارچوب از تزریق وابستگی پشتیبانی نمی کند و استفاده لیبرال از کد استاتیک را ایجاد می کند. قبل از نوشتن سایه های سفارشی برای کد شخصی خود ، در نظر بگیرید که آیا نمی توانید کد خود را بهتر اصلاح کنید و از یک کتابخانه مسخره محبوب مانند Mockito استفاده کنید.
از جامعه حمایت کنید
لطفاً برای به اشتراک گذاشتن با جامعه و کاهش نفخ در پایگاه کد خود ، از پیشرفت های خود کمک کنید.
پستهای اخیر
GSOC 2022 - ConcryptMode
6 سپتامبر 2022
نام من امش سینگ است و من بودم.
الگوی مشترک: به اشتراک گذاری تست ها و سرعت بخشیدن به توسعه
6 اکتبر 2021
ادای احترام برای جاناتان گریش
13 سپتامبر 2021
در اواخر اوت سال 2021 ، ما از یادگیری فوق العاده ناراحت بودیم.
پسوند کروم
مستندات Robolectric را با اسناد Android Developer مشاهده کنید. به Chrome اضافه کنید
مخاطب
- پروژه GitHub
- robolectric@googlegroups. com
- Robolectric < Span> Robolectric قدرت زیادی را فراهم می کند که نیاز به استفاده مسئول دارد. سایه ها برای آزمایش تعامل با چارچوب Android ایده آل هستند زیرا این چارچوب از تزریق وابستگی پشتیبانی نمی کند و استفاده لیبرال از کد استاتیک را ایجاد می کند. قبل از نوشتن سایه های سفارشی برای کد شخصی خود ، در نظر بگیرید که آیا نمی توانید کد خود را بهتر اصلاح کنید و از یک کتابخانه مسخره محبوب مانند Mockito استفاده کنید.
مقالات آموزش فارکس...
ما را در سایت مقالات آموزش فارکس دنبال می کنید
برچسب :
نویسنده : بهزاد فراهانی
بازدید : <-PostHit->
تاريخ : سه
شنبه
17 مرداد
1402 ساعت: 0:34