JavaScript单元测试工具用于TDD

716

我已经调研并考虑了许多JavaScript单元测试和测试工具,但无法找到一个能够完全符合TDD的合适选项。那么,是否有一个JavaScript单元测试工具能够完全符合TDD标准?

13个回答

1518

KarmaProtractor

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

Protractor用于端到端测试,使用Selenium Web Driver来驱动测试。

两者均由Angular团队制作。您可以在任一测试工具中使用所需的断言库。

演示视频:Karma入门

相关问题:

优点:

  • 使用Node.js,与Win / OS X / Linux兼容
  • 在浏览器或使用PhantomJS无头运行测试
  • 同时在多个客户端上运行
  • 启动、捕获和自动关闭浏览器选项
  • 可以在开发计算机或单独的服务器/客户端上运行
  • 从命令行运行测试(可集成到ant/maven中)
  • xUnit或BDD风格编写测试
  • 支持多个JavaScript测试框架
  • 保存时自动运行测试
  • 跨域代理请求
  • 可以进行自定义:
    • 扩展它以包装其他测试框架(Jasmine,Mocha,QUnit内置)
    • 您自己的断言/反驳
    • 报告器
    • 浏览器启动器
  • WebStorm插件
  • 受NetBeans IDE支持

缺点

mocha.js

我完全没有资格对mocha.js的功能、优势和弱点发表评论,但是在JS社区中我信任的某人向我推荐了它。

它的网站报告了以下功能:

  • 浏览器支持
  • 简单的异步支持,包括promises
  • 测试覆盖率报告
  • 字符串差异支持
  • JavaScript # API用于运行测试
  • 适当的CI支持等退出状态
  • 自动检测并禁用非tty的颜色
  • 将未捕获的异常映射到正确的测试用例
  • 异步测试超时支持
  • 测试特定超时
  • 增长通知支持
  • 报告测试持续时间
  • 突出显示慢速测试
  • 文件监视器支持
  • 全局变量泄漏检测
  • 可选择运行与正则表达式匹配的测试
  • 自动退出以防止“挂起”活动循环
  • 轻松元生成套件和测试用例
  • mocha.opts文件支持
  • 可点击的套件标题以过滤测试执行
  • Node调试器支持
  • 检测多次调用done()
  • 使用任何你想要的断言库
  • 可扩展的报告,与9个以上的报告器捆绑在一起
  • 可扩展的测试DSL或“接口”
  • before、after、before each、after each钩子
  • 任意转换器支持(coffee-script等)
  • TextMate包

yolpo

yolpo

这已经不存在了,现在重定向到sequential.js

Yolpo是一种可视化JavaScript执行的工具。鼓励JavaScript API开发人员编写他们的用例来展示和介绍他们的API。这些用例构成回归测试的基础。

AVA

AVA logo

AVA是一款具有ES2015内置支持的未来主义测试运行器。虽然JavaScript是单线程的,但由于Node.js的异步性质,I/O可以并行进行。AVA利用这一点并发运行您的测试,这对于I/O密集型测试尤其有益。此外,将测试文件作为单独进程并行运行,为每个测试文件提供了更好的性能和隔离的环境。

  • 最小化且快速
  • 简单的测试语法
  • 并发运行测试
  • 强制编写原子测试
  • 没有隐式全局变量
  • 为每个测试文件提供隔离环境
  • 使用ES2015编写测试
  • 支持Promise
  • 支持Generator函数
  • 支持Async函数
  • 支持Observable
  • 增强的断言功能
  • 可选的TAP输出
  • 清晰的堆栈跟踪

Buster.js

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

浏览器JavaScript测试工具包。它使用浏览器自动化进行浏览器测试(类似于JsTestDriver),QUnit风格的静态HTML页面测试,在无头浏览器(PhantomJS,jsdom等)中进行测试等等。看看the overview

Node.js测试工具包。您将获得相同的测试用例库,断言库等等。这对于混合浏览器和Node.js代码也非常有用。使用Buster.JS编写测试用例,并在Node.js和真实浏览器中运行它。

演示视频:Buster.js入门(2:45)

