Chrome এক্সটেনশন: পরিষেবা কর্মী সাসপেনশন পরীক্ষা করার জন্য চোখের যাত্রা৷

এটা কী সম্পর্কে?

ম্যানিফেস্ট V2 থেকে ম্যানিফেস্ট V3 তে রূপান্তর একটি মৌলিক পরিবর্তনের সাথে আসে। ম্যানিফেস্ট V2-এ, এক্সটেনশনগুলি একটি ব্যাকগ্রাউন্ড পেজে থাকত। ব্যাকগ্রাউন্ড পেজ এক্সটেনশন এবং ওয়েব পেজের মধ্যে যোগাযোগ পরিচালনা করে। ম্যানিফেস্ট V3 পরিবর্তে পরিষেবা কর্মীদের ব্যবহার করে।

এই পোস্টে, আমরা এক্সটেনশন পরিষেবা কর্মীদের পরীক্ষার সমস্যা নিয়ে আলোচনা করি। বিশেষ করে, একজন পরিষেবা কর্মী সাসপেন্ড হওয়ার ক্ষেত্রে আমাদের পণ্য সঠিকভাবে কাজ করে কিনা তা আমরা কীভাবে নিশ্চিত করব তা দেখে নিই।

আমরা কারা?

eyeo হল ব্যবহারকারী, ব্রাউজার, বিজ্ঞাপনদাতা এবং প্রকাশকদের জন্য একটি সুষম এবং টেকসই অনলাইন মূল্য বিনিময় ক্ষমতায়নের জন্য নিবেদিত একটি কোম্পানি৷ আমাদের 300 মিলিয়নেরও বেশি বিশ্বব্যাপী বিজ্ঞাপন-ফিল্টারিং ব্যবহারকারী রয়েছে যারা গ্রহণযোগ্য বিজ্ঞাপন প্রদর্শনের অনুমতি দেয়, একটি স্বাধীনভাবে প্রাপ্ত বিজ্ঞাপন মান যা নির্ধারণ করে যে একটি বিজ্ঞাপন গ্রহণযোগ্য এবং অ-অনুপ্রবেশকারী কিনা।

আমাদের এক্সটেনশন ইঞ্জিন টিম বিজ্ঞাপন-ফিল্টারিং প্রযুক্তি সরবরাহ করে যা বিশ্বব্যাপী 110 মিলিয়নেরও বেশি ব্যবহারকারীর সাথে AdBlock এবং Adblock Plus এর মতো বাজারে কিছু জনপ্রিয় বিজ্ঞাপন-ব্লকিং ব্রাউজার এক্সটেনশনগুলিকে শক্তি দেয়৷ উপরন্তু, আমরা এই প্রযুক্তিটিকে একটি ওপেন-সোর্স লাইব্রেরি হিসাবে অফার করি, এটিকে অন্যান্য বিজ্ঞাপন-ফিল্টারিং ব্রাউজার এক্সটেনশনগুলিতে উপলব্ধ করে।

একটি সেবা কর্মী কি?

এক্সটেনশন পরিষেবা কর্মীরা ব্রাউজার এক্সটেনশনের কেন্দ্রীয় ইভেন্ট হ্যান্ডলার। তারা পটভূমিতে স্বাধীনভাবে চালায়। বিস্তৃতভাবে এই ভাল. নতুন সার্ভিস ওয়ার্কারে ব্যাকগ্রাউন্ড পেজে যা করতে হবে তার বেশিরভাগই আমরা করতে পারি। কিন্তু ব্যাকগ্রাউন্ড পেজের তুলনায় কিছু পরিবর্তন আছে:

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

সেবা কর্মীদের কখন সাসপেন্ড করা হয়?

Chrome 119-এর জন্য, আমরা যা অনুভব করেছি তা হল পরিষেবা কর্মীদের সাসপেন্ড করা হয়েছে:

  • 30 সেকেন্ডের জন্য ইভেন্ট বা কলিং এক্সটেনশন API গুলি না পাওয়ার পরে৷
  • বিকাশকারী সরঞ্জামগুলি খোলা থাকলে বা আপনি একটি ChromeDriver ভিত্তিক টেস্টিং লাইব্রেরি ব্যবহার করলে কখনই নয় ( বৈশিষ্ট্য অনুরোধ দেখুন )।
  • আপনি chrome://serviceworker-internals এ Stop এ ক্লিক করলে।

