এসপ্রেসো অলস সম্পদ

একটি অলস সংস্থান একটি অ্যাসিঙ্ক্রোনাস অপারেশনকে প্রতিনিধিত্ব করে যার ফলাফলগুলি একটি UI পরীক্ষার পরবর্তী ক্রিয়াকলাপগুলিকে প্রভাবিত করে৷ এসপ্রেসোর সাথে অলস সংস্থানগুলি নিবন্ধন করে, আপনি আপনার অ্যাপ পরীক্ষা করার সময় এই অ্যাসিঙ্ক্রোনাস ক্রিয়াকলাপগুলিকে আরও নির্ভরযোগ্যভাবে যাচাই করতে পারেন৷

অলস সম্পদের প্রয়োজন হলে সনাক্ত করুন

এসপ্রেসো সিঙ্ক্রোনাইজেশন ক্ষমতার একটি পরিশীলিত সেট প্রদান করে। ফ্রেমওয়ার্কের এই বৈশিষ্ট্যটি, তবে, শুধুমাত্র সেই ক্রিয়াকলাপের ক্ষেত্রে প্রযোজ্য যা MessageQueue তে বার্তা পোস্ট করে, যেমন View এর একটি সাবক্লাস যা পর্দায় এর বিষয়বস্তু আঁকছে।

যেহেতু এসপ্রেসো অন্য কোনো অ্যাসিঙ্ক্রোনাস ক্রিয়াকলাপ সম্পর্কে সচেতন নয়, যেগুলি ব্যাকগ্রাউন্ড থ্রেডে চলছে সেগুলি সহ, এসপ্রেসো সেই পরিস্থিতিতে তার সিঙ্ক্রোনাইজেশন গ্যারান্টি প্রদান করতে পারে না। এসপ্রেসোকে আপনার অ্যাপের দীর্ঘ-চলমান ক্রিয়াকলাপ সম্পর্কে সচেতন করতে, আপনাকে অবশ্যই প্রতিটিকে একটি অলস সম্পদ হিসাবে নিবন্ধন করতে হবে।

আপনি যদি আপনার অ্যাপের অ্যাসিঙ্ক্রোনাস কাজের ফলাফল পরীক্ষা করার সময় অলস সংস্থানগুলি ব্যবহার না করেন, তাহলে আপনার পরীক্ষার নির্ভরযোগ্যতা উন্নত করতে আপনাকে নিম্নলিখিত খারাপ সমাধানগুলির মধ্যে একটি ব্যবহার করতে হতে পারে:

  • Thread.sleep() এ কল যোগ করা হচ্ছে। আপনি যখন আপনার পরীক্ষাগুলিতে কৃত্রিম বিলম্ব যোগ করেন, তখন আপনার পরীক্ষা স্যুটটি কার্যকর করা শেষ হতে বেশি সময় নেয় এবং ধীরগতির ডিভাইসগুলিতে চালানো হলে আপনার পরীক্ষাগুলি কখনও কখনও ব্যর্থ হতে পারে। উপরন্তু, এই বিলম্বগুলি ভালভাবে পরিমাপ করে না, কারণ আপনার অ্যাপকে ভবিষ্যতে রিলিজে আরও বেশি সময়-সাপেক্ষ অ্যাসিঙ্ক্রোনাস কাজ করতে হতে পারে।
  • পুনঃপ্রচারের র‍্যাপারগুলি বাস্তবায়ন করা, যা একটি টাইমআউট না হওয়া পর্যন্ত আপনার অ্যাপটি এখনও অ্যাসিঙ্ক্রোনাস কাজ করছে কিনা তা বারবার পরীক্ষা করতে একটি লুপ ব্যবহার করে৷ এমনকি যদি আপনি আপনার পরীক্ষায় সর্বোচ্চ পুনঃপ্রচেষ্টা গণনা উল্লেখ করেন, প্রতিটি পুনঃ-নির্বাহে সিস্টেম সংস্থান, বিশেষ করে CPU খরচ হয়।
  • CountDownLatch এর দৃষ্টান্ত ব্যবহার করে, যা এক বা একাধিক থ্রেডকে অপেক্ষা করার অনুমতি দেয় যতক্ষণ না অন্য থ্রেডে একটি নির্দিষ্ট সংখ্যক ক্রিয়াকলাপ সম্পাদিত হয় সম্পূর্ণ হয়। এই বস্তুগুলির জন্য আপনাকে একটি সময়সীমার দৈর্ঘ্য নির্দিষ্ট করতে হবে; অন্যথায়, আপনার অ্যাপ অনির্দিষ্টকালের জন্য ব্লক করা হতে পারে। ল্যাচগুলি আপনার কোডে অপ্রয়োজনীয় জটিলতা যোগ করে, রক্ষণাবেক্ষণকে আরও কঠিন করে তোলে।

