यह किस बारे में है?
मेनिफ़ेस्ट V2 से मेनिफ़ेस्ट V3 पर ट्रांज़िशन के दौरान, काफ़ी बदलाव आया है. मेनिफ़ेस्ट V2 में, एक्सटेंशन बैकग्राउंड पेज में रहते थे. पृष्ठभूमि पेजों ने एक्सटेंशन और वेब पेजों के बीच संपर्क को मैनेज किया है. इसके बजाय, Manifest V3 सर्विस वर्कर इस्तेमाल करता है.
इस पोस्ट में, हमने एक्सटेंशन सर्विस वर्कर की टेस्टिंग की समस्या का समाधान किया. खास तौर पर, हम यह देखते हैं कि सर्विस वर्कर के निलंबित होने पर हमारा प्रॉडक्ट सही तरीके से काम करता है या नहीं.
हम कौन हैं?
IEo एक ऐसी कंपनी है जिसका मकसद उपयोगकर्ताओं, ब्राउज़र, विज्ञापन देने वालों, और पब्लिशर के लिए, संतुलित और लंबे समय तक चलने वाले ऑनलाइन वैल्यू एक्सचेंज को बढ़ावा देना है. दुनिया भर में, विज्ञापन फ़िल्टर करने वाले 30 करोड़ से ज़्यादा उपयोगकर्ता हैं. ये स्वीकार किए जाने वाले विज्ञापनों को दिखाने की अनुमति देते हैं. स्वीकार किए जाने वाले विज्ञापन, स्वतंत्र रूप से बनाए गए विज्ञापन के स्टैंडर्ड हैं. इससे यह तय होता है कि कोई विज्ञापन स्वीकार किया जाएगा या नहीं, लेकिन उसमें दखल नहीं देना पड़ेगा.
एक्सटेंशन इंजन की हमारी टीम, विज्ञापन फ़िल्टर करने की टेक्नोलॉजी उपलब्ध कराती है. यह टेक्नोलॉजी, विज्ञापन रोकने वाले सबसे लोकप्रिय ब्राउज़र एक्सटेंशन में से कुछ को काम करती है. जैसे, AdBlock और Adblock Plus. इसके उपयोगकर्ताओं को दुनिया भर में 11 करोड़ से ज़्यादा उपयोगकर्ता मिलते हैं. साथ ही, हम यह टेक्नोलॉजी एक ओपन-सोर्स लाइब्रेरी के तौर पर देते हैं जिससे यह विज्ञापन-फ़िल्टर करने वाले दूसरे ब्राउज़र एक्सटेंशन में भी उपलब्ध हो जाती है.
सर्विस वर्कर क्या है?
एक्सटेंशन सर्विस वर्कर, ब्राउज़र एक्सटेंशन के मुख्य इवेंट हैंडलर हैं. ये बैकग्राउंड में अलग-अलग काम करते हैं. मोटे तौर पर यह सही है. हम नए सर्विस वर्कर में बैकग्राउंड पेज पर किए जा सकने वाले ज़्यादातर काम कर सकते हैं. लेकिन बैकग्राउंड पेजों की तुलना में कुछ बदलाव होते हैं:
- सर्विस वर्कर इस्तेमाल में न होने पर खत्म कर देते हैं. इसके लिए हमें ग्लोबल वैरिएबल पर भरोसा करने के बजाय, ऐप्लिकेशन की स्थिति को बनाए रखना ज़रूरी है. इसका मतलब है कि सिस्टम शुरू होने से पहले, हमारे सिस्टम के किसी भी एंट्री पॉइंट को कॉल करने के लिए तैयार रखा जाना चाहिए.
- किसी भी एक साथ काम नहीं करने वाले कॉलबैक का इंतज़ार करने से पहले, इवेंट लिसनर को अटैच करना ज़रूरी है. निलंबित सर्विस वर्कर, अब भी उन इवेंट को पा सकते हैं जिनकी उसने सदस्यता ली हुई है. अगर इवेंट लूप के पहले मोड़ में इवेंट के लिए लिसनर रजिस्टर नहीं है, तो सर्विस वर्कर को जगाने पर, उस इवेंट को इवेंट नहीं मिलेगा.
- डिवाइस कुछ समय से इस्तेमाल न किए जाने पर, टाइमर पूरा होने से पहले ही टाइमर को बीच में रोका जा सकता है.
सर्विस वर्कर को कब निलंबित किया जाता है?
Chrome 119 के लिए, हमने देखा कि सर्विस वर्कर निलंबित कर दिए गए हैं:
- 30 सेकंड तक इवेंट या कॉल एक्सटेंशन एपीआई न मिलने के बाद.
- अगर डेवलपर टूल खुले हुए हैं या आपने ChromeDriver पर आधारित टेस्टिंग लाइब्रेरी का इस्तेमाल किया है, तो कभी भी ऐसा न करें. सुविधा का अनुरोध देखें.
- अगर आपने chrome://serviceworker-internals में बंद करें पर क्लिक किया है.
हाल ही की जानकारी के लिए, सर्विस वर्कर लाइफ़साइकल देखें.
इसकी जांच करना एक समस्या क्यों है?
सही तरीका यह होता कि “सेवा देने वाले कर्मचारियों की अच्छी तरह से जांच करने का तरीका” या काम करने वाले टेस्ट के उदाहरणों पर आधिकारिक दिशा-निर्देश होना मददगार होता. सर्विस वर्कर के परीक्षण के दौरान, हमें कुछ चुनौतियों का सामना करना पड़ा:
- हमारे टेस्ट एक्सटेंशन में स्थिति है. सर्विस वर्कर के रुक जाने पर, हम इसकी स्थिति और रजिस्टर किए गए इवेंट खो देते हैं. हम अपने टेस्टिंग फ़्लो में डेटा को कैसे बनाए रखेंगे?
- अगर सर्विस वर्कर को किसी भी समय निलंबित किया जा सकता है, तो हमें यह जांच करनी होगी कि सभी सुविधाएं काम करने में रुकावट आने पर काम करेंगी.
- भले ही हम अपने परीक्षणों में सेवा कर्मियों को रैंडम तरीके से निलंबित करने वाला कोई तरीका लागू करें, लेकिन ब्राउज़र में इसे आसानी से निलंबित करने वाला कोई एपीआई मौजूद नहीं है. हमने इस सुविधा को जोड़ने के लिए W3C टीम से कहा है, लेकिन यह बातचीत अभी जारी है.
टेस्टिंग सर्विस वर्कर का निलंबन
हमने जांच के दौरान सर्विस वर्कर के निलंबन को ट्रिगर करने के लिए कई तरीके आज़माए हैं:
अप्रोच | इस तरीके से जुड़ी समस्याएं |
अपने हिसाब से तय समय तक इंतज़ार करें, जैसे कि 30 सेकंड | इससे, टेस्टिंग धीरे और भरोसेमंद नहीं होती. खास तौर पर, जब कई बार टेस्ट किए जा रहे हों. WebDriver का इस्तेमाल करने पर यह काम नहीं करता है, क्योंकि WebDriver Chrome के DevTools API का इस्तेमाल करता है. DevTools खुले होने पर सर्विस वर्कर निलंबित नहीं होता. अगर हम इसे बायपास कर पाते, तो भी हमें यह देखना होता कि सर्विस वर्कर को निलंबित किया गया या नहीं. हमारे पास ऐसा करने का कोई तरीका नहीं है. |
सर्विस वर्कर में इनफ़ाइनाइट लूप चलाना | निर्देश के मुताबिक, ब्राउज़र इस फ़ंक्शन को कैसे लागू करता है, इस आधार पर खाता बंद किया जा सकता है. इस मामले में Chrome, सर्विस वर्कर को खत्म नहीं करता है, इसलिए हम सर्विस वर्कर के निलंबित होने पर उस स्थिति की जांच नहीं कर सकते. |
सर्विस वर्कर में मैसेज होना कि वह निलंबित तो नहीं हो गया | मैसेज भेजने से सर्विस वर्कर सक्रिय हो जाता है. इसका इस्तेमाल यह देखने के लिए किया जा सकता है कि सर्विस वर्कर स्लीप मोड पर था या नहीं. हालांकि, इससे उन टेस्ट के नतीजों पर असर पड़ सकता है जिनके लिए सर्विस वर्कर को निलंबित करने के तुरंत बाद जांच की ज़रूरत होती है. |
chrome.Processes.terminate() का इस्तेमाल करके सर्विस वर्कर प्रोसेस को बंद करना | एक्सटेंशन का सर्विस वर्कर, एक्सटेंशन के अन्य हिस्सों के साथ एक प्रोसेस शेयर करता है, इसलिए chrome.Process.terminate() या Chrome के प्रोसेस मैनेजर GUI का इस्तेमाल करके इस प्रोसेस को खत्म करने से न सिर्फ़ सर्विस वर्कर, बल्कि सभी एक्सटेंशन पेज भी खत्म हो जाते हैं. |
हमने एक जांच की है, जिसमें यह जांच की गई है कि हमारा कोड, सर्विस वर्कर के निलंबित होने पर कैसे प्रतिक्रिया देता है. ऐसा करने के लिए, Selenium WebDriver को chrome://serviceworker-internals/ पर खोला गया है और सर्विस वर्कर के लिए "बंद करें" बटन पर क्लिक किया गया है.
यह अब तक का सबसे अच्छा विकल्प है. हालांकि, इसे बेहतर नहीं माना जा सकता, क्योंकि हमारे मोका टेस्ट (जो एक्सटेंशन पेज पर चलते हैं) खुद ऐसा नहीं कर सकते. इसलिए, उन्हें हमारे WebDriver नोड प्रोग्राम से संपर्क करना होगा. इसका मतलब है कि ये टेस्ट, सिर्फ़ एक्सटेंशन का इस्तेमाल करके नहीं चलाए जा सकते. इन्हें Seleenium WebDriver का इस्तेमाल करके ट्रिगर किया जाना चाहिए.
यहां एक डायग्राम दिखाया गया है, जिसमें बताया गया है कि हम अलग-अलग फ़्लो के ज़रिए ब्राउज़र एपीआई से कैसे संपर्क करते हैं और "सस्पेंडिंग सर्विस वर्कर" को जोड़ने से उस पर क्या असर पड़ता है.
![टेस्ट फ़्लो की जानकारी देने वाला डायग्राम](https://developer.chrome.com/static/blog/eyeos-journey-to-testing-mv3-service worker-suspension/image/testing-flow.png?authuser=7&hl=hi)
सर्विस वर्कर (नीले रंग) को निलंबित करने वाले नए फ़्लो में, हमने Selenium WebDriver को यूज़र इंटरफ़ेस (यूआई) के ज़रिए "क्लिक" निलंबित करने के लिए जोड़ा है. इससे ब्राउज़र एपीआई में कोई कार्रवाई ट्रिगर होती है.
यह बताना ज़रूरी है कि एक Chrome गड़बड़ी आई थी, जिसमें Selenium WebDriver के साथ ऐसा करने की वजह से, सर्विस वर्कर फिर से शुरू नहीं हो पाया. यह गड़बड़ी Chrome 116 में ठीक कर दी गई थी. अच्छी बात यह है कि इसका एक समाधान भी है: Chrome को हर टैब पर अपने-आप DevTools खोलने पर सेट करने से, सर्विस वर्कर सही तरीके से शुरू होता है.
टेस्टिंग के दौरान हम इसी तरीके का इस्तेमाल कर रहे हैं. हालांकि, यह सही नहीं है, क्योंकि हो सकता है बटन पर क्लिक करना एक स्थायी एपीआई न हो. साथ ही, DevTools (पुराने ब्राउज़र के लिए) खोलने पर, परफ़ॉर्मेंस की लागत लगती है.
हम पूरे फ़ंक्शन को कैसे कवर करते हैं? फ़ज़ टेस्ट
निलंबन की जांच करने के बाद, हमें यह तय करना पड़ा कि इसे अपने ऑटोमेशन टेस्ट सुइट में कैसे प्लग-इन किया जाए. हमने स्टैंडर्ड टेस्ट ऐसे एनवायरमेंट में किए हैं जहां बैकग्राउंड पेज के साथ हर इंटरैक्शन से पहले, सर्विस वर्कर को निलंबित कर दिया जाता है. WebDriver, chrome://serviceworker-internals/ पेज पर बंद करें पर क्लिक करता है.
![फ़ज़ टेस्ट चलाने के लिए सैंपल](https://developer.chrome.com/static/blog/eyeos-journey-to-testing-mv3-service worker-suspension/image/test-run.png?authuser=7&hl=hi)
निलंबन की प्रक्रिया पूरी तरह से स्थिर नहीं होती है. इस वजह से, हम ज़्यादातर टेस्ट करते हैं, न कि सभी टेस्ट. साथ ही, सभी टेस्ट सुइट को फ़ज़ मोड में चलाने में बहुत समय लगता है. इसलिए, सभी "एक जैसे" केस को कवर करने के बजाय, हमने फ़ज़ मोड में टेस्टिंग के लिए सबसे ज़रूरी पाथ को चुना. यह बताना ज़रूरी है कि "फ़ज़" मोड में फ़ंक्शनल टेस्ट चलाने का मतलब है कि हमें टेस्ट के टाइम आउट बढ़ाने पड़े, क्योंकि सर्विस वर्कर को निलंबित और रीस्टार्ट करने में ज़्यादा समय लगता है.
ये टेस्ट एक मामूली फ़र्स्ट पास की तरह काम करते हैं, जो ऐसी कई जगहों को हाइलाइट करते हैं जहां कोड काम नहीं करता, लेकिन हो सकता है कि यह ज़रूरी नहीं कि सर्विस वर्कर के निलंबन की वजह से काम में रुकावटें आ सकती हैं.
अंदरूनी तौर पर, इस तरह के टेस्ट को हम "फ़ज़ टेस्ट" कहते हैं. आम तौर पर, फ़ज़ टेस्टिंग तब होती है, जब प्रोग्राम में अमान्य इनपुट डाला जाता है और पक्का किया जाता है कि वह सही तरीके से काम करे या कम से कम क्रैश न हो. हमारे मामले में, "अमान्य इनपुट" का मतलब है कि सर्विस वर्कर को किसी भी समय निलंबित किया जा सकता है. साथ ही, "सही व्यवहार" के मामले में, हम उम्मीद करते हैं कि विज्ञापन फ़िल्टर करने की हमारी सुविधा पहले की तरह काम करती रहे. यह इनपुट बिलकुल अमान्य नहीं है, क्योंकि मेनिफ़ेस्ट V3 में इस तरह का व्यवहार उम्मीद के मुताबिक है. हालांकि, यह मेनिफ़ेस्ट V2 में अमान्य होता. इसलिए, इसमें इस्तेमाल के लिए सही शब्दों का इस्तेमाल किया गया.
खास जानकारी
सर्विस वर्कर, मेनिफ़ेस्ट V3 में सबसे बड़े बदलावों में से एक है. यह declarativeNetRequest नियमों के अलावा होता है. मेनिफ़ेस्ट V3 पर माइग्रेट करने के लिए, ब्राउज़र एक्सटेंशन में कई कोड में बदलाव करने पड़ सकते हैं. साथ ही, टेस्टिंग के नए तरीकों की ज़रूरत पड़ सकती है. इसके अलावा, स्थायी स्थिति वाले एक्सटेंशन के डेवलपर को भी अपने एक्सटेंशन तैयार करना होगा, ताकि सर्विस वर्कर के असामान्य निलंबन को अच्छी तरह से मैनेज किया जा सके.
माफ़ करें, निलंबन को आसानी से मैनेज करने के लिए ऐसा कोई एपीआई नहीं है जो हमारे इस्तेमाल के उदाहरण के लिए सही हो. हम शुरुआती चरण में ही, निलंबन के तरीकों के ख़िलाफ़ अपने एक्सटेंशन के कोडबेस की मज़बूती की जांच करना चाहते थे. इसलिए, हमें इस पर काम करना पड़ा. इसी तरह की चुनौतियों का सामना करने वाले अन्य एक्सटेंशन डेवलपर इस तरीके का इस्तेमाल कर सकते हैं. हालांकि, इसके डेवलपमेंट और रखरखाव के चरण में काफ़ी समय लगता है. इससे हम यह पक्का कर सकते हैं कि हमारे एक्सटेंशन उस माहौल में सफलतापूर्वक काम कर सकें जिसमें सेवा कर्मियों को नियमित रूप से निलंबित किया जाता है.
हालांकि, पहले से ही टेस्टिंग सर्विस वर्कर के निलंबन के लिए बुनियादी सहायता उपलब्ध है, लेकिन एक्सटेंशन से ही टेस्टिंग सर्विस वर्कर के लिए, प्लैटफ़ॉर्म पर बेहतर सहायता मिलती है. हम आने वाले समय में ऐसा करना चाहते हैं, क्योंकि इससे टेस्ट लागू होने में लगने वाले समय और रखरखाव में काफ़ी कमी आ सकती है.