2010-05-19 2 views
125

Есть ли хороший способ сделать это? Я пишу расширение, которое взаимодействует с веб-сайтом как сценарий контента и сохраняет данные, используя localstorage. Существуют ли какие-либо инструменты, фреймворки и т. Д., Которые я могу использовать для проверки этого поведения? Я понимаю, что есть некоторые общие инструменты для тестирования javascript, но достаточно ли они для тестирования расширения? Модульное тестирование является самым важным, но меня также интересуют другие типы тестирования (например, интеграционное тестирование).Как протестировать хромированные расширения?

+7

Я только что написал канонический ответ, который посвящен тестированию модулей и тестированию интеграции для расширений браузера в * всех * браузерах, а не только в Chrome. См. [Ответ на «Тестирование расширений браузера»] (http://stackoverflow.com/a/17370531/938089). –

ответ

93

Да, существующие рамки довольно полезны ..

В недавнем прошлом, я поместил все мои тесты на странице «тест», который был встроен в приложение, но не достижимой, если физически не наберется.

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

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

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

Как каркасные, JsUnit или более недавнее Jasmine должны работать нормально

+1

Вы правы, тестирование реальных страниц не подпадает под модульное тестирование. Я должен был расспросить мой вопрос более широко. Но это еще что-то, что я хотел бы протестировать, тем более, что структура сайта html может измениться в любое время. Я изменил вопрос. – swampsjohn

+1

Я бы тестировал через IFrames на странице тестирования устройства. Сценарии содержимого должны по-прежнему запускаться (если вы включите скрипты для запуска в iFrame) – Kinlan

+2

У расширения прокси-сервера есть несколько тестов, которые просто издеваются над битами и частями API-интерфейсов Chrome, которые были необходимы: http://code.google. com/chrome/extensions/samples.html # chrome.proxy .. Также наш коллега Борис использовал QUnit для тестирования своего «модельного» слоя: https://github.com/borismus/Question-Monitor-for-Stack-Exchange/ tree/master/tests –

2

О уже существующем инструменте в Chrome:..

  1. В c hrome, есть раздел для ресурсов для локального хранилища.

    Developer Tools> Ресурсы> Local Storage

    Смотрите изменения LocalStorage там.

  2. Вы можете использовать console.profile для проверки производительности и просмотра стека вызовов времени выполнения.

  3. для FileSystem Вы можете использовать этот URL, чтобы проверить файл, это загрузить-редактор или нет: файловой система: хром-расширения: /// временного/

Если вы будете использовать скрипт контента и локальное хранение вместе без фоновой страницы/скрипта и без передачи сообщений локальное хранилище будет доступно только с этого сайта. Итак, чтобы протестировать эти страницы, вы должны ввести тестовый скрипт на эти вкладки.

+1

Не работало для меня, но это заставило меня дальше в моем javascript. +1 для этого. – mobibob

+0

Для файловой системы Вы можете использовать: файловая система: chrome-extension: // /временный/ –

47

Работа на нескольких хромированных расширений я придумал sinon-chrome проект, который позволяет запускать юнит-тесты с использованием mocha, nodejs и phantomjs.

Basicaly, он создает синонные издевки всех chrome.* api, где вы можете разместить любые предопределенные ответы json.

Далее вы загружаете свои скрипты с помощью vm.runInNewContext узла для фоновой страницы и phantomjs для страницы всплывающего окна/параметров.

И, наконец, вы утверждаете, что хром-апи был вызван с необходимыми аргументами.

Давайте рассмотрим пример:
Предположим, что мы имеем простое расширение хром, который отображает количество открытых вкладок в кнопку пропуска.

фона страницы:

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

Чтобы проверить это нам нужно:

  1. издеваться chrome.tabs.query вернуть предопределенный ответ, например, две вкладки. .
  2. впрыснуть наш высмеивал хром * апи в некоторой среде
  3. запустить наш код расширения в этой среде
  4. утверждают, что значок кнопки равен «2»

фрагмент кода имеет следующий вид:

var vm = require('vm'); 
var fs = require('fs'); 
var 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 
var context = { 
    chrome: chrome; 
}; 

// 3. run our extension code in this environment 
var 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) 

Вы можете найти полный пример here.

Кроме того, sinon-chrome позволяет запускать любое хромовое событие с предопределенным ответом, например.

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

звучит хорошо - я определенно дам ему вращение! – jakabadambalazs

+0

Ссылка на пример кажется мертвой - не могли бы вы ее обновить? – Raisen

+0

Обновлена ​​ссылка на пример. Кроме того, sinon-chrome теперь перемещается на https://github.com/acvetkov, и скоро появятся новые примеры – vitalets

0

Хотя sinon.js кажется, отлично работает, вы можете просто использовать простой жасмин и издеваться обратные вызовы Chrome вам нужно. Пример:

Mock

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

Test

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 для запуска кода.

Смежные вопросы