用于TDD的JavaScript单元测试工具

我已经研究并考虑了许多JavaScript单元测试和测试工具,但一直未能找到合适的选项来保持TDD完全兼容。 那么,是否有一个完全符合TDD标准的JavaScript单元测试工具?

噶或量角器

Karma是一个使用Node.js构建的用于单元测试的JavaScript测试运行器。

量角器用于端到端测试,并使用Selenium Web Driver来驱动测试。

两者都是由Angular团队制作的。 你可以使用任何你想要的断言库。

Screencast: Karma入门

相关

  • 我应该使用量角器还是Karma进行端到端测试?
  • 量角器和噶玛可以一起使用吗?

优点

  • 使用node.js,与Win / OS X / Linux兼容
  • 使用PhantomJS从浏览器或无头运行测试
  • 一次运行多个客户端
  • 选择启动,捕获和自动关闭浏览器
  • 在开发计算机上运行服务器/客户端或单独运行的选项
  • 从命令行运行测试(可以集成到ant / maven)
  • 编写测试xUnit或BDD样式
  • 支持多个JavaScript测试框架
  • 在保存时自动运行测试
  • 代理请求跨域
  • 可以自定义:
    • 扩展它来包装其他测试框架(茉莉花,摩卡,QUnit内置)
    • 你自己的断言/驳斥
    • 记者
    • 浏览器启动器
  • WebStorm的插件
  • 受Netbeans IDE支持

缺点

  • 不支持NodeJS(即后端)测试
  • Eclipse没有插件(还)
  • 没有以前的测试结果的历史

Buster.js

一个使用Node.js构建的JavaScript测试运行器 非常模块化和灵活。 它带有自己的断言库,但是如果你喜欢,你可以添加自己的断言库。 断言库是解耦的,所以你也可以将它与其他测试运行器一起使用。 而不是使用assert(!...)expect(...).not... ,它使用refute(...) ,这是一个不错的转折。

一个浏览器JavaScript测试工具包。 它使用浏览器自动化进行浏览器测试(如JsTestDriver),qunit风格的静态HTML页面测试,在无头浏览器(phantomjs,jsdom,…)中测试等等。 看看概述 !

一个Node.js测试工具包。 你可以得到相同的测试用例库,断言库等。这对于混合浏览器和Node.js代码来说也是很好的。 用Buster.JS编写测试用例,并在Node.js和真正的浏览器中运行它。

Screencast: Buster.js入门 (2:45)

优点

  • 使用node.js,与Win / OS X / Linux兼容
  • 使用PhantomJS从浏览器或无头运行测试(很快)
  • 一次运行多个客户端
  • 支持NodeJS测试
  • 不需要在开发计算机上运行服务器/客户端(不需要IE)
  • 从命令行运行测试(可以集成到ant / maven)
  • 编写测试xUnit或BDD样式
  • 支持多个JavaScript测试框架
  • 推迟测试,而不是评论他们
  • SinonJS内置
  • 在保存时自动运行测试
  • 代理请求跨域
  • 可以自定义:
    • 扩展它来包装其他测试框架(内置的JsTestDriver)
    • 你自己的断言/驳斥
    • 记者(xunit XML,传统的点,规格,水龙头,teamcity和更内置)
    • 自定义/替换用于运行浏览器测试的HTML
  • TextMate和Emacs集成

缺点

  • Stil在测试版中,所以可能是越野车
  • 没有Eclipse / IntelliJ插件(还)
  • 不像OS /浏览器/版本像TestSwarm *分组的结果。 但是,它会在测试结果中打印浏览器名称和版本。
  • 以前的测试结果没有历史像TestSwarm *
  • 截至2014年5月,没有完全在窗户上工作

* TestSwarm也是一个持续集成服务器,而你需要一个独立的CI服务器用于Buster.js。 但是,它会输出xUnit XML报告,因此应该很容易与Hudson , Bamboo或其他CI服务器集成。

TestSwarm

https://github.com/jquery/testswarm

正如GitHub网页上所述,TestSwarm正式不再处于积极的发展之中。 他们推荐Karma,browserstack-runner或Intern。

BrowserSwarm

www.browserswarm.com网站已经死亡,BrowserSwarm没有最近的搜索结果。 它似乎已经死亡。

BrowserSwarm是appendTo,Sauce Labs和Internet Explorer团队的一个项目。 它本质上是TestSwarm的托管版本。

除了TestSwarm的所有优点之外,BrowserSwarm已经将所有浏览器连接到群集并准备好测试您的代码,因此不需要您自己添加客户端或者维护浏览器的安装。 时间也从设置和配置TestSwarm的麻烦中省去。

茉莉花

茉莉花