Espresso আপনাকে আপনার পরীক্ষাগুলি থেকে এই অবিশ্বাস্য সমাধানগুলি সরাতে এবং পরিবর্তে আপনার অ্যাপের অ্যাসিঙ্ক্রোনাস কাজটিকে অলস সংস্থান হিসাবে নিবন্ধিত করার অনুমতি দেয়৷

সাধারণ ব্যবহারের ক্ষেত্রে

আপনার পরীক্ষায় নিম্নলিখিত উদাহরণগুলির মতো ক্রিয়াকলাপগুলি সম্পাদন করার সময়, একটি অলস সংস্থান ব্যবহার করার কথা বিবেচনা করুন:

  • ইন্টারনেট বা স্থানীয় ডেটা উৎস থেকে ডেটা লোড করা হচ্ছে
  • ডাটাবেস এবং কলব্যাকের সাথে সংযোগ স্থাপন করা
  • পরিষেবাগুলি পরিচালনা করা , হয় একটি সিস্টেম পরিষেবা বা IntentService এর একটি উদাহরণ ব্যবহার করে৷
  • বিটম্যাপ রূপান্তরের মতো জটিল ব্যবসায়িক যুক্তি সম্পাদন করা

যখন এই ক্রিয়াকলাপগুলি একটি UI আপডেট করে যা আপনার পরীক্ষাগুলি যাচাই করে তখন নিষ্ক্রিয় সংস্থানগুলি নিবন্ধন করা বিশেষত গুরুত্বপূর্ণ৷

অলস সম্পদ বাস্তবায়নের উদাহরণ

নিম্নোক্ত তালিকাটি অলস সংস্থানগুলির বেশ কয়েকটি উদাহরণ বাস্তবায়নের বর্ণনা করে যা আপনি আপনার অ্যাপে সংহত করতে পারেন:

CountingIdlingResource
সক্রিয় কাজের একটি কাউন্টার বজায় রাখে। যখন কাউন্টারটি শূন্য হয়, তখন সংশ্লিষ্ট সংস্থানটি নিষ্ক্রিয় বলে বিবেচিত হয়। এই কার্যকারিতা একটি Semaphore এর সাথে ঘনিষ্ঠভাবে সাদৃশ্যপূর্ণ। বেশিরভাগ ক্ষেত্রে, পরীক্ষার সময় আপনার অ্যাপের অ্যাসিঙ্ক্রোনাস কাজ পরিচালনা করার জন্য এই বাস্তবায়ন যথেষ্ট।
UriIdlingResource
CountingIdlingResource এর মতই, কিন্তু রিসোর্সটিকে নিষ্ক্রিয় বলে বিবেচনা করার আগে একটি নির্দিষ্ট সময়ের জন্য কাউন্টারটি শূন্য হতে হবে। এই অতিরিক্ত অপেক্ষার সময়টি পরপর নেটওয়ার্ক অনুরোধগুলিকে বিবেচনায় নেয়, যেখানে আপনার থ্রেডের একটি অ্যাপ পূর্ববর্তী অনুরোধের প্রতিক্রিয়া পাওয়ার সাথে সাথে একটি নতুন অনুরোধ করতে পারে।
IdlingThreadPoolExecutor
ThreadPoolExecutor এর একটি কাস্টম বাস্তবায়ন যা তৈরি করা থ্রেড পুলের মধ্যে চলমান কাজের মোট সংখ্যার ট্র্যাক রাখে। সক্রিয় কাজের কাউন্টার বজায় রাখতে এই শ্রেণীটি একটি CountingIdlingResource ব্যবহার করে।
IdlingScheduledThreadPoolExecutor
ScheduledThreadPoolExecutor এর একটি কাস্টম বাস্তবায়ন। এটি IdlingThreadPoolExecutor ক্লাসের মতো একই কার্যকারিতা এবং ক্ষমতা প্রদান করে, তবে এটি ভবিষ্যতের জন্য নির্ধারিত বা পর্যায়ক্রমিকভাবে চালানোর জন্য নির্ধারিত কাজের ট্র্যাকও রাখতে পারে।

আপনার নিজের অলস সম্পদ তৈরি করুন

আপনি আপনার অ্যাপের পরীক্ষায় অলস সংস্থানগুলি ব্যবহার করার কারণে, আপনাকে কাস্টম সংস্থান পরিচালনা বা লগিং প্রদান করতে হতে পারে। এই ক্ষেত্রে, পূর্ববর্তী বিভাগে তালিকাভুক্ত বাস্তবায়ন যথেষ্ট নাও হতে পারে। যদি তা হয়, আপনি এই অলস সংস্থান বাস্তবায়নের একটি প্রসারিত করতে পারেন বা নিজের তৈরি করতে পারেন।