আরও সাম্প্রতিক তথ্যের জন্য সার্ভিস ওয়ার্কার্স লাইফসাইকেল দেখুন।

কেন এই পরীক্ষা একটি সমস্যা?

আদর্শভাবে, "কীভাবে একটি দক্ষ উপায়ে পরিষেবা কর্মীদের পরীক্ষা করা যায়" বা কাজের পরীক্ষার উদাহরণ সম্পর্কে অফিসিয়াল নির্দেশিকা থাকলে এটি কার্যকর হবে। পরিসেবা কর্মীদের পরীক্ষা করার আমাদের দুঃসাহসিক কাজের সময়, আমরা কয়েকটি চ্যালেঞ্জের সম্মুখীন হয়েছিলাম:

  • আমরা আমাদের পরীক্ষা এক্সটেনশন রাজ্য আছে. যখন পরিষেবা কর্মী থেমে যায়, তখন আমরা তার অবস্থা এবং নিবন্ধিত ইভেন্টগুলি হারাই। কীভাবে আমরা আমাদের পরীক্ষার প্রবাহে ডেটা বজায় রাখব?
  • পরিষেবা কর্মীদের যে কোনও সময়ে স্থগিত করা যেতে পারে, আমাদের পরীক্ষা করতে হবে যে সমস্ত বৈশিষ্ট্যগুলি বাধাগ্রস্ত হলে কাজ করে।
  • এমনকি যদি আমরা আমাদের পরীক্ষায় এমন একটি প্রক্রিয়া চালু করি যা এলোমেলোভাবে পরিষেবা কর্মীদের সাসপেন্ড করে, ব্রাউজারে এটিকে সহজে সাসপেন্ড করার জন্য কোনো API নেই। আমরা W3C টিমকে এই বৈশিষ্ট্যটি যোগ করতে বলেছি , কিন্তু এটি একটি চলমান কথোপকথন।

টেস্টিং সার্ভিস কর্মী সাসপেনশন

আমরা পরীক্ষার সময় পরিষেবা কর্মী সাসপেনশন ট্রিগার করার জন্য বিভিন্ন পদ্ধতির চেষ্টা করেছি:

এপ্রোচ পদ্ধতির সাথে সমস্যা
একটি নির্বিচারে সময় অপেক্ষা করুন (উদাহরণস্বরূপ 30 সেকেন্ড) এটি পরীক্ষাকে ধীর এবং অবিশ্বস্ত করে তোলে, বিশেষ করে যখন একাধিক পরীক্ষা চালানো হয়। WebDriver ব্যবহার করার সময় এটি কাজ করে না, যেহেতু WebDriver Chrome-এর DevTools API ব্যবহার করে এবং DevTools খোলা থাকলে পরিষেবা কর্মীকে সাসপেন্ড করা হয় না। এমনকি যদি আমরা এটিকে বাইপাস করতে পারি, তবুও পরিষেবা কর্মীকে সাসপেন্ড করা হয়েছে কিনা তা আমাদের পরীক্ষা করতে হবে এবং আমাদের কাছে এটি করার কোনও উপায় নেই।
পরিষেবা কর্মী একটি অসীম লুপ চালান বৈশিষ্ট অনুসারে, ব্রাউজার কীভাবে এই কার্যকারিতা প্রয়োগ করে তার উপর নির্ভর করে এটি সমাপ্তির দিকে পরিচালিত করতে পারে। Chrome এই ক্ষেত্রে পরিষেবা কর্মীকে শেষ করে না তাই পরিষেবা কর্মীকে সাসপেন্ড করা হলে আমরা পরিস্থিতি পরীক্ষা করতে পারি না৷
এটি স্থগিত করা হয়েছে কিনা তা পরীক্ষা করার জন্য পরিষেবা কর্মীতে একটি বার্তা থাকা একটি বার্তা পাঠানো পরিষেবা কর্মীকে জাগিয়ে তোলে। এটি পরিষেবা কর্মী ঘুমিয়ে ছিল কিনা তা পরীক্ষা করার জন্য ব্যবহার করা যেতে পারে, তবে এটি পরীক্ষার ফলাফলগুলিকে ভেঙে দেয় যা পরিষেবা কর্মীকে স্থগিত করার সাথে সাথে চেক করতে হবে৷
chrome.processes.terminate() ব্যবহার করে পরিষেবা কর্মী প্রক্রিয়াটিকে হত্যা করুন এক্সটেনশনের জন্য পরিষেবা কর্মী এক্সটেনশনের অন্যান্য অংশগুলির সাথে একটি প্রক্রিয়া ভাগ করে, তাই chrome.process.terminate() বা Chrome-এর প্রক্রিয়া পরিচালক GUI ব্যবহার করে এই প্রক্রিয়াটিকে মেরে ফেলা শুধুমাত্র পরিষেবা কর্মীকেই নয়, যেকোনো এক্সটেনশন পৃষ্ঠাকেও হত্যা করে৷

