Chrome एक्सटेंशन के लिए एंड-टू-एंड टेस्टिंग

शुरू से अंत तक के टेस्ट में एक एक्सटेंशन पैकेज शामिल होता है, जो ब्राउज़र में बनाया और लोड किया जाता है. टेस्टिंग टूल, ब्राउज़र के साथ इंटरैक्ट करके, इंटरैक्शन को ऑटोमेट करता है. साथ ही, उन फ़्लो की जांच करता है जिनसे होकर उपयोगकर्ता गुज़रता है. आम तौर पर, एंड-टू-एंड टेस्टिंग की सुविधा वाली लाइब्रेरी, ब्राउज़र को कंट्रोल करने, उपयोगकर्ता के इनपुट देने, और खुले हुए किसी भी पेज की मौजूदा स्थिति पर नज़र रखने के तरीके उपलब्ध कराती है.

ट्यूटोरियल के लिए, Puppeteer के साथ Chrome एक्सटेंशन की जांच और Chrome एक्सटेंशन के लिए यूनिट टेस्ट लिखने से जुड़ी जानकारी के लिए यूनिट टेस्टिंग देखें.

ब्राउज़र टेस्टिंग लाइब्रेरी का इस्तेमाल करना

एक्सटेंशन, कई तरह की टेस्टिंग लाइब्रेरी पर काम करते हैं.

लाइब्रेरी दिशा-निर्देश
कठपुतली / नाटककार Chrome एक्सटेंशन (Puppeteer / Playwright) देखें.
सीलीनियम एक्सटेंशन लोड करने के लिए, ChromeOptions ऑब्जेक्ट का इस्तेमाल करें. ज़्यादा जानकारी यहां उपलब्ध है.
WebDriverIO वेब एक्सटेंशन की टेस्टिंग देखें.

बिना ग्राफ़िक यूज़र इंटरफ़ेस वाले Chrome में टेस्ट चलाना

ऑटोमेटेड वर्कफ़्लो के तहत टेस्ट करते समय, अक्सर ऐसी मशीन पर एक्सटेंशन लोड करना ज़रूरी होता है जिसमें स्क्रीन न हो. Chrome के बिना ग्राफ़िक यूज़र इंटरफ़ेस वाले नए मोड की मदद से, Chrome को इस तरह के माहौल में चलाया जा सकता है. --headless=new फ़्लैग का इस्तेमाल करके Chrome को शुरू करें (फ़िलहाल, बिना ग्राफ़िक यूज़र इंटरफ़ेस के "पुराना", डिफ़ॉल्ट रूप से "पुराना" पर सेट होता है, जो एक्सटेंशन लोड करने की सुविधा के साथ काम नहीं करता). ऑटोमेशन की सुविधा वाले आपके चुने गए टूल के आधार पर, ऐसी सेटिंग मौजूद हो सकती है जिससे आपके लिए फ़्लैग अपने-आप जुड़ जाए.

एक्सटेंशन आईडी सेट करना

अक्सर जांच में एक तय एक्सटेंशन आईडी होना चाहिए. इससे कई सामान्य काम आसान हो जाते हैं, जैसे कि एक्सटेंशन के ऑरिजिन को उस सर्वर पर अनुमति देना जिसके साथ उसे काम करना होता है या टेस्ट में एक्सटेंशन पेज खोलना. ऐसा करने के लिए, एक जैसा एक्सटेंशन आईडी बनाए रखना में दिया गया तरीका अपनाएं.

एक्सटेंशन पेजों का टेस्ट करना

एक्सटेंशन पेजों को उनसे जुड़े यूआरएल, जैसे कि chrome-extension://<id>/index.html का इस्तेमाल करके ऐक्सेस किया जा सकता है. इन यूआरएल पर जाने के लिए, अपने ऑटोमेशन टूल में मौजूद नेविगेशन के सामान्य तरीकों का इस्तेमाल करें.

एक्सटेंशन पॉप-अप की जांच करना

फ़िलहाल, किसी दूसरे पेज के संदर्भ में एक्सटेंशन पॉप-अप नहीं खोला जा सकता. इसके बजाय, पॉप-अप का यूआरएल नए टैब में खोलें. अगर आपका पॉप-अप ऐक्टिव टैब का इस्तेमाल करता है, तो एक बदलाव लागू करें, जहां टैब आईडी को साफ़ तौर पर आपके पॉप-अप पर भेजा जा सके. उदाहरण के लिए:

const URL_PARAMS  = new URLSearchParams(window.location.search);

async function getActiveTab() {
  // Open popup.html?tab=5 to use tab ID 5, etc.
  if (URL_PARAMS.has("tab")) {
    return parseInt(URL_PARAMS.get("tab"));
  }

  const tabs = await chrome.tabs.query({
    active: true,
    currentWindow: true
  });

  return tabs[0];
}

एक्सटेंशन की स्थिति की जांच की जा रही है

आम तौर पर, इंटिग्रेशन टेस्ट में इंटरनल स्टेटस को ऐक्सेस करने से बचना सबसे सही तरीका होता है. इससे, एक्सटेंशन के अंदरूनी व्यवहार में बदलाव होने पर, टेस्ट में पास होने वाली गड़बड़ियों से बचा जा सकता है. इसके बजाय, आपको अपने टेस्ट को इस आधार पर बनाना चाहिए कि उपयोगकर्ता को क्या दिख रहा है. हालांकि, कभी-कभी एक्सटेंशन से सीधे डेटा ऐक्सेस करना ज़रूरी हो सकता है. इन मामलों में, किसी एक्सटेंशन पेज के हिसाब से कोड को एक्ज़ीक्यूट करने के बारे में सोचें.

पपीटीयर में:

const workerTarget = await browser.waitForTarget(
  target => target.type() === 'service_worker'
);
const worker = await workerTarget.worker();

const value = await worker.evaluate(() => {
  chrome.storage.local.get('foo');
});

सीलीनियम में:

// Selenium doesn't allow us to access the service worker, so we need to open an extension page where we can execute the code
await driver.get('chrome-extension://<id>/popup.html');
await driver.executeAsyncScript(
  'const callback = arguments[arguments.length - 1];' +
  'chrome.storage.local.get(\'foo\').then(callback);'
);

सर्विस वर्कर बंद किए जाने की जांच की जा रही है

सर्विस वर्कर समाप्ति के बारे में जानने के लिए, Puppeteer के साथ सेवा वर्कर के खत्म होने की जांच देखें. हमारे पास पपीटीयर और सीलीनियम का सैंपल भी है.

ध्यान दें कि कुछ टेस्टिंग फ़्रेमवर्क का इस्तेमाल करते समय, हो सकता है कि सर्विस वर्कर अपने-आप बंद न हो पाएं, जैसे कि सामान्य इस्तेमाल में होते हैं. ऐसा सीलीनियम में होता है. यह ChromeDriver पर निर्भर करता है, जो सभी सर्विस वर्कर को डीबगर से जोड़ता है, जो उन्हें रोके जाने से रोकता है.