How to test chrome extensions?
Is there a good way to do this? I'm writing an extension that interacts with a website as a content script and saves data using localstorage. Are there any tools, frameworks, etc. that I can use to test this behavior? I realize there are some generic tools for testing javascript, but are those sufficiently power to test an extension? Unit testing is most important, but I'm also interested in other types of testing (such as integration testing).
Yes, the existing frameworks are pretty useful..
In the recent past, I have placed all my tests on a "test" page that was embedded in to the application but not reachable unless physically typed.
For instance, I would have all the tests in a page accessible under chrome-extension://asdasdasdasdad/unittests.html
The tests would have access to localStorage
etc. For accessing content scripts, in theory you could test that through embedded IFRAMEs in your test page, however these are more integration level testing, unit tests would require you to abstract that away from real pages so that you don't depend on them, likewise with access to localStorage.
If you want to test pages directly, you can orchestrate your extension to open new tabs (chrome.tab.create({"url" : "someurl"}). For each of the new tabs your content script should run and you can use your testing framework to check that your code has done what it should do.
As for frameworks, JsUnit or the more recent Jasmine should work fine.
Working on several chrome extensions I came up with sinon-chrome
project that allows to run unit-tests using mocha
, nodejs
and phantomjs
.
Basicaly, it creates sinon mocks of all chrome.* api
where you can put any predefined json responses.
Next, you load your scripts using node's vm.runInNewContext
for background page and phantomjs
for render popup / options page.
And finally, you assert that chrome api was called with needed arguments.
Let's take an example:
Assume we have simple chrome extension that displays number of opened tabs in button badge.
background page:
chrome.tabs.query({}, function(tabs) {
chrome.browserAction.setBadgeText({text: String(tabs.length)});
});
To test it we need:
chrome.tabs.query
to return predefined response, eg two tabs. The code snippet is following:
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"
});
Now we can wrap it into mocha's describe..it
functions and run from terminal
$ mocha
background page
✓ should display opened tabs count in button badge
1 passing (98ms)
You can find full example here.
Additionally, sinon-chrome allows to trigger any chrome event with predefined response, eg
chrome.tab.onCreated.trigger({url: 'http://google.com'});
About already existing tool in Chrome:
In the chrome developer tool, there is section for Resources For local storage.
Developer Tools > Resources > Local Storage
See the changes of localstorage there.
You can use console.profile to test performance and watch run time call stack.
If you are use content script and local-storage together without background page/script and without message passing, local-storage will be accessible from that site only. So, to test those pages, you have to inject your test script in those tabs.
链接地址: http://www.djcxy.com/p/16184.html下一篇: 如何测试Chrome扩展?