寻找更好的Javascript单元测试工具

jopen 12年前

注:本文由周敏明编译自Stack Overflow同名问答贴,原问题如下:

让我们看看Javascript单元测试的现状和测试工具。

1.JsUnit

我们已经在使用它来作为我们的单元测试工具了。

优势:

●可以被ant构建文件调用;

●启动浏览器来运行测试用例;

●Eclipse插件支持;

缺点:

●需要启动浏览器来运行测试用例;

●不支持用js文件来写单元测试代码:它必须嵌入在html文件中;

●它已经好几年没更新了;

注意:

●有一个测试工具叫JsUnit(2);

●“ant”是一个开源构建工具;之所以叫“Ant”因为它很小,但是可以用来构建大型项目;

 

2.RhinoUnit

优势

●ant驱动

●支持js文件

●很容易使用

缺点

●模拟的Javascript引擎不够优秀来支持我们的代码。我尝试过用它来运行“在JsUnit上运行正常”的测试代码,但是在加载我们的通用Javascript文件时遇到了问题

 

3.crosscheck

优势

●可以被ant构建文件调用

●模拟了真实浏览器行为

缺点

●模拟的Javascript引擎仅有少有的几个浏览器版本

●两年没有更新了:不支持Firefox 2.x 或 3.x

 

4.jsspec

优势

●运行在真实的浏览器上

缺点

●Javascript只有框架,无法被ant构建文件调用

 

5. jspec

优势

●运行在真实的浏览器上

缺点

●貌似不支持我们的代码,我尝试运行了”在JsUnit上运行正常“的测试代码,但是在加载我们的通用Javascript文件时遇到问题

●Javascript只有框架,无法被ant构建文件调用

 

6. Screw.unit

优势

●运行在真正的浏览器中

缺点

●Javascript只有框架,无法被ant构建文件调用

注意:我们使用过它,但是它比jsspec和jspec还要小。

这么看来JsUnit是我们唯一的选择。注意它已经在其他组件中被使用了。它不是完美的,它没有提供一个方便的实现测试驱动开发(TDD)的方法:

●它没有提供一个简单、集成的方法来运行单元测试

●它强制你在html文件中写单元测试,而不是js文件

●它强制你安装一个本地JsUnit框架,来避免硬编码js的单元测试文件的路径

其结果是,当你在”测试驱动开发“Javascript的时候,不得不在你的IDE和你要测试的浏览器之间来回切换。这是可行的,但是我不认为这是高效的(这里我可能错了)。

当然我还在寻找一个更好的Javascript编辑器或者是能够很容易实现引用和重构的Eclipse插件。WTP项目中有一部分叫JSTD的插件,然而我没有足够的使用经验来评论它。

总结,我不认为我们有工具可以完全实现”TDD“。我们可以 TOD(面向测试的开发),但是我还没有找到任何能够让我们像写Java一样高效地写Javascript的工具。再次声明,理想的解决方案会和JUnit类似。

 

你在使用什么单元测试工具?

 

 

得票最高的答案,来自gregers

1. Buster.js

与JsTestDriver(之后会谈到)的server/client概念类似。除了server是使用Node.js实现的,而不是Java。并且API遵循了JS的最佳实践。

一个浏览器Javascript测试工具库。自动化浏览器测试(想下JsTestDriver吧),qunit风格的静态HTML页面测试,可以在无界面的浏览器(phantomjs,jsdom…)和其他浏览器中测试。看看它的概览吧!

一个Node.js测试工具库。你有相同的测试用例库,断言库等等。这对同时支持浏览器和Node.js的代码来说很好。使用Buster.JS写你的测试用例,然后在Node.js和真实浏览器中运行。

截图:Buster.js入门 (2:45)

优势:

●使用Node.js,兼容Win/OS X/Linux

●可以在普通浏览器或无界面浏览器PhantomJS(快了)中运行

●一次运行多个客户端

●支持Nodejs测试

●不需要在开发机器上运行 server/clients(不需要安装IE)

●在命令行中运行测试(可以被ant/maven集成)写xUnit或BDD风格的测试

●支持多个Javascript测试框架

●支持延缓测试而不是把代码注释掉

●内建SinonJS

●在保存的时候自动运行测试

●代理跨域的请求:

●可以扩展包含其他测试框架(内建JsTestDriver)

●加上你自己的断言/拒绝

●报表(xunit XML, traditional dots, specification, tap, teamcity和更多内建的)

●自定义或替换在浏览器测试中运行的HTML

●TextMate和Emacs集成

