ক্রোম এক্সটেনশানগুলি কীভাবে পরীক্ষা করবেন?


154

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


8
আমি কেবল একটি ক্যানোনিকাল উত্তর লিখেছি যা কেবলমাত্র ক্রোম নয়, সমস্ত ব্রাউজার জুড়ে ব্রাউজার এক্সটেনশনের ইউনিট টেস্টিং এবং ইন্টিগ্রেশন টেস্টিংয়ের ঠিকানা দেয় । "ব্রাউজারের এক্সটেনশানগুলির পরীক্ষা করা" এর উত্তর দেখুন ।
রব ডব্লু

উত্তর:


111

হ্যাঁ, বিদ্যমান ফ্রেমওয়ার্কগুলি বেশ কার্যকর ..

সাম্প্রতিক অতীতে, আমি আমার সমস্ত পরীক্ষাগুলি একটি "পরীক্ষার" পৃষ্ঠায় রেখেছি যা অ্যাপ্লিকেশনটিতে এম্বেড করা হয়েছিল তবে শারীরিকভাবে টাইপ না করা সম্ভব না।

উদাহরণস্বরূপ, আমার কাছে কোনও পৃষ্ঠাতে সমস্ত টেস্টগুলি অ্যাক্সেসযোগ্য হবে have chrome-extension://asdasdasdasdad/unittests.html

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