আপনি যদি নিজের অলস রিসোর্স কার্যকারিতা বাস্তবায়ন করেন, তাহলে নিম্নলিখিত সেরা অনুশীলনগুলি মনে রাখবেন, বিশেষ করে প্রথমটি:

নিষ্ক্রিয় চেকের বাইরে নিষ্ক্রিয় অবস্থায় ট্রানজিশন আহ্বান করুন।
আপনার অ্যাপটি নিষ্ক্রিয় হয়ে যাওয়ার পরে, isIdleNow() এর যেকোনো বাস্তবায়নের বাইরে onTransitionToIdle() কল করুন। এইভাবে, প্রদত্ত অলস সংস্থান নিষ্ক্রিয় কিনা তা নির্ধারণ করতে 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.
}
আপনার প্রয়োজনের আগে অলস সংস্থানগুলি নিবন্ধন করুন৷

নিষ্ক্রিয় সংস্থানগুলির সাথে যুক্ত সিঙ্ক্রোনাইজেশন সুবিধাগুলি শুধুমাত্র এসপ্রেসোর সেই সংস্থানের isIdleNow() পদ্ধতির প্রথম আহ্বানের পরে কার্যকর হয়৷

নিম্নলিখিত তালিকা এই সম্পত্তির বেশ কয়েকটি উদাহরণ দেখায়:

  • আপনি যদি @Before এর সাথে টীকাযুক্ত একটি পদ্ধতিতে একটি নিষ্ক্রিয় সংস্থান নিবন্ধন করেন, তাহলে নিষ্ক্রিয় সংস্থানটি প্রতিটি পরীক্ষার প্রথম লাইনে কার্যকর হয়।
  • আপনি যদি একটি পরীক্ষার মধ্যে একটি নিষ্ক্রিয় সংস্থান নিবন্ধন করেন, তাহলে নিষ্ক্রিয় সংস্থানটি পরবর্তী এসপ্রেসো-ভিত্তিক কর্মের সময় কার্যকর হয়৷ এই আচরণ এখনও ঘটবে এমনকি যদি পরবর্তী ক্রিয়াটি নিষ্ক্রিয় সংস্থান নিবন্ধনকারী বিবৃতিটির মতো একই পরীক্ষায় থাকে।
অলস সংস্থানগুলি ব্যবহার করার পরে নিবন্ধনমুক্ত করুন৷

সিস্টেম রিসোর্স সংরক্ষণ করার জন্য, আপনার আর প্রয়োজন না হওয়ার সাথে সাথে আপনার নিষ্ক্রিয় সংস্থানগুলিকে নিবন্ধনমুক্ত করা উচিত। উদাহরণস্বরূপ, আপনি যদি @Before এর সাথে টীকাযুক্ত একটি পদ্ধতিতে একটি নিষ্ক্রিয় সম্পদ নিবন্ধন করেন, তাহলে @After এর সাথে টীকাযুক্ত একটি সংশ্লিষ্ট পদ্ধতিতে এই সংস্থানটি নিবন্ধনমুক্ত করা ভাল।

অলস সংস্থান নিবন্ধন এবং নিবন্ধনমুক্ত করতে একটি অলস রেজিস্ট্রি ব্যবহার করুন।

আপনার অ্যাপের নিষ্ক্রিয় সংস্থানগুলির জন্য এই ধারকটি ব্যবহার করে, আপনি প্রয়োজন অনুসারে বারবার নিষ্ক্রিয় সংস্থানগুলি নিবন্ধন এবং অনিবন্ধিত করতে পারেন এবং এখনও সামঞ্জস্যপূর্ণ আচরণ পর্যবেক্ষণ করতে পারেন৷

নিষ্ক্রিয় সংস্থানগুলির মধ্যে শুধুমাত্র সাধারণ অ্যাপের অবস্থা বজায় রাখুন।

উদাহরণস্বরূপ, আপনি যে অলস সংস্থানগুলি প্রয়োগ করেন এবং নিবন্ধন করেন তাতে বস্তু View রেফারেন্স থাকা উচিত নয়।

অলস সম্পদ নিবন্ধন