这是一个客户端测试运行者,可能会使熟悉Ruby或Ruby on Rails的开发人员感兴趣。 该语法基于RSpec ,用于在Rails项目中进行测试。

Jasmine是一个用于测试JavaScript代码的行为驱动开发框架。 它不依赖于任何其他的JavaScript框架。 它不需要DOM。

如果你有这个测试运行者的经验,请提供更多信息:)

项目主页: http : //jasmine.github.io/

QUnit

QUnit专注于在浏览器中测试JavaScript,同时为开发人员提供尽可能多的便利。 从网站Blurb:

QUnit是一个功能强大,易于使用的JavaScript单元测试套件。 它被jQuery,jQuery UI和jQuery Mobile项目所使用,并且能够测试任何通用的JavaScript代码

QUnit与TestSwarm(以上)共享一些历史记录:

QUnit最初由John Resig开发,作为jQuery的一部分。 在2008年,它有自己的家,名字和API文档,允许其他人使用它进行单元测试。 当时它仍然依赖于jQuery。 在2009年重写固定,现在QUnit完全独立运行。 QUnit的断言方法遵循CommonJS单元测试规范,这在一定程度上受QUnit的影响。

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

兴农

Test-Driven JavaScript Development的作者C​​hristian Johansen是另一个伟大的工具, sinon.js 。 最好由自己描述:

用于JavaScript的独立测试间谍,存根和模拟。 没有依赖与任何单元测试框架。

实习生

实习生网站提供了一个直接的功能比较这个列表上的其他测试框架。 它提供了比任何其他基于JavaScript的测试系统更多的功能。

mocha.js

我完全没有资格评论mocha.js的特性,长处和弱点,但是这只是由我信任JS社区的人推荐给我的。

其网站上报告的功能列表:

  • 浏览器支持
  • 简单的异步支持,包括承诺
  • 测试覆盖率报告
  • 字符串差异支持
  • 用于运行测试的JavaScript API
  • 适当的CI支持退出状态等
  • 自动检测并禁用非ttys的着色
  • 将未捕获的异常映射到正确的测试用例
  • 异步测试超时支持
  • 测试特定的超时
  • 咆哮通知支持
  • 报告测试持续时间
  • 突出显示慢测试
  • 文件观察者支持
  • 全局变量泄漏检测
  • 可选运行符合正则表达式的测试
  • 自动退出以防止“挂起”与主动循环
  • 轻松地生成套件和测试用例
  • 摩卡.opts文件的支持
  • 可点击的套件标题来过滤测试执行
  • 节点调试器支持
  • 检测到多个调用完成()
  • 使用任何你想要的断言库
  • 可扩展的报告,捆绑9 +记者
  • 可扩展测试DSL或“接口”
  • 之前,之后,之前,之后,每个钩子
  • 任意转译器支持(咖啡脚本等)
  • TextMate包

yolpo

yolpo

Yolpo是一个可视化JavaScript的执行工具。 鼓励JavaScript API开发人员编写他们的用例来显示和告诉他们的api。 这样的用例构成了回归测试的基础。

AVA

AVA的标志

未来的测试赛跑者与ES2015的内置支持。 尽管JavaScript是单线程的,但Node.js中的IO可能由于其异步性质而并行发生。 AVA利用这一点并且同时运行你的测试,这对于IO测试是特别有利的。 另外,测试文件作为独立的进程并行运行,为每个测试文件提供更好的性能和独立的环境。

  • 最小和快速
  • 简单的测试语法
  • 同时运行测试
  • 强制编写原子测试
  • 没有隐式的全局变量
  • 每个测试文件的隔离环境
  • 在ES2015中写下你的测试
  • 承诺支持
  • 发电机功能支持
  • 异步功能支持
  • 可观察的支持
  • 增强的断言
  • 可选的TAP输出
  • 清洁堆栈痕迹

看看Dojo对象线程(DOH)单元测试框架 ,这个框架对JavaScript单元测试来说是非常独立于框架的,并且没有任何Dojo依赖关系。 在使用Dojo Objective Harness进行单元测试的Web 2.0应用程序中有非常好的描述。