优点

  • 使用Node.js,因此与Win / OS X / Linux兼容
  • 可以在浏览器或无头模式下使用PhantomJS运行测试(即将推出)
  • 一次在多个客户端上运行
  • 支持Node.js测试
  • 不需要在开发计算机上运行服务器/客户端(无需IE)
  • 可以从命令行运行测试(可集成到ant / maven中)
  • 编写测试xUnit或BDD样式
  • 支持多个JavaScript测试框架
  • 推迟测试而不是注释掉它们
  • 内置SinonJS
  • 自动保存时运行测试
  • 代理跨域请求
  • 可以定制:
    • 将其扩展为包装其他测试框架(内置JsTestDriver)
    • 您自己的断言/反驳
    • 报告器(内置xUnit XML,传统点,规范,tap,TeamCity等)
    • 自定义/替换用于运行浏览器测试的HTML
  • TextMate和Emacs集成

缺点:

  • 仍在测试阶段,可能会有错误
  • 目前尚无Eclipse/IntelliJ插件
  • 与TestSwarm不同,它不会按操作系统/浏览器/版本分组结果。但是,在测试结果中打印了浏览器名称和版本。
  • 没有像TestSwarm那样记录之前的测试结果历史
  • 截至2014年5月在Windows上并不能完全使用

* TestSwarm也是一个持续集成服务器,而你需要一个单独的CI服务器来运行Buster.js。然而,它可以输出xUnit XML报告,因此应该很容易与HudsonBamboo或其他CI服务器集成。

TestSwarm

https://github.com/jquery/testswarm

根据他们的GitHub页面,TestSwarm已经正式停止了活跃开发。他们建议使用Karma、browserstack-runner或Intern。

Jasmine

Jasmine

这是一个行为驱动的框架(如下所述),可能会吸引熟悉Ruby或Ruby on Rails的开发人员。语法基于RSpec,用于Rails项目中的测试。
Jasmine规范可以从HTML页面(以qUnit方式)或测试运行器(如Karma)运行。

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

如果您有使用该测试框架的经验,请贡献更多信息:)
项目主页:http://jasmine.github.io/

QUnit

QUnit专注于在浏览器中测试JavaScript,并尽可能为开发人员提供方便。网站上的描述:

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/

Sinon

另一个伟大的工具是sinon.js,由Christian Johansen编写,他是Test-Driven JavaScript Development的作者。由他本人最好地描述:
JavaScript的独立测试间谍、存根和模拟程序。没有依赖项,可以与任何单元测试框架一起使用。

Intern

Intern网站直接提供了与此列表中其他测试框架的功能比较。它提供的功能比任何其他基于JavaScript的测试系统都要多。

JEST

一个新但非常强大的测试框架。它允许基于快照的测试,这增加了测试速度,并在测试方面创造了一种新的动态。

请查看他们的其中一次演讲:https://www.youtube.com/watch?v=cAKYQpTC7MA

更好的是:开始入门


2
Jasmine可以使用V8无头工作,但您也可以交互式地使用它。虽然DOM对于Jasmine来说并不是必需的,但是_您的代码库_可能会访问DOM。通过纪律性的方法,可以消除、用条件保护或为访问DOM的代码部分提供模拟,并完全脱离HTML固定装置运行测试。您还可以使用附加组件获得命令行支持和固定装置。 - jerseyboy
2
@rehevkor5:Selenium 用于集成测试,而这里的工具用于单元测试。http://www.typemock.com/unit-tests-integration-tests - gregers
31
几乎所有的测试运行程序都依赖于浏览器。什么鬼,难道没有人只在服务器端运行单元测试吗? - user9903
2
把每个选项分成不同的答案会不会更好呢?这可能会使当前投票无效,但我认为这是最合理的做法。 - cregox
2
@Raisen 你可以使用Babel将ES 2015插入大多数工具中,但Sindre SorhusAVA已经内置了它。 - gregers
显示剩余11条评论

64

请查看 Dojo Object Harness (DOH) 单元测试框架,它是一个独立于框架的 JavaScript 单元测试框架,并且没有任何 Dojo 依赖。在 使用 Dojo Objective Harness 进行 Web 2.0 应用程序单元测试 中对其进行了非常好的描述。