Espresso একটি কন্টেইনার ক্লাস প্রদান করে যেখানে আপনি আপনার অ্যাপের অলস রিসোর্স রাখতে পারেন। IdlingRegistry নামে পরিচিত এই শ্রেণীটি হল একটি স্বয়ংসম্পূর্ণ আর্টিফ্যাক্ট যা আপনার অ্যাপে ন্যূনতম ওভারহেডের পরিচয় দেয়৷ ক্লাসটি আপনাকে আপনার অ্যাপের রক্ষণাবেক্ষণযোগ্যতা উন্নত করার জন্য নিম্নলিখিত পদক্ষেপগুলি গ্রহণ করার অনুমতি দেয়:

  • আপনার অ্যাপের পরীক্ষায় এটিতে থাকা অলস সংস্থানগুলির পরিবর্তে IdlingRegistry এর একটি রেফারেন্স তৈরি করুন৷
  • আপনি প্রতিটি বিল্ড ভেরিয়েন্টের জন্য ব্যবহার করেন এমন নিষ্ক্রিয় সম্পদের সংগ্রহে পার্থক্য বজায় রাখুন।
  • সেই পরিষেবাগুলিকে উল্লেখ করে এমন UI উপাদানগুলির পরিবর্তে আপনার অ্যাপের পরিষেবাগুলিতে অলস সংস্থানগুলিকে সংজ্ঞায়িত করুন৷

আপনার অ্যাপে অলস সংস্থানগুলিকে একীভূত করুন৷

যদিও আপনি বিভিন্ন উপায়ে একটি অ্যাপে অলস রিসোর্স যোগ করতে পারেন, একটি পদ্ধতি বিশেষ করে আপনার অ্যাপের জন্য এনক্যাপসুলেশন বজায় রাখে এবং এখনও আপনাকে একটি নির্দিষ্ট ক্রিয়াকলাপ নির্দিষ্ট করার অনুমতি দেয় যা একটি প্রদত্ত অলস সংস্থান প্রতিনিধিত্ব করে।

আপনার অ্যাপে অলস রিসোর্স যোগ করার সময়, আমরা অ্যাপে অলস রিসোর্স লজিক রাখার এবং আপনার পরীক্ষায় শুধুমাত্র রেজিস্ট্রেশন এবং আনরেজিস্ট্রেশন অপারেশন করার সুপারিশ করি।

যদিও আপনি এই পদ্ধতি অনুসরণ করে প্রোডাকশন কোডে শুধুমাত্র পরীক্ষা-নিরীক্ষার ইন্টারফেস ব্যবহার করার অস্বাভাবিক পরিস্থিতি তৈরি করেন, আপনি আপনার অ্যাপের APK আকার এবং পদ্ধতির গণনা বজায় রেখে আপনার ইতিমধ্যেই থাকা কোডের চারপাশে অলস সংস্থানগুলি মোড়ানো করতে পারেন।

বিকল্প পন্থা

আপনি যদি আপনার অ্যাপের প্রোডাকশন কোডে অলস রিসোর্স লজিক না রাখতে পছন্দ করেন, তাহলে আরও বেশ কিছু কার্যকরী ইন্টিগ্রেশন কৌশল রয়েছে:

  • বিল্ড ভেরিয়েন্ট তৈরি করুন, যেমন Gradle এর পণ্যের স্বাদ , এবং শুধুমাত্র আপনার অ্যাপের ডিবাগ বিল্ডে অলস সম্পদ ব্যবহার করুন।
  • আপনার পরীক্ষায় আপনার অ্যাপের অলস রিসোর্স নির্ভরতা গ্রাফটি ইনজেক্ট করতে ড্যাগারের মতো একটি নির্ভরতা ইনজেকশন ফ্রেমওয়ার্ক ব্যবহার করুন। আপনি যদি ড্যাগার 2 ব্যবহার করেন তবে ইনজেকশনটি নিজেই একটি সাবকম্পোনেন্ট থেকে উদ্ভূত হওয়া উচিত।
  • আপনার অ্যাপের পরীক্ষায় একটি অলস সংস্থান প্রয়োগ করুন এবং আপনার অ্যাপের বাস্তবায়নের অংশটি প্রকাশ করুন যা সেই পরীক্ষাগুলিতে সিঙ্ক্রোনাইজ করা প্রয়োজন।

    সতর্কতা: যদিও এই ডিজাইনের সিদ্ধান্তটি নিষ্ক্রিয় সংস্থানগুলির একটি স্বয়ংসম্পূর্ণ রেফারেন্স তৈরি করে বলে মনে হচ্ছে, তবে এটি সহজতম অ্যাপগুলি ব্যতীত সমস্ত ক্ষেত্রে এনক্যাপসুলেশনকে ভেঙে দেয়।

অতিরিক্ত সম্পদ

অ্যান্ড্রয়েড পরীক্ষায় এসপ্রেসো ব্যবহার সম্পর্কে আরও তথ্যের জন্য, নিম্নলিখিত সংস্থানগুলি দেখুন৷

নমুনা

  • IdlingResourceSample : ব্যাকগ্রাউন্ড কাজের সাথে সিঙ্ক্রোনাইজেশন।