Як перевірити хромовані розширення?


154

Чи є хороший спосіб це зробити? Я пишу розширення, яке взаємодіє з веб-сайтом як скрипт вмісту і зберігає дані за допомогою localstorage. Чи є інструменти, рамки тощо, які я можу використовувати для перевірки такої поведінки? Я розумію, що є кілька загальних інструментів для тестування JavaScript, але чи достатньо потужностей для тестування розширення? Тестування одиниць є найважливішим, але мене також цікавлять інші типи тестування (наприклад, тестування інтеграції).


8
Я щойно написав канонічну відповідь, яка стосується тестування блоку та тестування інтеграції для розширень браузера у всіх браузерах, а не лише у Chrome. Дивіться відповідь "Тестування розширень браузера" .
Роб Ш

Відповіді:


111

Так, існуючі рамки досить корисні ..

В недавньому минулому я розмістив усі свої тести на "тестовій" сторінці, яка була вбудована в додаток, але недоступна, якщо не введено фізично.

Наприклад, я б провів усі тести на сторінці, доступній під chrome-extension://asdasdasdasdad/unittests.html

Тести мали б доступ до localStorageт. Д. Для доступу до скриптів вмісту, теоретично, ви можете перевірити, що через вбудовані IFRAME на вашій тестовій сторінці, однак це більше тестування рівня інтеграції, одиничні тести вимагають, щоб ви абстрагували це від реальних сторінок, щоб ви не залежать від них, як і доступ до localStorage.

Якщо ви хочете перевірити сторінки безпосередньо, ви можете оркеструвати розширення, щоб відкрити нові вкладки (chrome.tab.create ({"url": "someurl"}). Для кожної з нових вкладок має працювати сценарій вмісту, і ви можете використовувати його ваша тестувальна рамка, щоб перевірити, чи ваш код зробив те, що повинен зробити.

Що стосується рамок, JsUnit або новіша Жасмін повинна працювати добре.


1
Ви маєте рацію, тестування реальних сторінок не підпадає під одиничне тестування. Я мав би зробити своє питання більш широким. Але це все-таки те, що я хотів би перевірити, тим більше, що структура HTML-сайту може змінитися в будь-який час. Я змінив питання.
swampsjohn

1
Я б ще протестував через IFrames на тестовій сторінці вашого блоку. Сценарії вмісту все ще повинні спрацьовувати (якщо ви дозволите запуск сценаріїв в iFrame)
Kinlan

3
Розширення зразка проксі має кілька тестів, які просто знущаються з бітів та фрагментів API Chrome, які були необхідні: code.google.com/chrome/extensions/samples.html#chrome.proxy .. Також наш колега Борис використовував QUnit для тестування його "модельний" шар: github.com/borismus/Question-Monitor-for-Stack-Exchange/tree/…
Пол Ірландський

63

Працюючи над декількома хромованими розширеннями, я придумав sinon-chromeпроект, який дозволяє запускати одиничні тести за допомогою mocha, nodejsта phantomjs.

В основному, це створює синонімічні макети з усіх chrome.*API, де ви можете розмістити будь-які заздалегідь задані відповіді json.

Далі ви завантажуєте свої сценарії за допомогою вузла vm.runInNewContextдля фонової сторінки та phantomjsдля сторінки спливаючих вікон / параметрів візуалізації.

І нарешті, ви стверджуєте, що хромовану апі викликали потрібними аргументами.

Візьмемо приклад.
Припустимо, у нас є просте розширення з хромом, яке відображає кількість відкритих вкладок у значку кнопок.

фонова сторінка:

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

Для його тестування нам потрібно:

  1. макет chrome.tabs.queryдля повернення попередньо визначеної відповіді, наприклад, дві вкладки.
  2. ввести наші знущаються chrome.*api в якесь середовище
  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 і запустити з терміналу:

$ mocha

background page
  ✓ should display opened tabs count in button badge

1 passing (98ms)

Ви можете знайти повний приклад тут .

Крім того, син-хром дозволяє викликати будь-яку хромову подію із заздалегідь заданою реакцією, наприклад

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

Посилання на приклад, здається, мертве - ви можете оновити його?
Raisen

1
Оновлено посилання на приклад. Також sinon-chrome тепер переміщений на github.com/acvetkov, і незабаром з’являться нові приклади
vitalets

3

Хоча, sinon.jsздається, працює чудово, ви також можете просто використовувати звичайний Жасмін і глузувати зворотні зворотні дзвінки Chrome. Приклад:

Знущаються

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

Про вже наявний інструмент у Chrome:

  1. У інструменті розробника для хромування є розділ Resources For local storage.

    Інструменти для розробників> Ресурси> Місцеве зберігання

    Подивіться зміни місцевого зберігання там.

  2. Ви можете використовувати console.profile для перевірки продуктивності та перегляду стеку викликів часу виконання.

  3. для fileSystem Ви можете скористатися цією URL-адресою, щоб перевірити, чи ваш файл завантажено чи ні: файлова система: chrome-extension: /// тимчасовий /

Якщо ви використовуєте скрипт вмісту та локальне зберігання разом без фонової сторінки / сценарію та без передачі повідомлення, локальне зберігання буде доступне лише з цього сайту. Отже, щоб перевірити ці сторінки, вам слід ввести свій тестовий скрипт у ці вкладки.


1
Це не працювало для мене, але все-таки дістало мене далі в моєму JavaScript. +1 для цього.
mobibob

Для fileSystem Ви можете використовувати: fileystem: chrome-extension: // <yourextension-id> / тимчасовий /
Nafis Ahmad

1

Я виявив, що я можу використовувати веб-драйвер Selenium для запуску свіжого екземпляра браузера із попередньо встановленим розширенням та pyautogui для кліків - тому що Selenium не може керувати "переглядом" розширення. Після натискань ви можете зробити знімки екрана та порівняти їх із «очікуваними», очікуючи 95% подібності (адже в різних браузерах прийнятні рухи розмітки до кількох пікселів).


0

Щоб підтвердити пару попередніх відповідей, Жасмін, здається, добре працює з розширеннями Chrome. Я використовую версію 3.4.0.

Ви можете використовувати шпигуни Жасмін для легкого створення тестових пар для різних API. Не потрібно будувати власне з нуля. Наприклад:

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 включає бібліотеку Жасмін плюс код JavaScript мого розширення, а також мій тестовий набір. Тести запускаються автоматично, і результати форматуються для вас. Не потрібно створювати тестовий запуск або форматник результатів. Просто дотримуйтесь інструкцій із встановлення та використовуйте документ, задокументований там, щоб створити сторінку тестового бігу, а також включіть свій тестовий набір на сторінку.

Я не думаю, що ви можете динамічно отримати рамку Жасмін з іншого хоста, тому я просто включив випуск Жасмін у своє розширення. Я пропущу це, а також мої тестові випадки, коли будую розширення для виробництва, звичайно.

Я не розглядав, як виконувати свої тести в командному рядку. Це було б зручно для автоматизованих інструментів розгортання.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.