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


当前回答

我们在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;
  }
}

其他回答

你应该看看env.js。关于如何使用env.js编写单元测试的例子,请参阅我的博客。

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

因果报应或量角器

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

更好的是:开始行动

我们在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;
  }
}

google-js-test:

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

极快的测试启动和执行时间,无需运行 浏览器。 在通过和失败测试的情况下,干净、可读的输出。 基于浏览器的测试运行程序,可以简单地进行刷新 每当JS被改变。 样式和语义类似于谷歌Test for c++。 一个内置的模拟框架,只需要最少的样板代码(例如no $tearDown或$verifyAll),样式和语义基于谷歌 c++模拟框架。

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