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

标签: IT技术 Javascript 单元测试 测试 | 发表时间:2012-12-06 01:16 | 作者:
出处:http://blog.jobbole.com

注:本文由 周敏明编译自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.youtube.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/

 

其他回复可参见 StackOverflow 原帖, 伯乐在线推荐一篇相关资讯: Testacular:Google开源的JavaScript测试执行过程管理工具

 

英文原文: StackOverflow,编译: 伯乐在线—— 周敏明

译文链接: http://blog.jobbole.com/30738/

【如需转载,请在正文中标注并保留原文链接、译文链接和译者等信息,谢谢合作!】

 

相关文章

相关 [寻找 javascript 单元测试] 推荐:

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

- - 博客 - 伯乐在线
注:本文由 周敏明编译自Stack Overflow 同名问答贴,原问题如下:. 让我们看看 Javascript 单元测试的现状和 测试工具. 我们已经在使用它来作为我们的 单元测试工具了. ●可以被ant构建文件调用;. ●启动 浏览器来运行 测试用例;. ●Eclipse插件支持;.

对 JavaScript 进行单元测试的工具

- - 博客 - 伯乐在线
来源: IBM DeveloperWorks. 单元测试关注的是验证一个模块或一段代码的执行效果是否和设计或预期一样. 有些开发人员认为,编写测试用例浪费时间而宁愿去编写新的模块. 然而,在处理大型应用程序时,单元测试实际上会节省时间;它能帮助您跟踪问题并安全地更新代码. 在过去,只对服务器端语言进行单元测试.

Android单元测试

- - CSDN博客推荐文章
    单元测试不管对于初学编程还是已经工作了很久的开发者来说,都不乐意花时间去写认为没用的代码进行测试,只要交给测试人员就行了,虽然这样也能把软件改出来,但也许你要花上几倍的时间去修改问题,如果在开发的过程中花点时间去写单元测试代码,把尽可能出问题的地方都测试一遍,把问题扼杀在最开始的地方,这样你就不必为后来找问题出处而烦恼.

Hadoop之MapReduce单元测试

- - ITeye博客
通常情况下,我们需要用小数据集来单元测试我们写好的map函数和reduce函数. 而一般我们可以使用Mockito框架来模拟OutputCollector对象(Hadoop版本号小于0.20.0)和Context对象(大于等于0.20.0). 下面是一个简单的WordCount例子:(使用的是新API).

“单元测试要做多细?”

- - 酷壳 - CoolShell.cn
这篇文章主要来源是StackOverflow上的一个回答——“ How deep are your unit tests?”. 一个有13.8K的分的人( John Nolan)问了个关于TDD的问题,他说——. “TDD需要花时间写测试,而我们一般多少会写一些代码,而第一个测试是测试我的构造函数有没有把这个类的变量都设置对了,这会不会太过分了.

文章: Android中的单元测试

- - InfoQ cn
随着Agile的普及,以及开发人员对测试重要性的认识逐步加深,单元测试已经成了越来越多软件项目开发中不可缺少的一部分. 无论项目是不是采用TDD的形式来进行开发,单元测试都能够为项目的修改和重构提供一定的保障. 有奖参与:天翼伦敦会,上传应用,为中国队加油. QClub七月技术沙龙(太原/北京/上海/厦门/西安 7月21/28/29日 免费报名中.

迈出单元测试的第一步

- - 酷勤网-挖经验 [expanded by feedex.net]
单元测试不仅是软件行业的最佳实践,在敏捷方法的推动下,它也成为了可持续软件生产的支柱. 年度敏捷调查,70%的参与者会对他们的代码进行单元测试. 单元测试和其他敏捷实践密切相关,所以开始编写测试是组织向敏捷转型的踏脚石. 我将在本文介绍符合要求的小技巧,以及在开发周期里进行单元测试的步骤. 没有自动化,单元测试的习惯也不会持续太久.

iOS开发进阶之单元测试

- - 博客园_首页
本文侧重讲述如何在iOS程序的开发过程中使用单元测试. 使用Xcode自带的OCUnit作为测试框架. 单元测试作为敏捷开发实践的组成之一,其目的是提高软件开发的效率,维持代码的健康性. 其目标是证明软件能够正常运行,而不是发现bug(发现bug这一目的与开发成本是正相关的,虽然发现bug是保证软件质量的一种手段,但是很显然这与降低软件开发成本这一目的背道而驰).

Java 单元测试利器之 Junit

- - 博客园_首页
          因为工作和学习的需要,在代码中查错的时候,第一步就是想知道这个错误具体发生在一个位置,进行一个准确的定位. 而这个定位的工作交给谁来做了呢. 不难猜出也就是这篇博客的主题---Junit. junit是一个开源的框架,也是java这一块的测试工具之一. 想了解详细请上官网,下面用代码来跟大家解释.

单元测试里的 5 个错误

- - ITeye博客
当我第一次听说可以使用框架比如JUnit来进行单元测试的时候,我惊叹这真是一个简单而强大的概念. 它取代了随机测试,使你可以保存你的测试代码,并按照需要随时运行它们. 按照我的理解,关于单元测试并没有多少产生误解的可能. 但是过去的几年中,我确实见过几种或多或少不太正确的单元测试使用方式. 如果跟协作逻辑代码分离开来,那么算法逻辑是最容易测试的.