我已经研究并考虑了许多JavaScript单元测试和测试工具,但一直无法找到一个完全符合TDD的合适选项。那么,是否存在完全兼容TDD的JavaScript单元测试工具?


当前回答

因果报应或量角器

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

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

它们都是由Angular团队制作的。您可以使用任意断言库。

视频:因果报应开始了

相关:

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

优点:

Uses Node.js, so compatible with Win/OS X/Linux Run tests from a browser or headless with PhantomJS Run on multiple clients at once Option to launch, capture, and automatically shut down browsers Option to run server/clients on development computer or separately Run tests from a command line (can be integrated into ant/maven) Write tests xUnit or BDD style Supports multiple JavaScript test frameworks Auto-run tests on save Proxies requests cross-domain Possible to customize: Extend it to wrap other test-frameworks (Jasmine, Mocha, QUnit built-in) Your own assertions/refutes Reporters Browser Launchers Plugin for WebStorm Supported by NetBeans IDE

缺点:

不支持Node.js(即后端)测试 没有Eclipse插件(目前) 既往无检测记录

mocha.js

我完全没有资格评论mocha.js的特点、优点和缺点, 但它是我在JS社区中信任的人推荐给我的。

据其网站报道,其功能列表如下:

browser support simple async support, including promises test coverage reporting string diff support JavaScript # API for running tests proper exit status for CI support etc auto-detects and disables coloring for non-ttys maps uncaught exceptions to the correct test case async test timeout support test-specific timeouts growl notification support reports test durations highlights slow tests file watcher support global variable leak detection optionally run tests that match a regexp auto-exit to prevent "hanging" with an active loop easily meta-generate suites & test-cases mocha.opts file support clickable suite titles to filter test execution node debugger support detects multiple calls to done() use any assertion library you want extensible reporting, bundled with 9+ reporters extensible test DSLs or "interfaces" before, after, before each, after each hook arbitrary transpiler support (coffee-script etc) TextMate bundle

yolpo

它不再存在,而是重定向到sequential.js

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

AVA

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

最小且快速 简单的测试语法 同时运行测试 强制编写原子测试 没有隐式全局变量 每个测试文件的隔离环境 在ES2015中编写测试 承诺支持 发电机功能支持 异步功能支持 可观察到的支持 增强的断言 可选TAP o 跳跃 干净的堆栈跟踪

Buster.js

一个用Node.js构建的JavaScript测试运行器。非常模块化和灵活。它有自己的断言库,但如果您愿意,也可以添加自己的断言库。断言库是分离的,因此您还可以将其与其他测试运行程序一起使用。不要使用assert(!…)或expect(…).not…,它使用了refute(…),这是一个很好的转折。

一个浏览器JavaScript测试工具包。它使用浏览器自动化进行浏览器测试(想想JsTestDriver), QUnit风格的静态HTML页面测试,在无头浏览器中进行测试(PhantomJS, jsdom,…)等等。来看看概览吧! 一个Node.js测试工具包。您将得到相同的测试用例库、断言库等。这对于混合浏览器和Node.js代码也很有用。用Buster.JS编写测试用例,并在Node.js和真正的浏览器中运行。

视频:Buster.js Getting started (2:45)

优点:

Uses Node.js, so compatible with Win/OS X/Linux Run tests from a browser or headless with PhantomJS (soon) Run on multiple clients at once Supports Node.js testing Don't need to run server/clients on development computer (no need for IE) Run tests from a command line (can be integrated into ant/maven) Write tests xUnit or BDD style Supports multiple JavaScript test frameworks Defer tests instead of commenting them out SinonJS built-in Auto-run tests on save Proxies requests cross-domain Possible to customize: Extend it to wrap other test-frameworks (JsTestDriver built in) Your own assertions/refutes Reporters (xUnit XML, traditional dots, specification, tap, TeamCity and more built-in) Customize/replace the HTML that is used to run the browser-tests TextMate and Emacs integration

缺点:

仍处于测试阶段,所以可能会有bug 没有Eclipse/IntelliJ插件 不像TestSwarm *那样按操作系统/浏览器/版本对结果进行分组。但是,它会在测试结果中打印浏览器名称和版本。 没有以前的测试结果的历史,如TestSwarm * 截至2014年5月,在windows上不能完全工作

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

测试群

https://github.com/jquery/testswarm

正如TestSwarm在GitHub网页上所说的那样,TestSwarm正式不再处于积极开发状态。他们推荐Karma、浏览器运行器或Intern。

茉莉花

这是一个行为驱动的框架(如下引语所述),熟悉Ruby或Ruby on Rails的开发人员可能会感兴趣。语法基于用于Rails项目测试的RSpec。

Jasmine规格可以从HTML页面(以qUnit方式)或测试运行器(如Karma)运行。

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

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

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

库尼特

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/

不然

另一个很棒的工具是Christian Johansen的sinon.js,他是《测试驱动JavaScript开发》一书的作者。他自己这样描述:

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

实习生

Intern网站提供了与列表中其他测试框架的直接特性比较。它提供了比任何其他基于javascript的测试系统更多的开箱即用的功能。

JEST

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

来看看他们的演讲吧:https://www.youtube.com/watch?v=cAKYQpTC7MA

更好的是:开始行动

其他回答

巴斯特JS

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

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

MochiKit有一个名为SimpleTest的测试框架,它似乎已经流行起来。 这是原作者的一篇博客文章。

我们在Java to Javascript代码生成器ST-JS (http://st-js.org)中添加了JUnit集成。框架为测试的代码和单元测试生成相应的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;
  }
}

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

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

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

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

作为一个专业人士,你可以“在实际浏览器上运行”,但在我的经验中,这是一个缺点,因为它很慢。但是它的价值在于缺乏对非浏览器替代品的充分的JS模拟。如果你的JS足够复杂,只有在浏览器中测试就足够了,但还有其他几个选项可以考虑:

HtmlUnit:“它有相当好的JavaScript支持(还在不断改进中),甚至能够与相当复杂的AJAX库一起工作,根据你想使用的配置模拟Firefox或Internet Explorer。”如果它的模拟对您的使用来说足够好,那么它将比驱动浏览器快得多。

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

敏捷:Watir API运行在HtmlUnit支持的JRuby上。

或类似的

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

当然,如果HtmlUnit不够好,你必须驱动浏览器,那么你可能会考虑用Watir来驱动你的JS。