আমরা একটি পরীক্ষা দিয়ে শেষ করেছি যা সেলেনিয়াম ওয়েবড্রাইভার খোলা chrome://serviceworker-internals/ এবং পরিষেবা কর্মীর জন্য "স্টপ" বোতামে ক্লিক করার মাধ্যমে স্থগিত হওয়া পরিষেবা কর্মীকে আমাদের কোড কীভাবে প্রতিক্রিয়া জানায় তা পরীক্ষা করে।

এটি এখন পর্যন্ত সর্বোত্তম বিকল্প, কিন্তু এটি আদর্শ নয় কারণ আমাদের মোচা পরীক্ষাগুলি (যা একটি এক্সটেনশন পৃষ্ঠায় চলে) এটি নিজে করতে পারে না, তাই তাদের আমাদের ওয়েবড্রাইভার নোড প্রোগ্রামে আবার যোগাযোগ করতে হবে। এর মানে হল যে এই পরীক্ষাগুলি শুধুমাত্র এক্সটেনশন ব্যবহার করে চালানো যাবে না; সেলেনিয়াম ওয়েবড্রাইভার ব্যবহার করে তাদের ট্রিগার করতে হবে।

আমরা কীভাবে ব্রাউজার API-এর সাথে বিভিন্ন প্রবাহের মাধ্যমে যোগাযোগ করি এবং কীভাবে "সাসপেন্ডিং সার্ভিস ওয়ার্কার" মেকানিজম যুক্ত করা এটিকে প্রভাবিত করে তার একটি চিত্র এখানে রয়েছে৷

ডায়াগ্রাম পরীক্ষার প্রবাহ দেখাচ্ছে
পরিষেবা কর্মী সাসপেনশন সহ পরীক্ষা প্রবাহ।

একটি নতুন প্রবাহে যা পরিষেবা কর্মীদের স্থগিত করে (নীল), আমরা UI এর মাধ্যমে সাসপেন্ড করার জন্য Selenium WebDriver যোগ করেছি, যা ব্রাউজার API-এ একটি অ্যাকশন ট্রিগার করে।

এটি উল্লেখ করার মতো যে একটি Chrome বাগ ছিল যেখানে Selenium WebDriver এর সাথে এটি করার ফলে পরিষেবা কর্মী আবার শুরু করতে অক্ষম হয়েছে৷ এটি Chrome 116-এ ঠিক করা হয়েছে এবং সৌভাগ্যবশত, একটি সমাধানও রয়েছে: প্রতিটি ট্যাবে স্বয়ংক্রিয়ভাবে DevTools খুলতে Chrome সেট করা পরিষেবা কর্মীকে সঠিকভাবে শুরু করে।

এই পদ্ধতিটি আমরা পরীক্ষা করার সময় ব্যবহার করছি যদিও এটি আদর্শ নয় কারণ বোতামটি ক্লিক করা একটি স্থিতিশীল API নাও হতে পারে এবং DevTools (পুরনো ব্রাউজারগুলির জন্য) খোলার একটি কার্যক্ষমতা খরচ আছে বলে মনে হয়।

কিভাবে আমরা পুরো কার্যকারিতা কভার করব? ফাজ টেস্ট

