منابع بدون فعالیت Espresso

منبع بدون فعالیت نشان‌دهنده عملیاتی ناهمگام است که نتایج آن بر عملیات بعدی در آزمایش میانای کاربر تأثیر می‌گذارد. با ثبت منابع بدون فعالیت با Espresso، می‌توانید این عملیات ناهمگام را هنگام آزمایش برنامه‌تان با اطمینان بیشتری اعتبارسنجی کنید.

شناسایی زمان نیاز به منابع بدون فعالیت

Espresso مجموعه پیچیده‌ای از قابلیت‌های همگام‌سازی را ارائه می‌دهد. بااین‌حال، این ویژگی چارچوب فقط برای عملیاتی اعمال می‌شود که پیام‌ها را در MessageQueue پست می‌کنند، مانند زیرکلاس View که محتوای خود را روی صفحه می‌کشد.

ازآنجایی‌که Espresso از هیچ عملیات ناهمگام دیگری، ازجمله عملیات‌هایی که در رشته پس‌زمینه اجرا می‌شوند، آگاه نیست، نمی‌تواند تضمین‌های همگام‌سازی خود را در آن شرایط ارائه دهد. برای اینکه Espresso را از عملیات طولانی‌مدت برنامه‌تان مطلع کنید، باید هرکدام را به‌عنوان منبع بدون فعالیت ثبت کنید.

اگر هنگام آزمایش نتایج کار ناهمگام برنامه‌تان از منابع بدون فعالیت استفاده نکنید، ممکن است مجبور شوید برای بهبود قابلیت اطمینان آزمایش‌هایتان از یکی از راه‌حل‌های موقت بد زیر استفاده کنید:

  • درحال افزودن تماس‌ها به Thread.sleep(). وقتی تأخیرهای مصنوعی به آزمایش‌هایتان اضافه می‌کنید، اجرای مجموعه آزمون شما بیشتر طول می‌کشد و ممکن است آزمایش‌هایتان همچنان گاهی هنگام اجرا در دستگاه‌های کندتر ناموفق باشد. علاوه‌براین، این تأخیرها به‌خوبی مقیاس‌بندی نمی‌شوند، زیرا ممکن است برنامه‌تان مجبور شود در نسخه آتی، کارهای ناهمگام زمان‌برتری انجام دهد.
  • پیاده‌سازی پوشاننده‌های تکرار مجدد که از حلقه برای بررسی مکرر اینکه آیا برنامه شما همچنان درحال انجام کار ناهمگام است یا نه استفاده می‌کند تا زمانی که وقفه زمانی رخ دهد. حتی اگر حداکثر تعداد تلاش مجدد را در آزمایش‌هایتان مشخص کنید، هر اجرای مجدد منابع سیستم، به‌ویژه واحد پردازش مرکزی، را مصرف می‌کند.
  • استفاده از نمونه‌های CountDownLatch، که به یک یا چند رشته اجازه می‌دهد تا زمانی که تعداد مشخصی از عملیات درحال اجرا در رشته دیگری تکمیل شود، منتظر بمانند. این اشیا از شما می‌خواهند که طول زمان استراحت را مشخص کنید؛ درغیراین‌صورت، ممکن است برنامه‌تان به‌طور نامحدود مسدود شود. همچنین، قفل‌ها پیچیدگی غیرضروری به کدتان اضافه می‌کنند و نگهداری را دشوارتر می‌کنند.

Espresso به شما امکان می‌دهد این راه‌حل‌های غیرقابل‌اعتماد را از آزمایش‌هایتان بردارید و درعوض، کار ناهمگام برنامه‌تان را به‌عنوان منابع بدون فعالیت ثبت کنید.

موارد استفاده رایج

هنگام انجام عملیات مشابه مثال‌های زیر در آزمایش‌هایتان، استفاده از منبع بدون فعالیت را درنظر بگیرید:

  • بار کردن داده از اینترنت یا منبع داده محلی.
  • برقراری اتصال با پایگاه‌های داده و تماس‌های برگشتی.
  • مدیریت سرویس‌ها، بااستفاده از سرویس سیستم یا نمونه‌ای از IntentService.
  • اجرای منطق کسب‌وکار پیچیده، مثل تبدیل‌های نگاشت بیتی.

ثبت منابع بدون فعالیت به‌ویژه زمانی مهم است که این عملیات‌ها رابط کاربری‌ای را به‌روزرسانی می‌کنند که سپس آزمایش‌های شما آن را اعتبارسنجی می‌کنند.