আপনি যদি পৃষ্ঠাগুলি সরাসরি পরীক্ষা করতে চান তবে আপনি নিজের এক্সটেনশানটিকে নতুন ট্যাবগুলি খুলতে (ক্রোম.tab.create ({"url": "someurl"}) অর্কেস্টেট করতে পারেন the নতুন ট্যাবগুলির প্রত্যেকটির জন্য আপনার সামগ্রী স্ক্রিপ্টটি চালানো উচিত এবং আপনি ব্যবহার করতে পারেন আপনার কোডটি কী করা উচিত তা যাচাই করার জন্য আপনার পরীক্ষার কাঠামো।

ফ্রেমওয়ার্ক হিসাবে, JsUnit বা আরও সাম্প্রতিক জুঁই ভাল কাজ করা উচিত।


1
আপনি ঠিক বলেছেন, আসল পৃষ্ঠাগুলি পরীক্ষা করা ইউনিট পরীক্ষার অধীনে আসে না। আমার প্রশ্নটি আরও বিস্তৃত করা উচিত ছিল। তবে এটি এখনও আমি পরীক্ষা করতে চাই এমন কিছু, বিশেষত যেহেতু ওয়েবসাইটের এইচটিএমএল কাঠামো যে কোনও সময় পরিবর্তিত হতে পারে। আমি প্রশ্নটি পরিবর্তন করেছি।
শে

1
আমি এখনও আপনার ইউনিট পরীক্ষা পৃষ্ঠাতে আইফ্রেমগুলির মাধ্যমে পরীক্ষা করব। কনটেন্ট স্ক্রিপ্টগুলিতে এখনও গুলি চালানো উচিত (যদি আপনি স্ক্রিপ্টগুলি
আইফ্রেমে

3
প্রক্সি নমুনা এক্সটেনশনের কিছু পরীক্ষা রয়েছে যা ক্রোম এপিআইগুলির বিট এবং টুকরোগুলি কেবল উপহাস করে ফেলেছে: code.google.com/chrome/exferencessssss.html#chrome.proxy .. এছাড়াও আমাদের সহকর্মী বরিস পরীক্ষার জন্য কুইনাইট ব্যবহার করেছেন তার "মডেল" স্তর: github.com/borismus/Quetion-Monitor-for-Stack-Exchange/tree/…
পল আইরিশ

63

বিভিন্ন Chrome এক্সটেনশানগুলি কাজ করছেন আমি নিয়ে এসেছেন sinon-chromeপ্রকল্পের যে ইউনিট-পরীক্ষার ব্যবহার চালাতে সক্ষম mocha, nodejsএবং phantomjs

মূলত, এটি সমস্ত chrome.*API এর সিনন মক তৈরি করে যেখানে আপনি কোনও পূর্বনির্ধারিত জসন প্রতিক্রিয়া রাখতে পারেন।

এরপরে, আপনি vm.runInNewContextব্যাকগ্রাউন্ড পৃষ্ঠার জন্য নোড ব্যবহার করে এবং phantomjsপপআপ / বিকল্প পৃষ্ঠা রেন্ডার করার জন্য আপনার স্ক্রিপ্টগুলি লোড করুন।

এবং অবশেষে, আপনি দৃsert়ভাবে দাবি করেন যে ক্রোম এপিআইকে প্রয়োজনীয় যুক্তি দিয়ে ডাকা হয়েছিল।

আসুন একটি উদাহরণ
নিই : ধরুন আমাদের কাছে সহজ ক্রোম এক্সটেনশন রয়েছে যা বোতামের ব্যাজে খোলা ট্যাবগুলির সংখ্যা প্রদর্শন করে।

পটভূমি পৃষ্ঠা:

chrome.tabs.query({}, function(tabs) {
  chrome.browserAction.setBadgeText({text: String(tabs.length)});
});

এটি পরীক্ষা করার জন্য আমাদের প্রয়োজন:

  1. chrome.tabs.queryপূর্বনির্ধারিত প্রতিক্রিয়া, উদাহরণস্বরূপ দুটি ট্যাব ফেরানোর জন্য মক করুন ।
  2. chrome.*কিছুটা পরিবেশে আমাদের উপহাস এপিআই ইনজেক্ট করুন
  3. এই পরিবেশে আমাদের এক্সটেনশন কোড চালান
  4. বোতাম ব্যাজটি '2' এর সমান

কোড স্নিপেট নিম্নলিখিত:

const vm = require('vm');
const fs = require('fs');
const chrome = require('sinon-chrome');

// 1. mock `chrome.tabs.query` to return predefined response 
chrome.tabs.query.yields([
  {id: 1, title: 'Tab 1'}, 
  {id: 2, title: 'Tab 2'}
]);

// 2. inject our mocked chrome.* api into some environment
const context = {
  chrome: chrome
};

// 3. run our extension code in this environment
const code = fs.readFileSync('src/background.js');
vm.runInNewContext(code, context);

// 4. assert that button badge equals to '2'
sinon.assert.calledOnce(chrome.browserAction.setBadgeText);
sinon.assert.calledWithMatch(chrome.browserAction.setBadgeText, {
  text: "2"
});

এখন আমরা এটি মোচার describe..itফাংশনগুলিতে মোড়তে পারি এবং টার্মিনাল থেকে চালাতে পারি:

$ mocha

background page
  ✓ should display opened tabs count in button badge

1 passing (98ms)

আপনি এখানে পুরো উদাহরণ খুঁজে পেতে পারেন ।

অতিরিক্তভাবে, সিনোন-ক্রোম পূর্বনির্ধারিত প্রতিক্রিয়া সহ যে কোনও ক্রোম ইভেন্টকে ট্রিগার করতে দেয়

chrome.tab.onCreated.trigger({url: 'http://google.com'});

উদাহরণস্বরূপ লিঙ্কটি মারা গেছে বলে মনে হচ্ছে - আপনি এটি আপডেট করতে পারেন?
Raisen

1
উদাহরণে আপডেট হওয়া লিঙ্ক। এছাড়াও সিনন-ক্রোম এখন github.com/acvetkov এ স্থানান্তরিত হয়েছে এবং শীঘ্রই নতুন উদাহরণ আসবে
ভিটলেটস

3

sinon.jsদুর্দান্ত কাজ করার মতো মনে হচ্ছে, আপনি কেবল প্লেইন জুঁই ব্যবহার করতে পারেন এবং আপনার প্রয়োজনীয় ক্রোম কলব্যাকগুলি উপহাস করতে পারেন। উদাহরণ:

উপহাস

chrome = {
  runtime: {
    onMessage : {
      addListener : function() {}
    }
  }
}

পরীক্ষা

describe("JSGuardian", function() {

  describe("BlockCache", function() {

    beforeEach(function() {
      this.blockCache = new BlockCache();
    });

    it("should recognize added urls", function() {
      this.blockCache.add("http://some.url");
      expect(this.blockCache.allow("http://some.url")).toBe(false);
    });
} // ... etc

SpecRunner.htmlআপনার কোড চালানোর জন্য কেবলমাত্র ডিফল্টটি পরিবর্তন করুন ।


2

ক্রোমে ইতিমধ্যে বিদ্যমান সরঞ্জাম সম্পর্কে:

  1. ক্রোম বিকাশকারী সরঞ্জামে, স্থানীয় সঞ্চয়স্থানের জন্য সংস্থানসমূহের বিভাগ রয়েছে।

    বিকাশকারী সরঞ্জামসমূহ> সংস্থানসমূহ> স্থানীয় সঞ্চয়স্থান

    সেখানে লোকাল স্টোরেজের পরিবর্তনগুলি দেখুন।

  2. পারফরম্যান্স পরীক্ষা করতে এবং রান টাইম কল স্ট্যাক দেখতে আপনি কনসোল.প্রফাইল ব্যবহার করতে পারেন।

  3. ফাইল-সিস্টেমের জন্য আপনি এই ফাইলটি ফাইল আপলোড-এড কিনা তা পরীক্ষা করতে ব্যবহার করতে পারেন: ফাইল সিস্টেম: ক্রোম-এক্সটেনশন: /// অস্থায়ী /

যদি আপনি ব্যাকগ্রাউন্ড পৃষ্ঠা / স্ক্রিপ্ট ছাড়াই এবং বার্তা পাস না করে একসাথে সামগ্রী স্ক্রিপ্ট এবং স্থানীয়-সঞ্চয়স্থান ব্যবহার করেন তবে লোকাল-স্টোরেজ কেবল সেই সাইট থেকে অ্যাক্সেসযোগ্য হবে। সুতরাং, এই পৃষ্ঠাগুলি পরীক্ষা করতে, আপনাকে সেই পরীক্ষাগুলিতে আপনার টেস্ট স্ক্রিপ্টটি ইনজেক্ট করতে হবে।


1
আমার পক্ষে কাজ করেনি, তবে এটি আমার জাভাস্ক্রিপ্টে আমাকে আরও পেয়েছে। তার জন্য +1।
মুবিবব

ফাইলসিস্টেমের জন্য আপনি ব্যবহার করতে পারেন: ফাইল সিস্টেম: ক্রোম-এক্সটেনশন: // <yourextension-id> / অস্থায়ী /
নাফিস আহমেদ

1

আমি দেখতে পেয়েছি যে আমি প্রিলইনস্টলযুক্ত এক্সটেনশান সহ নতুন ব্রাউজারের উদাহরণ শুরু করার জন্য সেলেনিয়াম ওয়েব ড্রাইভার এবং ক্লিকগুলির জন্য পিয়াটোগুই ব্যবহার করতে পারি - কারণ সেলেনিয়াম এক্সটেনশনের "ভিউ" চালাতে পারে না। ক্লিকগুলির পরে আপনি স্ক্রিনশট তৈরি করতে পারেন এবং 95% মিলের প্রত্যাশা করে 'প্রত্যাশিত'গুলির সাথে তাদের তুলনা করতে পারেন (কারণ বিভিন্ন ব্রাউজারগুলিতে এটি কয়েকটি পিক্সেলের কাছে গ্রহণযোগ্য মার্কআপ মুভমেন্ট)।


0

পূর্ববর্তী কয়েকটি উত্তর নিশ্চিত করতে, জুঁই Chrome ক্রম এক্সটেনশনের সাথে ভাল কাজ করেছে বলে মনে হচ্ছে। আমি সংস্করণ 3.4.0 ব্যবহার করছি।

আপনি বিভিন্ন এপিআইয়ের জন্য সহজেই পরীক্ষার দ্বৈত তৈরি করতে জেসমিন স্পাই ব্যবহার করতে পারেন । স্ক্র্যাচ থেকে আপনার নিজের তৈরি করার দরকার নেই। উদাহরণ স্বরূপ:

describe("Test suite", function() {

  it("Test case", function() {

    // Set up spies and fake data.
    spyOn(chrome.browserAction, "setPopup");
    spyOn(chrome.identity, "removeCachedAuthToken");
    fakeToken = "faketoken-faketoken-faketoken";
    fakeWindow = jasmine.createSpyObj("window", ["close"]);

    // Call the function under test.
    logout(fakeWindow, fakeToken);

    // Perform assertions.
    expect(chrome.browserAction.setPopup).toHaveBeenCalledWith({popup: ""});
    expect(chrome.identity.removeCachedAuthToken).toHaveBeenCalledWith({token: fakeToken});
    expect(fakeWindow.close.calls.count()).toEqual(1);

  });

});

আরও কিছু বিশদ, যদি এটি সাহায্য করে:

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

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

কমান্ড লাইনে কীভাবে আমার পরীক্ষা চালানো যায় সেদিকে আমি তাকাতে পারিনি। এটি স্বয়ংক্রিয় স্থাপনার সরঞ্জামগুলির জন্য কার্যকর হবে।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.