如何testingChrome扩展?

有没有一个好的方法来做到这一点? 我正在编写一个扩展,作为内容脚本与网站交互,并使用localstorage保存数据。 有什么工具,框架等,我可以用来testing这种行为? 我意识到有一些testingJavaScript的通用工具,但那些足够的能力来testing扩展? unit testing是最重要的,但我也对其他types的testing感兴趣(如集成testing)。

是的,现有的框架是非常有用的..

最近,我把所有的testing都放在一个embedded到应用程序中的“testing”页面上,但是除非物理input,否则无法访问。

例如,我可以在一个页面中使用chrome-extension://asdasdasdasdad/unittests.html来访问所有的testing

testing可以访问localStorage等等。对于访问内容脚本,理论上你可以通过testing页面中的embedded式IFRAME来testing,但是这些testing是更多的集成级别testing,unit testing会要求你从真实页面抽象出来,你不依赖于他们,同样可以访问localStorage。

如果你想直接testing页面,你可以编排你的扩展以打开新的标签(chrome.tab.create({“url”:“someurl”})。对于每个新的标签,你的内容脚本应该运行,你可以使用你的testing框架来检查你的代码是否完成了它应该做的事情。

至于框架, JsUnit或更新的Jasmine应该正常工作。

在几个chrome扩展上工作,我想出了一个sinon-chrome项目,允许使用mochanodejsphantomjs来运行unit testing。

基本上,它创build了所有的chrome.* api sinon mocks,你可以在其中放置任何预定义的json响应。

接下来,您使用节点的vm.runInNewContext用于背景页面)和phantomjs用于渲染popup窗口/选项页面)来加载脚本。

最后,你断言chrome api被调用了需要的参数。

举个例子:
假设我们有一个简单的Chrome扩展,它显示button标记中打开的标签数量。

背景页面:

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

为了testing它,我们需要:

  1. 模拟chrome.tabs.query返回预定义的响应,例如两个选项卡。
  2. 注入我们的嘲弄的铬。* API进入一些环境
  3. 在这个环境中运行我们的扩展代码
  4. 断言button徽章等于'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函数中,并从terminal运行

 $ mocha background page ✓ should display opened tabs count in button badge 1 passing (98ms) 

你可以在这里find完整的例子。

另外,sinon-chrome允许以预定义的响应触发任何chrome事件,例如

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

Chrome中已有的工具:

  1. 在Chrome开发人员工具中,有部分资源用于本地存储。

    开发者工具>资源>本地存储

    查看当地存储的变化。

  2. 您可以使用console.profile来testing性能并观察运行时调用堆栈。

  3. for fileSystem你可以使用这个URL来检查你的文件是否被上传:filesystem:chrome-extension:/// temporary /

如果您使用内容脚本和本地存储,而没有后台页面/脚本且没有消息传递,则只能从该站点访问本地存储。 所以,为了testing这些页面,你必须在你的testing脚本中注入这些标签。