如果你想自动化的UI测试(许多开发者的痛点) – 检查出doh.robot (临时下载。更新:其他链接http://dojotoolkit.org/reference-guide/util/dohrobot.html和dijit .robotx (临时下降) 。 后者是为验收测试而设计的。 更新:

参考文章解释了如何使用它们,如何模仿用户使用鼠标和/或键盘与UI进行交互,以及如何记录测试会话,以便以后自动“播放”它。

Chutzpah – JavaScript测试亚军

我创建了一个名为Chutzpah的开源项目,它是JavaScript单元测试的测试运行者。 Chutzpah使您能够从命令行和Visual Studio内部运行JavaScript单元测试。 它还支持在TeamCity持续集成服务器中运行。

维基百科条目“单元测试框架列表 ”的JavaScript部分提供了可用选项的列表。 它表示它们是工作在客户端,服务器端还是两者。

BusterJS

测试驱动Javascript开发和Sinon框架的作者Christian Johansen也有BusterJS 。 来自网站:

Buster.JS是一个新的JavaScript测试框架。 它通过在实际浏览器中自动执行测试运行来进行浏览器测试(比如JsTestDriver)以及Node.js测试。

谷歌,JS测试:

Google发布的JavaScript测试框架: https : //github.com/google/gjstest

  • 极快的测试启动和执行时间,而无需运行浏览器。
  • 在通过和失败测试的情况下,干净,可读的输出。
  • 一个基于浏览器的测试运行器 ,只要JS被更改,就可以简单地刷新。
  • 与Google Test for C ++类似的风格和语义。
  • 一个内置的模拟框架,基于Google C ++ Mocking Framework ,需要最少的样板代码(例如no $tearDown$verifyAll )以及样式和语义。

目前没有Windows的二进制文件

我们现在使用与Pavlov和JSTestDriver在一起的Qunit。 这种方法适合我们。

QUnit

巴甫洛夫 , 来源

jsTestDriver , 源码

作为专业人员,你有“在真正的浏览器上运行”,但根据我的经验,这是一个骗局,因为它是缓慢的。 但是,非浏览器替代方案缺乏足够的JS仿真,这是非常有价值的。 这可能是因为如果你的JS足够复杂,只有浏览器测试就足够了,但还有更多的选择需要考虑:

HtmlUnit :“它具有相当不错的JavaScript支持(不断改进),甚至可以在非常复杂的AJAX库中工作,根据您要使用的配置模拟Firefox或Internet Explorer。” 如果它的仿真足够好用,那么它比驱动浏览器要快得多。

但也许HtmlUnit有足够的JS支持,但你不喜欢Java? 那么也许:

Celerity :运行在JRuby上的Watir API,由HtmlUnit支持。

或类似地

Schnell :另一个HtmlUnit的JRuby包装器。

当然,如果HtmlUnit不够好,你不得不开车浏览器,那么你可以考虑Watir来驱动你的JS 。

YUI也有一个测试框架 。 这个视频来自Yahoo! 剧院是一个很好的介绍,虽然关于TDD的前沿有很多基础知识。

这个框架是通用的,可以针对任何JavaScript或JS库运行。

您可能也对qooxdoo的一部分单元测试框架感兴趣,这是一个类似于Dojo,ExtJS等的开源RIA框架,但是具有相当全面的工具链。

尝试在线版本的testrunner 。 提示:击中左上角的灰色箭头(应该更明显)。 这是一个运行选定测试的“播放”按钮。

要了解更多关于可以定义单元测试的JS类,请参阅在线API查看器 。

对于自动UI测试(基于Selenium RC),请查看模拟器项目。

你应该看看env.js。 查看我的博客 ,了解如何使用env.js编写单元测试。

我们添加了JUnit集成到我们的Java到Javascript代码生成器ST-JS( http://st-js.org )。 该框架为测试代码和单元测试生成相应的Javascript,并将代码发送到不同的浏览器。

由于单元测试运行器打开所需的http端口,因此不需要单独的服务器(并在测试完成后关闭它)。 该框架操纵Java堆栈跟踪,以便JUnit Eclipse插件正确显示失败的断言。 下面是jQuery和Mockjax的一个简单例子:

 @RunWith(STJSTestDriverRunner.class) @HTMLFixture("<div id='fortune'></div>") @Scripts({ "classpath://jquery.js", "classpath://jquery.mockjax.js", "classpath://json2.js" }) public class MockjaxExampleTest { @Test public void myTest() { $.ajaxSetup($map("async", false)); $.mockjax(new MockjaxOptions() { { url = "/restful/fortune"; responseText = new Fortune() { { status = "success"; fortune = "Are you a turtle?"; } }; } }); $.getJSON("/restful/fortune", null, new Callback3<Fortune, String, JQueryXHR>() { @Override public void $invoke(Fortune response, String p2, JQueryXHR p3) { if (response.status.equals("success")) { $("#fortune").html("Your fortune is: " + response.fortune); } else { $("#fortune").html("Things do not look good, no fortune was told"); } } }); assertEquals("Your fortune is: Are you a turtle?", $("#fortune").html()); } private static class Fortune { public String status; public String fortune; } } 

MochiKit有一个名为SimpleTest的测试框架,似乎已经被发现了。 这是原作者的博客文章 。