یک منبع غیرفعال یک عملیات ناهمزمان را نشان می دهد که نتایج آن بر عملیات بعدی در یک آزمایش UI تأثیر می گذارد. با ثبت منابع بیکار با اسپرسو، میتوانید این عملیات ناهمزمان را با اطمینان بیشتری هنگام آزمایش برنامه خود تأیید کنید.
زمانی که منابع بیکار مورد نیاز است را شناسایی کنید
اسپرسو مجموعه ای پیچیده از قابلیت های همگام سازی را ارائه می دهد. با این حال، این ویژگی چارچوب فقط برای عملیاتی اعمال میشود که پیامها را در MessageQueue
ارسال میکنند، مانند زیرکلاس View
که محتوای آن را روی صفحه میکشد.
از آنجایی که اسپرسو از هیچ گونه عملیات ناهمزمان دیگری، از جمله عملیاتی که روی یک رشته پس زمینه اجرا می شود، آگاه نیست، اسپرسو نمی تواند تضمین های همگام سازی خود را در آن شرایط ارائه دهد. برای اینکه اسپرسو را از عملکرد طولانی مدت برنامه خود آگاه کنید، باید هر کدام را به عنوان یک منبع غیرفعال ثبت کنید.
اگر هنگام آزمایش نتایج کار ناهمزمان برنامه خود از منابع بیکار استفاده نمیکنید، ممکن است مجبور شوید از یکی از راهحلهای بد زیر برای بهبود قابلیت اطمینان آزمایشهای خود استفاده کنید:
- افزودن تماسها به
Thread.sleep()
. وقتی تاخیرهای مصنوعی را به تستهای خود اضافه میکنید، اجرای مجموعه آزمایشی شما بیشتر طول میکشد و تستهای شما ممکن است گاهی اوقات در دستگاههای کندتر اجرا شوند، با شکست مواجه شوند. بعلاوه، این تأخیرها مقیاس خوبی ندارند، زیرا ممکن است برنامه شما در نسخه بعدی کار ناهمزمان زمانبرتری را انجام دهد. - در حال پیادهسازی بستهبندیهای امتحان مجدد، که از یک حلقه برای بررسی مکرر بررسی اینکه آیا برنامه شما هنوز کار ناهمزمان را انجام میدهد تا زمانی که مهلت زمانی رخ دهد، استفاده میکند. حتی اگر حداکثر تعداد تلاش مجدد را در تست های خود مشخص کنید، هر اجرای مجدد منابع سیستم، به ویژه CPU را مصرف می کند.
- استفاده از نمونههایی از
CountDownLatch
، که به یک یا چند رشته اجازه میدهد منتظر بمانند تا تعداد خاصی از عملیات در حال اجرا در رشتهای دیگر کامل شود. این اشیاء از شما می خواهند که طول زمان را مشخص کنید. در غیر این صورت، برنامه شما ممکن است به طور نامحدود مسدود شود. چفت ها همچنین پیچیدگی غیر ضروری را به کد شما اضافه می کنند و تعمیر و نگهداری را دشوارتر می کنند.
اسپرسو به شما امکان میدهد این راهحلهای غیرقابل اعتماد را از آزمایشهای خود حذف کنید و به جای آن، کار ناهمزمان برنامه خود را به عنوان منابع غیرفعال ثبت کنید.
موارد استفاده رایج
هنگام انجام عملیات مشابه نمونه های زیر در تست های خود، از یک منبع بیکار استفاده کنید:
- بارگیری داده ها از اینترنت یا منبع داده محلی.
- ایجاد ارتباط با پایگاه های داده و تماس های تلفنی.
- مدیریت خدمات ، چه با استفاده از یک سرویس سیستم یا یک نمونه از
IntentService
. - انجام منطق تجاری پیچیده ، مانند تبدیل بیت مپ.
هنگامی که این عملیات ها یک UI را به روز می کنند که آزمایشات شما آن را تأیید می کند، ثبت منابع بیکار به ویژه مهم است.
مثالی از پیاده سازی منابع بیکار
فهرست زیر چندین نمونه از پیادهسازی منابع غیرفعال را توضیح میدهد که میتوانید آنها را در برنامه خود ادغام کنید :
-
CountingIdlingResource
- شمارنده ای از وظایف فعال را حفظ می کند. وقتی شمارنده صفر باشد، منبع مرتبط بیکار در نظر گرفته می شود. این قابلیت شباهت زیادی به
Semaphore
دارد. در بیشتر موارد، این پیاده سازی برای مدیریت کار ناهمزمان برنامه شما در طول آزمایش کافی است. -
UriIdlingResource
- مشابه
CountingIdlingResource
، اما قبل از اینکه منبع بیکار در نظر گرفته شود، شمارنده باید برای یک دوره زمانی خاص صفر باشد. این دوره انتظار اضافی، درخواستهای شبکه متوالی را در نظر میگیرد، جایی که یک برنامه در رشته شما ممکن است بلافاصله پس از دریافت پاسخ به درخواست قبلی، درخواست جدیدی ارائه دهد. -
IdlingThreadPoolExecutor
- پیاده سازی سفارشی
ThreadPoolExecutor
که تعداد کل وظایف در حال اجرا را در استخرهای رشته ایجاد شده پیگیری می کند. این کلاس از یکCountingIdlingResource
برای نگهداری شمارنده وظایف فعال استفاده می کند. -
IdlingScheduledThreadPoolExecutor
- اجرای سفارشی
ScheduledThreadPoolExecutor
. این کارکردها و قابلیتهای مشابه کلاسIdlingThreadPoolExecutor
را ارائه میکند، اما همچنین میتواند کارهایی را که برای آینده برنامهریزی شدهاند یا قرار است به صورت دورهای اجرا شوند را پیگیری کند.
منبع بیکار خود را ایجاد کنید
همانطور که از منابع بیحرکت در آزمایشهای برنامه خود استفاده میکنید، ممکن است لازم باشد مدیریت منابع سفارشی یا ثبت گزارش را ارائه دهید. در این موارد، پیاده سازی های ذکر شده در بخش قبل ممکن است کافی نباشد. اگر اینطور است، میتوانید یکی از این پیادهسازی منابع بیحرکت را گسترش دهید یا خودتان را ایجاد کنید.
اگر عملکرد منبع غیرفعال خود را پیادهسازی میکنید، بهترین روشهای زیر، بهویژه اولین مورد را در نظر داشته باشید:
- فراخوانی انتقال به حالت بیکار در خارج از چک های بیکار.
- بعد از اینکه برنامه شما غیرفعال شد، خارج از هر پیاده سازی
isIdleNow()
onTransitionToIdle()
فراخوانی کنید. به این ترتیب، اسپرسو یک بررسی غیرضروری و ثانویه برای تعیین اینکه آیا یک منبع بیکار معین بیکار است انجام نمی دهد.
قطعه کد زیر این توصیه را نشان می دهد:
کاتلین
fun isIdle() { // DON'T call callback.onTransitionToIdle() here! } fun backgroundWorkDone() { // Background work finished. callback.onTransitionToIdle() // Good. Tells Espresso that the app is idle. // Don't do any post-processing work beyond this point. Espresso now // considers your app to be idle and moves on to the next test action. }
جاوا
public void isIdle() { // DON'T call callback.onTransitionToIdle() here! } public void backgroundWorkDone() { // Background work finished. callback.onTransitionToIdle() // Good. Tells Espresso that the app is idle. // Don't do any post-processing work beyond this point. Espresso now // considers your app to be idle and moves on to the next test action. }
- منابع بیکار را قبل از نیاز به آنها ثبت کنید.
مزایای همگام سازی مرتبط با منابع بیکار تنها پس از اولین فراخوانی اسپرسو از روش
isIdleNow()
آن منبع تأثیر می گذارد.لیست زیر چندین نمونه از این ویژگی را نشان می دهد:
- اگر یک منبع غیرفعال را در روشی که با
@Before
حاشیه نویسی شده است، ثبت کنید، منبع غیرفعال در خط اول هر آزمون اعمال می شود. - اگر یک منبع غیرفعال را در یک تست ثبت کنید، منبع بیکاری در طی اقدام بعدی مبتنی بر اسپرسو اعمال می شود. این رفتار باز هم رخ می دهد حتی اگر اقدام بعدی در همان تست عبارتی باشد که منبع بیکاری را ثبت می کند.
- اگر یک منبع غیرفعال را در روشی که با
- پس از اتمام استفاده از منابع بیکار، آنها را لغو ثبت کنید.
برای صرفه جویی در منابع سیستم، باید به محض اینکه دیگر به منابع غیرفعال نیاز ندارید، آنها را لغو ثبت کنید. به عنوان مثال، اگر یک منبع غیرفعال را در روشی که با
@Before
حاشیه نویسی شده است ثبت می کنید، بهتر است این منبع را در روش مربوطه که با@After
حاشیه نویسی شده است لغو ثبت کنید.- از یک رجیستری بیکار برای ثبت و لغو ثبت منابع بیکار استفاده کنید.
با استفاده از این کانتینر برای منابع بیحرکت برنامه خود، میتوانید منابع بیحرکت را به طور مکرر در صورت نیاز ثبت و لغو ثبت کنید و همچنان رفتار ثابتی را مشاهده کنید.
- فقط حالت برنامه ساده را در منابع بیکار حفظ کنید.
برای مثال، منابع بیکار که پیادهسازی و ثبت میکنید نباید حاوی ارجاعاتی به
View
objects باشند.
منابع بیکار را ثبت کنید
اسپرسو یک کلاس کانتینری ارائه می دهد که می توانید منابع بیکار برنامه خود را در آن قرار دهید. این کلاس که IdlingRegistry
نام دارد، یک مصنوع مستقل است که حداقل هزینه را به برنامه شما وارد می کند. این کلاس همچنین به شما اجازه می دهد تا مراحل زیر را برای بهبود قابلیت نگهداری برنامه خود بردارید:
- در آزمایشهای برنامه خود، به جای منابع غیرفعال موجود در IdlingRegistry، یک مرجع به
IdlingRegistry
ایجاد کنید. - تفاوتها را در مجموعه منابع غیرفعال که برای هر نوع ساخت استفاده میکنید، حفظ کنید.
- منابع غیرفعال را در سرویسهای برنامهتان تعریف کنید، نه در مؤلفههای رابط کاربری که به آن سرویسها اشاره میکنند.
منابع غیرفعال را در برنامه خود ادغام کنید
اگرچه میتوانید منابع بیحرکتی را به روشهای مختلف به یک برنامه اضافه کنید، یک رویکرد بهویژه کپسولهسازی را برای برنامه شما حفظ میکند و در عین حال به شما امکان میدهد عملیات خاصی را که یک منبع بیحرکت معین نشاندهنده آن است، مشخص کنید.
رویکرد توصیه شده
هنگام اضافه کردن منابع غیرفعال به برنامه خود، ما به شدت توصیه می کنیم منطق منبع غیرفعال را در خود برنامه قرار دهید و فقط عملیات ثبت نام و لغو ثبت را در آزمایشات خود انجام دهید.
اگرچه با پیروی از این رویکرد، موقعیت غیرمعمول استفاده از یک رابط فقط آزمایشی در کد تولید را ایجاد میکنید، میتوانید منابع بیحرکتی را در اطراف کدهایی که از قبل دارید بپیچید و اندازه APK و تعداد روش برنامه خود را حفظ کنید.
رویکردهای جایگزین
اگر ترجیح میدهید منطق منابع غیرفعال در کد تولید برنامهتان نباشد، چندین استراتژی یکپارچهسازی قابل دوام دیگر وجود دارد:
- انواع ساخت، مانند طعمهای محصول Gradle را ایجاد کنید و از منابع غیرفعال فقط در ساخت اشکالزدایی برنامه خود استفاده کنید.
- از یک چارچوب تزریق وابستگی مانند Dagger استفاده کنید تا نمودار وابستگی منبع بیحرکت برنامهتان را به آزمایشهای خود تزریق کنید. اگر از Dagger 2 استفاده می کنید، خود تزریق باید از یک جزء فرعی نشات بگیرد.
یک منبع غیرفعال را در آزمایشهای برنامه خود پیاده کنید و بخشی از اجرای برنامه خود را که باید در آن آزمایشها همگامسازی شود، نشان دهید.
احتیاط: اگرچه به نظر میرسد این تصمیم طراحی یک مرجع مستقل به منابع غیرفعال ایجاد میکند، اما در همه برنامهها به جز سادهترین برنامهها، کپسولهسازی را نیز از بین میبرد.
منابع اضافی
برای اطلاعات بیشتر در مورد استفاده از اسپرسو در تست های اندروید به منابع زیر مراجعه کنید.
نمونه ها
- IdlingResourceSample : همگام سازی با کارهای پس زمینه.