نمونه پیاده‌سازی‌های منبع بدون فعالیت

فهرست زیر چند نمونه پیاده‌سازی منابع بدون فعالیت را شرح می‌دهد که می‌توانید در برنامه‌تان ادغام کنید:

CountingIdlingResource
شمارنده تکالیف فعال را حفظ می‌کند. وقتی شمارنده صفر است، منبع مرتبط بیکار درنظر گرفته می‌شود. این عملکرد بسیار شبیه به عملکرد Semaphore است. در بیشتر موارد، این پیاده‌سازی برای مدیریت کار ناهمگام برنامه‌تان درطول آزمایش کافی است.
UriIdlingResource
مشابه CountingIdlingResource، اما شمارنده باید برای مدت زمان مشخصی صفر باشد تا منبع به‌عنوان غیرفعال درنظر گرفته شود. این دوره انتظار اضافی درخواست‌های شبکه متوالی را درنظر می‌گیرد، که در آن برنامه‌ای در رشته شما ممکن است بلافاصله پس‌از دریافت پاسخ به درخواست قبلی، درخواست جدیدی ارائه دهد.
IdlingThreadPoolExecutor
پیاده‌سازی سفارشی ThreadPoolExecutor که تعداد کل کارهای درحال اجرا را در استخرهای رشته ایجادشده ردیابی می‌کند. این کلاس از CountingIdlingResource برای حفظ شمارنده تکالیف فعال استفاده می‌کند.
IdlingScheduledThreadPoolExecutor
پیاده‌سازی سفارشی ScheduledThreadPoolExecutor. این کلاس همان عملکرد و قابلیت‌های کلاس IdlingThreadPoolExecutor را ارائه می‌دهد، اما می‌تواند تکالیفی را که برای آینده زمان‌بندی شده‌اند یا برای اجرا به‌صورت دوره‌ای زمان‌بندی شده‌اند نیز پیگیری کند.

منبع بدون فعالیت خودتان را ایجاد کنید

وقتی از منابع بدون فعالیت در آزمایش‌های برنامه‌تان استفاده می‌کنید، ممکن است لازم باشد مدیریت منابع یا گزارش‌گیری سفارشی ارائه دهید. در این موارد، پیاده‌سازی‌های فهرست‌شده در بخش قبلی ممکن است کافی نباشد. اگر این‌طور است، می‌توانید یکی از این پیاده‌سازی‌های منبع بدون فعالیت را گسترش دهید یا پیاده‌سازی خودتان را ایجاد کنید.

اگر عملکرد منبع بدون فعالیت خودتان را پیاده‌سازی می‌کنید، روال‌های مطلوب زیر را به‌خاطر داشته باشید، به‌ویژه روال اول:

انتقال به حالت غیرفعال را خارج از بررسی‌های غیرفعال فراخوانی کنید.
پس‌از اینکه برنامه‌تان غیرفعال شد، onTransitionToIdle() را خارج از هرگونه پیاده‌سازی isIdleNow() فراخوانی کنید. به این ترتیب، Espresso بررسی دوم و غیرضروری برای تعیین اینکه آیا یک منبع بدون فعالیت داده‌شده بدون فعالیت است یا نه انجام نمی‌دهد.

تکه‌کد زیر این توصیه را نشان می‌دهد:

کاتلین

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.
}
منابع بدون فعالیت را قبل‌از اینکه به آن‌ها نیاز داشته باشید ثبت کنید.

مزایای همگام‌سازی مرتبط با منابع بدون فعالیت فقط پس‌از اولین فراخوانی Espresso از روش isIdleNow() آن منبع اعمال می‌شود.

فهرست زیر چند نمونه از این ویژگی را نشان می‌دهد:

  • اگر منبع بدون فعالیتی را در روشی که با @Before حاشیه‌نویسی شده است ثبت کنید، منبع بدون فعالیت در خط اول هر آزمایش اعمال می‌شود.
  • اگر منبع بدون فعالیتی را در آزمایشی ثبت کنید، منبع بدون فعالیت درطول کنش بعدی مبتنی بر Espresso اعمال می‌شود. این رفتار همچنان رخ می‌دهد حتی اگر کنش بعدی در همان آزمایشی باشد که عبارت ثبت‌کننده منبع بدون فعالیت در آن قرار دارد.
پس‌از استفاده از منابع بدون فعالیت، ثبت آن‌ها را لغو کنید.