একবার সাসপেনশন পরীক্ষা করার জন্য আমাদের একটি ব্যবস্থা ছিল, আমাদের অটোমেশন টেস্ট স্যুটগুলিতে কীভাবে এটি প্লাগ করতে হবে তা আমাদের সিদ্ধান্ত নিতে হয়েছিল। আমরা এমন পরিবেশে আমাদের স্ট্যান্ডার্ড পরীক্ষা চালিয়েছি যেখানে ব্যাকগ্রাউন্ড পৃষ্ঠার সাথে প্রতিটি ইন্টারঅ্যাকশনের আগে, chrome://serviceworker-internals/ পৃষ্ঠায় Stop- এ ক্লিক করে WebDriver দ্বারা পরিষেবা কর্মীকে সাসপেন্ড করা হয়

একটি নমুনা ফাজ টেস্ট এক্সিকিউশন রান
ইমেজ পরীক্ষার বর্তমান সেটআপ উপস্থাপন.

আমরা বেশিরভাগ পরীক্ষা করি এবং সব পরীক্ষা করি না কারণ সাসপেনশন মেকানিজম সম্পূর্ণরূপে স্থিতিশীল নয় এবং কখনও কখনও এটি অস্থিরতা সৃষ্টি করে। এছাড়াও, সমস্ত টেস্ট স্যুট ফাজ মোডে চালানোর জন্য অনেক সময় লাগে। সুতরাং, সমস্ত "অনুরূপ" কেস কভার করার পরিবর্তে, আমরা ফাজ মোডে পরীক্ষার জন্য সবচেয়ে গুরুত্বপূর্ণ পথ বেছে নিয়েছি। এটি উল্লেখ করার মতো যে "ফাজ" মোডে কার্যকরী পরীক্ষা চালানোর অর্থ আমাদের পরীক্ষার সময়সীমা বাড়াতে হয়েছিল কারণ পরিষেবা কর্মীদের স্থগিত এবং পুনরায় চালু করতে অতিরিক্ত সময় লাগে।

এই পরীক্ষাগুলি একটি মোটা-দানাযুক্ত প্রথম পাস হিসাবে মূল্যবান, যা অনেক জায়গা হাইলাইট করে যেখানে কোডটি ব্যর্থ হয়, কিন্তু পরিষেবা কর্মী সাসপেনশন জিনিসগুলিকে ভেঙে ফেলতে পারে এমন সমস্ত সূক্ষ্ম উপায়গুলি অগত্যা উন্মোচন করতে পারে না৷

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

সারসংক্ষেপ

পরিষেবা কর্মীরা ম্যানিফেস্ট V3-এর সবচেয়ে বড় পরিবর্তনগুলির মধ্যে একটি (ঘোষণামূলক নেট রিকোয়েস্ট নিয়মগুলি ছাড়াও)। ম্যানিফেস্ট V3-এ মাইগ্রেশনের জন্য ব্রাউজার এক্সটেনশনে অনেক কোড পরিবর্তন এবং পরীক্ষার জন্য নতুন পদ্ধতির প্রয়োজন হতে পারে। এটি অবিরাম অবস্থা সহ এক্সটেনশনগুলির বিকাশকারীদেরকে তাদের এক্সটেনশনগুলিকে একটি সুন্দর উপায়ে অপ্রত্যাশিত পরিষেবা কর্মী সাসপেনশন পরিচালনা করার জন্য প্রস্তুত করতে হবে৷

দুর্ভাগ্যবশত, আমাদের ব্যবহারের ক্ষেত্রে ফিট করে এমন সহজ উপায়ে সাসপেনশন পরিচালনা করার জন্য কোনো API নেই। যেহেতু আমরা প্রাথমিক পর্যায়ে সাসপেনশন মেকানিজমের বিরুদ্ধে আমাদের এক্সটেনশনের কোডবেসের দৃঢ়তা পরীক্ষা করতে চেয়েছিলাম, তাই আমাদের এটিকে ঘিরে কাজ করতে হয়েছিল। অন্যান্য এক্সটেনশন ডেভেলপাররা যারা একই ধরনের চ্যালেঞ্জের সম্মুখীন হয় তারা এই কাজটি ব্যবহার করতে পারে, যা উন্নয়ন এবং রক্ষণাবেক্ষণের পর্যায়ে সময় সাপেক্ষ হলেও এটি মূল্যবান তাই আমরা নিশ্চিত করতে পারি যে আমাদের এক্সটেনশনগুলি এমন পরিবেশে সফলভাবে কাজ করতে পারে যেখানে পরিষেবা কর্মীদের নিয়মিত স্থগিত করা হয়।

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