TDD的JavaScript单元测试工具


716

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

Answers:


1506

业力量角器

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

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

两者都是由Angular团队制作的。您可以在任何一个声明库中使用。

截屏视频:业力入门

相关

优点

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

缺点

mocha.js

我完全没有资格评论mocha.js的功能,优点和缺点,但是我信任JS社区的人才向我推荐了它。

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

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

约尔波

约尔波

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

Yolpo是可视化javascript执行的工具。鼓励Javascript API开发人员编写用例来展示和讲述他们的API。这样的用例构成了回归测试的基础。

AVA

AVA徽标

具有对ES2015的内置支持的未来派测试运行程序。即使JavaScript是单线程的,由于其异步特性,Node.js中的IO仍可以并行发生。AVA利用此优势并同时运行测试,这对于IO繁重测试尤其有用。此外,测试文件作为单独的进程并行运行,从而为每个测试文件提供了更好的性能和隔离的环境。

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

Buster.js

使用Node.js构建的JavaScript测试运行程序。非常模块化和灵活。它带有自己的断言库,但是您可以根据需要添加自己的断言库。该断言库解耦,所以你也可以与其他测试跑步者使用它。代替使用assert(!...)or expect(...).not...,它使用refute(...)了一个不错的扭曲恕我直言。

浏览器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测试
  • 不需要在开发计算机上运行服务器/客户端(不需要IE)
  • 从命令行运行测试(可以集成到ant / maven中)
  • 编写测试xUnit或BDD样式
  • 支持多种JavaScript测试框架
  • 推迟测试而不是将其注释掉
  • 内置SinonJS
  • 保存时自动运行测试
  • 代理请求跨域
  • 可以自定义:
    • 扩展它以包装其他测试框架(内置JsTestDriver)
    • 您自己的断言/反驳
    • 记者(xUnit XML,传统圆点,规范,水龙头,TeamCity等)
    • 自定义/替换用于运行浏览器测试的HTML
  • TextMate和Emacs集成

缺点

  • 测试版中仍存在Stil,因此可能会出现越野车
  • 尚无Eclipse / IntelliJ插件(尚未)
  • 不按OS /浏览器/版本将结果分组,例如TestSwarm *。但是,它会在测试结果中打印出浏览器名称和版本。
  • 没有以前的测试结果(如TestSwarm)的历史记录*
  • 截至2014年5月,在Windows上无法完全正常运行

* TestSwarm还是一个持续集成服务器,而Buster.js需要一个单独的CI服务器。但是,它确实会输出xUnit XML报告,因此应该易于与HudsonBamboo或其他CI服务器集成。

测试群

https://github.com/jquery/testswarm

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

茉莉花

茉莉花

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

茉莉花规格可以从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/

诗乃

另一个很棒的工具是Test-Driven JavaScript Development的作者C​​hristian Johansen的sinon.js。最能描述自己的:

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

实习生

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

笑话

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

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

更好:入门


2
茉莉花可以使用V8轻松运行,但是您也可以交互使用它。尽管对于Jasmine而言DOM是不必要的,但是您的代码库可能会访问DOM。通过纪律,可以消除,保护条件或为访问DOM并完全运行测试的部分代码提供仿真,而HTML夹具除外。您还可以使用附加组件获得命令行支持和固定装置。
jerseyboy 2012年

2
@ rehevkor5:Selenium用于集成测试,而此处的工具用于单元测试。typemock.com/unit-tests-integration-tests
gregers 2012年

26
几乎每个测试跑步者都依赖浏览器。WTF,难道没有人在服务器端运行单元测试吗????

2
将每个备选方案拆分/划分为不同的答案会更好吗?这可能会使当前对此票的投票无效,但我认为这是最有意义的。
cregox

2
@Raisen您可以将ES 2015年到大部分与巴贝尔,但AVA通过的Sindre Sorhus有它内置的。
gregers

64

看一下Dojo对象线束(DOH)单元测试框架,它是JavaScript单元测试的几乎与框架无关的工具,并且没有任何Dojo依赖项。使用Dojo Objective Harness对Web 2.0应用程序进行单元测试时,对此有很好的描述。

如果要自动化UI测试(许多开发人员的苦恼 ),请查看doh.robot (临时向下更新:其他链接http://dojotoolkit.org/reference-guide/util/dohrobot.htmldijit .robotx (暂时关闭)。后者专为验收测试而设计。更新:

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


感谢Dojo Object Harness的建议,我永远都找不到。我很欣赏其他建议-一次只能执行一个步骤。
Mark Levison

实际上,我在以前的项目中使用过它,并发现它非常有价值。但是话又说回来,我无法比较-没有使用任何其他TDD框架。
Rakesh Pai

感谢您报告无效链接。我更新了其中一个,并在将它们放置在新网站上后立即替换了指向机器人文档的链接。
尤金·拉祖金

我不喜欢DOH的一件事是断言失败时不报告行号。手动将其注释掉,然后重新运行测试。
Aram Kocharyan 2014年

Dojo正在用TheIntern测试框架替换DOH。TheIntern非常强大,并且已进行了大量改进。 sitepen.com/blog/2014/02/18/…– 2014
user64141

34

Chutzpah-JavaScript测试运行程序

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


7
我刚刚开始使用Chutzpah在Visual Studio中运行Jasmine测试-它已经很好地集成了:右键单击测试文件,然后选择“运行JS测试”或“在浏览器中运行JS测试”。我使用JSTestDriver运行相同的茉莉花测试。我更喜欢Chutzpah,因为我在测试文件的顶部指定了要依赖的文件。对于JSTestDriver,我需要一个单独的配置文件。
GarethOwen 2012年


14

巴斯特

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

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


10

google-js-test:

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

  • 非常快速的测试启动和执行时间,而无需运行浏览器。
  • 在通过和未通过测试的情况下,输出均清晰,可读。
  • 一个基于浏览器的测试运行时JS改变,可以简单地被刷新。
  • Google Test for C ++ 类似的样式和语义。
  • 内置的模拟框架,它需要最少的样板代码(例如,no $tearDown$verifyAll),并具有基于Google C ++ Mocking Framework的样式和语义。

当前没有适用于Windows的二进制文件


1
在Github上似乎几乎没有什么兴趣,它也需要基于Unix的OS,而且我是Windows的忠实粉丝,我不会离开我的房子而不会与Windows机器告别。
vsync


6

作为专家,您可以“在实际的浏览器上运行”,但是根据我的经验,这是一个缺点,因为它运行缓慢。但是,使之具有价值的是非浏览器替代品缺乏足够的JS仿真。如果您的JS非常复杂,以至于仅在浏览器中进行测试就足够了,但是还可以考虑以下两个选项:

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

但是,也许HtmlUnit具有足够好的JS支持,但是您不喜欢Java吗?然后也许:

名人:在由HtmlUnit支持的JRuby上运行的Watir API。

或类似

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

当然,如果HtmlUnit不够好,并且您必须驱动浏览器,则可以考虑使用Watir来驱动JS



3

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

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

要查找有关可用于定义单元测试的JS类的更多信息,请参见在线 API查看器

对于自动UI测试(基于Selenium RC),请签出Simulator项目。



3

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

单元测试运行程序打开所需的http端口(并在测试完成后将其关闭),因此无需单独的服务器。该框架操纵Java stacktrace,以便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;
  }
}

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.