برای حفظ منابع سیستم، باید منابع بدون فعالیت را به‌محض اینکه دیگر به آن‌ها نیاز ندارید لغو ثبت‌نام کنید. برای مثال، اگر منبع بدون فعالیتی را در روشی که با @Before حاشیه‌نویسی شده است ثبت کنید، بهتر است این منبع را در روش متناظری که با @After حاشیه‌نویسی شده است لغو ثبت کنید.

از ثبت بدون فعالیت برای ثبت و لغو ثبت منابع بدون فعالیت استفاده کنید.

بااستفاده از این محفظه برای منابع بدون فعالیت برنامه‌تان، می‌توانید منابع بدون فعالیت را به‌طور مکرر درصورت نیاز ثبت و لغو ثبت کنید و همچنان رفتار ثابتی را مشاهده کنید.

فقط وضعیت برنامه ساده را در منابع بدون فعالیت حفظ کنید.

برای مثال، منابع بدون فعالیتی که پیاده‌سازی و ثبت می‌کنید نباید حاوی ارجاع به اشیای View باشند.

ثبت منابع بدون فعالیت

Espresso یک کلاس محفظه ارائه می‌دهد که می‌توانید منابع بدون فعالیت برنامه‌تان را در آن قرار دهید. این کلاس که IdlingRegistry نام دارد، یک ساخته مستقل است که حداقل سربار را به برنامه‌تان معرفی می‌کند. این کلاس همچنین به شما امکان می‌دهد مراحل زیر را برای بهبود قابلیت نگهداری برنامه‌تان انجام دهید:

  • در آزمایش‌های برنامه‌تان، به‌جای منابع بدون فعالیت موجود در ، به خود IdlingRegistry ارجاع دهید.
  • تفاوت‌ها را در مجموعه منابع بدون فعالیت که برای هر تنوع ساخت استفاده می‌کنید حفظ کنید.
  • منابع بدون فعالیت را در سرویس‌های برنامه‌تان تعریف کنید، نه در مؤلفه‌های میانای کاربری که به آن سرویس‌ها ارجاع می‌دهند.

ادغام کردن منابع بدون فعالیت در برنامه

اگرچه می‌توانید منابع بدون فعالیت را به چند روش مختلف به برنامه اضافه کنید، یک رویکرد به‌خصوص کپسوله‌سازی را برای برنامه شما حفظ می‌کند و درعین‌حال به شما امکان می‌دهد عملیات خاصی را که یک منبع بدون فعالیت معین نشان می‌دهد مشخص کنید.

هنگام افزودن منابع بدون فعالیت به برنامه، قویاً توصیه می‌کنیم منطق منبع بدون فعالیت را در خود برنامه قرار دهید و فقط عملیات ثبت‌نام و لغو ثبت‌نام را در آزمایش‌هایتان انجام دهید.

اگرچه با دنبال کردن این رویکرد، وضعیت غیرمعمول استفاده از میانای فقط آزمایشی را در کد تولید ایجاد می‌کنید، می‌توانید منابع بدون فعالیت را در اطراف کدی که قبلاً دارید بپیچید و اندازه APK و تعداد روش‌های برنامه‌تان را حفظ کنید.

رویکردهای جایگزین

اگر ترجیح می‌دهید منطق منابع بدون فعالیت را در کد تولید برنامه‌تان نداشته باشید، چندین راهبرد ادغام قابل‌اجرای دیگر وجود دارد:

  • تنوع ساخت ایجاد کنید، مثل نسخه‌های ویژه محصول Gradle، و از منابع بدون فعالیت فقط در ساخت اشکال‌زدایی برنامه‌تان استفاده کنید.
  • از چارچوب تزریق وابستگی مثل Dagger برای تزریق نمودار وابستگی منبع بدون فعالیت برنامه‌تان به آزمایش‌هایتان استفاده کنید. اگر از Dagger 2 استفاده می‌کنید، خود تزریق باید از یک زیرمؤلفه منشأ بگیرد.
  • یک منبع بدون فعالیت در آزمایش‌های برنامه‌تان پیاده‌سازی کنید و بخشی از پیاده‌سازی برنامه‌تان را که باید در آن آزمایش‌ها همگام‌سازی شود، آشکار کنید.

    احتیاط: اگرچه به‌نظر می‌رسد این تصمیم طراحی یک مرجع مستقل برای منابع بدون فعالیت ایجاد می‌کند، اما کپسوله‌سازی را در همه برنامه‌ها به‌جز ساده‌ترین آن‌ها می‌شکند.

منابع بیشتر

برای اطلاعات بیشتر درباره استفاده از Espresso در آزمایش‌های Android، به منابع زیر مراجعه کنید.

نمونه‌ها