如果您想自动化 UI 测试(许多开发人员都感到头痛) - 请查看 doh.robot (暂时关闭,更新:其他链接 http://dojotoolkit.org/reference-guide/util/dohrobot.html)dijit.robotx (暂时关闭)。后者专门用于验收测试。 更新:

引用的文章介绍了如何使用它们,如何模拟用户使用鼠标和/或键盘与您的 UI 交互,以及如何记录测试会话,使您可以以后自动“播放”它。


感谢您对Dojo对象Harness的建议,否则我可能找不到它。我很感激其他的建议 - 但是一次只能解决一个问题。 - Mark Levison
我之前在一个项目中使用过这个,发现它非常有价值。但是,我无法进行比较 - 没有使用过其他的TDD框架。 - Rakesh Pai
感谢您报告失效链接。我已更新其中一个链接,并将在新网站上线后尽快更换机器人文档的链接。 - Eugene Lazutkin
我不喜欢 DOH 的一件事是,当断言失败时,行号没有报告。手动注释它们并重新运行测试可以解决这个问题。 - Aram Kocharyan
Dojo正在用TheIntern测试框架替换DOH。 TheIntern非常强大,并且有实质性的改进。http://www.sitepen.com/blog/2014/02/18/dojo-automated-testing-improvements-updating-to-intern/ - user64141

35

Chutzpah - 一个JavaScript测试运行器

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


7
我刚开始使用 Chutzpah 在 Visual Studio 中运行 Jasmine 测试 - 它集成得很好:在测试文件中右键单击,选择“运行 js 测试”或“在浏览器中运行 JS 测试”。我也使用 JSTestDriver 运行相同的 Jasmine 测试。我更喜欢 Chutzpah,因为我可以在测试文件顶部指定需要加载的文件依赖关系。而对于 JSTestDriver,则需要一个单独的配置文件。 - GarethOwen

28

维基百科中的JavaScript部分,单元测试框架列表,提供了可用选择的列表。它指示它们是在客户端、服务器端还是两者都可以运行。


15

BusterJS

还有一个来自Christian Johansen的BusterJS框架,他是《Test Driven Javascript Development》和Sinon框架的作者。从该网站上可以看到:

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


11

google-js-test:

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

  • 无需运行浏览器,测试启动和执行非常快。
  • 在测试通过或失败时都有清晰易读的输出。
  • 基于浏览器的测试运行器,只需在JS更改时刷新即可。
  • 风格和语义类似于C++的Google Test
  • 内置模拟框架,需要最少的样板代码(例如没有$tearDown$verifyAll),其风格和语义基于Google C++ Mocking Framework

目前没有Windows的二进制文件。


3
看起来这个项目在Github上几乎没有任何兴趣,而且它需要Unix系统作为基础,我是一个狂热的Windows粉丝,我不会不吻别我的Windows电脑就离开家。 - vsync

9

你能否解释一下这些在整个测试过程中的作用以及它们如何相互连接? - vsync
抱歉,已经过了很长时间并且做了许多合同工作,无法回忆起此事的详细信息。 - Tom Stickel

7
YUI也有一个测试框架。这个来自Yahoo! Theater的视频是一个不错的介绍,虽然前面有很多关于TDD的基础知识。
该框架是通用的,可以针对任何JavaScript或JS库运行。

5
请注意,雅虎已经停止对YUI的所有新开发工作 - Peter V. Mørch

7
您在优点中提到“在实际浏览器上运行”,但是根据我的经验,这是一个缺点,因为它很慢。但是,与非浏览器替代品相比,它的价值在于缺乏足够的JS仿真。如果您的JS足够复杂,只有在浏览器测试中才能满足要求,但还有几个选项可供考虑: HtmlUnit:“它具有相当不错的JavaScript支持(不断改进),并且能够使用相当复杂的AJAX库,模拟Firefox或Internet Explorer,具体取决于您想要使用的配置。” 如果其仿真足够好,则比驱动浏览器快得多。
但是,也许HtmlUnit的JS支持足够好,但您不喜欢Java?那么也许: Celerity:在HtmlUnit支持下运行的JRuby Watir API。
或类似地 Schnell:另一个HtmlUnit的JRuby包装器。
当然,如果HtmlUnit不够好,你必须驱动浏览器,那么你可以考虑使用 Watir 驱动你的 JS

4

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

请尝试使用 testrunner 的在线版本。提示:点击左上方的灰色箭头(应该更加明显)。这是一个“播放”按钮,可以运行所选的测试。

要了解更多关于 JS 类的信息,以便定义您的单元测试,请查看在线 API viewer

对于基于 Selenium RC 的自动化 UI 测试,请查看 Simulator 项目。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接