缺点:

●还在beta中,有很多bug

●还没有Eclipse或IntelliJ的插件

●不像TestSwarm那样以os/browser/version方式组织结果。 注:它会,但是只在测试结果中打印浏览器名字和版本

●没有像TestSwarm那样的历史支持,看不到之前的测试结果

注:当你需要为Buster.js提供一个独立的CI服务,TestSwarm也可以作为持续集成(CI)服务。不过Buster.js可以输出xUnit XML报表,所以它可以很容易的被集成到HudsonBamboo等CI服务中。

 

2. TestSwarm

TestSwarm是John Resig(jQuery作者)创建的分布式Javascript测试工具。主要用于开源Javascript项目的测试,但是TestSwarm也是开源的,所以你可以为自己配置一台TestSwarm服务器用于企业测试。不过这可能需要你做不少的修改。

优势

●Javascript的持续集成服务

●支持所有的主要浏览器和操作系统

●一次运行多个客户端

●不需要在开发机器上运行server/client (不需要安装IE)

●当你提交东西(或修改脚本)的时候,在所有客户端上自动运行测试

●显示每次提交的测试历史结果

●支持多种Javascript测试框架

●有针对操作系统和浏览器版本的结果

●Crowdsource to test in a multitude of browsers

缺点:

●无法通过ant/maven来打断测试

●在提交之前无法知道测试用例失败

●没有IDE插件支持

http://ejohn.org/blog/javascript-testing-does-not-scale/

TestSwarm的架构:

3. JsTestDriver

一些google的工程师也开始了一个分布式Javascript工具的开发,JsTestDriver。它和TestSwarm类似,它有一个服务器,并且客户端是与服务器保持连接。但是它也支持从命令行运行,并且有Eclipse和IntelliJ的插件!

优势:

●支持所有主要的浏览器和操作系统

●一次运行多个客户端

●不需要在开发机器上运行server/client (不需要安装IE)

●可以在命令行(jar)运行测试(可以被ant/maven集成)

●Eclipse插件

●IntelliJ插件

●支持多种Javascript测试框架

缺点:

●不显示操作系统或浏览器版本。只有浏览器名字,不过它在测试结果中会打印版本

●不支持测试历史结果

●项目不是很活跃,更新慢

JsTestDriver的运行概览如下: JsTestDriver

alt text

Eclipse插件截图: JsTestDriver for Eclipse

alt text

简单的介绍视频:http://www.油Tube.com/watch?v=V4wYrR6t5gE

 

 

4. YUI Yeti

Yahoo现在已经在自己的服务上运行测试Javascript,Yeti。基于Node.js构建。它可以运行你现有的YUI-test,并且支持多种浏览器。既然它可以通过命令行运行,所以我猜测它和JsTestDriver类似。

发布于2010年8月25日:

如果你对它很熟悉,请提供给我更多的信息:)

项目地址:http://yuilibrary.com/projects/yeti/

 

5. Jasmine

Jasmine

这个测试工具可能会引起”对Ruby/Ruby on Rails熟悉“的开发者的注意。它的语法是基于RSpec,RSpec被用于Rails项目的测试。

Jasmine是一个行为驱动开发(BDD)的Javascript测试框架。它不依赖任何其他的Javascript框架。它也不依赖DOM。

如果你对它很熟悉,请提供给我更多的信息:)

项目主页:https://github.com/pivotal/jasmine/

 

6. QUnit

QUnit专注于浏览器上的Javascript测试,故而提供了尽可能多的方便。来自官方网站的简介:

QUnit是一个强大的、易于使用的Javascript单元测试库。jQuery、jQuery UI和jQuery Mobile项目都使用了它。它也完全可以用来测试通用的Javascript代码

QUnit与TestSwarm有些相同的历史:

QUnit是jQuery的一部分,也由John Resig开发。在2008年,它有了自己的个人主页、名字和API文档,允许其他人使用它用作单元测试。当时它还是基于jQuery的。2009年时一次重构解决了这个问题,如今QUnit完全独立于jQuery。QUnit的断言方法遵循了CommonJS单元测试标准,此标准也一定程度受到了 QUnit的影响。

项目主页:http://qunitjs.com/

 

7. Sinon

Sinon.js是另一个很棒的测试工具。它由《Test-Driven JavaScript Development》一书的作者Christian Johansen开发。他认为这是最棒的。

为Javascript提供独立的spies,stubs和mocks。没有任何依赖,可以与任何单元测试框架协同工作。

http://tddjs.com/