【问题标题】:JavaScript unit test tools for TDD用于 TDD 的 JavaScript 单元测试工具
【发布时间】:2010-09-22 23:39:28
【问题描述】:

我研究并考虑了许多 JavaScript 单元测试和测试工具,但一直找不到合适的选项来保持完全符合 TDD。那么,有没有完全符合 TDD 的 JavaScript 单元测试工具呢?

【问题讨论】:

    标签: javascript unit-testing tdd


    【解决方案1】:

    KarmaProtractor

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

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

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

    截屏:Karma Getting started

    相关

    优点

    • 使用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 包

    yolpo

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

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

    AVA

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

    • 最小而快速
    • 简单的测试语法
    • 同时运行测试
    • 强制编写原子测试
    • 没有隐式全局变量
    • 每个测试文件的隔离环境
    • 在 ES2015 中编写测试
    • 承诺支持
    • 生成器功能支持
    • 异步功能支持
    • 可观察到的支持
    • 增强的断言
    • 可选的 TAP o 输出
    • 清理堆栈跟踪

    Buster.js

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

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

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

    截屏:Buster.js Getting started (2:45)

    优点

    • 使用node.js,兼容Win/OS X/Linux
    • 使用 PhantomJS 从浏览器或无头运行测试(很快)
    • 一次在多个客户端上运行
    • 支持 NodeJS 测试
    • 无需在开发计算机上运行服务器/客户端(无需 IE)
    • 从命令行运行测试(可以集成到 ant/maven)
    • 编写测试 xUnit 或 BDD 样式
    • 支持多种 JavaScript 测试框架
    • 推迟测试而不是注释掉它们
    • SinonJS 内置
    • Auto-run tests on save
    • 代理请求跨域
    • 可以定制:
      • 扩展它以包装其他测试框架(内置 JsTestDriver)
      • 你自己的断言/反驳
      • Reporters(xUnit XML、传统点、规范、tap、TeamCity 等内置)
      • 自定义/替换用于运行浏览器测试的 HTML
    • TextMate 和 Emacs 集成

    缺点

    • 仍处于测试阶段,因此可能有问题
    • 没有适用于 Eclipse/IntelliJ 的插件(还没有)
    • 不像 TestSwarm * 那样按操作系统/浏览器/版本对结果进行分组。但是,它会在测试结果中打印出浏览器名称和版本。
    • 没有以前的测试结果记录,例如 TestSwarm *
    • 在 Windows 上不能完全工作as of May 2014

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

    TestSwarm

    https://github.com/jquery/testswarm

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

    Jasmine

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

    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.jsTest-Driven JavaScript Development 的作者 Christian Johansen。最好由他自己描述:

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

    Intern

    Intern Web site 提供了与此列表中其他测试框架的直接功能比较。它提供了比任何其他基于 JavaScript 的测试系统更多的开箱即用功能。

    JEST

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

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

    更好的是:Getting Started

    【讨论】:

    • Jasmine 可以使用 V8 无头工作,但您也可以交互地使用它。虽然对于 Jasmine 来说 DOM 不是必需的,但 您的代码库 可能会访问 DOM。有了纪律,就可以消除、保护条件或为访问 DOM 的部分代码提供模拟,并完全脱离 HTML 固定装置运行测试。您还可以使用附加组件获得命令行支持和固定装置。
    • @rehevkor5:Selenium 用于集成测试,而这里的工具用于单元测试。 typemock.com/unit-tests-integration-tests
    • 几乎每个测试运行器都依赖于浏览器。 Wtf,没有人在服务器端运行单元测试only????
    • 在不同的答案中拆分/划分每个备选方案不是更好吗?它可能会使当前对此的投票无效,但我认为这是最有意义的。
    • @Raisen 您可以使用 Babel 将 ES 2015 插入其中的大多数,但 Sindre Sorhus 的 AVA 已内置。
    【解决方案2】:

    看看the Dojo Object Harness (DOH) unit test framework,它几乎是独立于框架的 JavaScript 单元测试工具,并且没有任何 Dojo 依赖项。 Unit testing Web 2.0 applications using the Dojo Objective Harness 有很好的描述。

    如果您想自动化 UI 测试(许多开发人员的痛点)- 请查看 doh.robot (暂时关闭。更新:其他链接 http://dojotoolkit.org/reference-guide/util/dohrobot.htmldijit.robotx (暂时停止)。后者是为验收测试而设计的。 更新:

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

    【讨论】:

    • 感谢 Dojo Object Harness 的建议,我永远不会找到它。我很欣赏其他建议 - 但一步一步。
    • 我在以前的项目中实际使用过它,发现它非常宝贵。但话又说回来,我无法比较 - 没有使用任何其他 TDD 框架。
    • 感谢您报告死链接。我更新了其中一个,并会在它们出现在新网站后立即替换机器人文档的链接。
    • 我不喜欢 DOH 的一点是断言失败时不会报告行号。手动将它们注释掉并重新运行测试。
    • Dojo 正在用 TheIntern 测试框架取代 DOH。 TheIntern 非常强大并且有很大的改进。 sitepen.com/blog/2014/02/18/…
    【解决方案3】:

    Chutzpah - A JavaScript Test Runner

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

    【讨论】:

    • 我刚开始使用 Chutzpah 在 Visual Studio 中运行 Jasmine 测试 - 它很好地集成:右键单击测试文件并选择“运行 js 测试”或“在浏览器中运行 JS 测试”。我使用 JSTestDriver 运行相同的 jasmine 测试。我更喜欢 Chutzpah,因为我在测试文件的顶部指定了我依赖的文件。对于 JSTestDriver,我需要一个单独的配置文件。
    【解决方案4】:

    Wikipedia 条目的 JavaScript 部分 List of Unit Testing Frameworks 提供了可用选项列表。它指示它们是在客户端、服务器端还是两者都工作。

    【讨论】:

      【解决方案5】:

      BusterJS

      还有来自Christian Johansen 的BusterJS,他是Test Driven Javascript Development 和Sinon 框架的作者。来自网站:

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

      【讨论】:

        【解决方案6】:

        google-js-测试:

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

        • 极快的测试启动和执行时间,无需运行 浏览器。
        • 在通过和失败测试的情况下输出清晰、可读的输出。
        • 一个可以简单刷新的browser-based test runner 每当 JS 发生变化时。
        • 样式和语义类似于 C++ 的 Google Test
        • 需要最少样板代码的内置模拟框架(例如,没有 $tearDown$verifyAll) 具有基于 Google C++ Mocking Framework 的样式和语义。

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

        【讨论】:

        • 似乎对 Github 的兴趣几乎为零,而且它需要基于 unix 的操作系统,而且我是一个巨大的 windows 粉丝,我不会离开我的房子而不亲吻我的 windows 机器再见。
        【解决方案7】:

        我们现在将 Qunit 与 Pavlov 和 JSTestDriver 一起使用。这种方法对我们很有效。

        QUnit

        Pavlov, source

        jsTestDriver, source

        【讨论】:

        • 您是否愿意解释一下它们在整个测试过程中的作用以及它们之间的联系?
        • 抱歉,很久以前很多合同工才想起这方面的细节。
        【解决方案8】:

        作为专业人士,您“在实际浏览器上运行”,但根据我的经验,这是一个缺点,因为它很慢。但使其有价值的是非浏览器替代品缺乏足够的 JS 仿真。可能是如果您的 JS 足够复杂,只需要在浏览器中进行测试就足够了,但还有几个选项需要考虑:

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

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

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

        或类似

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

        当然,如果 HtmlUnit 不够好,你必须驱动浏览器,那么你可以考虑Watir to drive your JS

        【讨论】:

          【解决方案9】:

          YUI 也有一个testing frameworkThis video 来自雅虎!剧院是一个很好的介绍,虽然前面有很多关于 TDD 的基础知识。

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

          【解决方案10】:

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

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

          要了解有关可让您定义单元测试的 JS 类的更多信息,请参阅在线 API viewer

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

          【讨论】:

            【解决方案11】:

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

            【讨论】:

              【解决方案12】:

              你应该看看env.js。有关如何使用 env.js 编写单元测试的示例,请参阅 my blog

              【讨论】:

                【解决方案13】:

                MochiKit 有一个名为 SimpleTest 的测试框架似乎已经流行起来。 这是blog post from the original author

                【讨论】:

                • SimpleTest - 另一个不错的选择。我很高兴我没有在这里做调查工作;-)
                猜你喜欢
                • 1970-01-01
                • 2021-07-13
                • 2023-03-05
                • 2011-03-14
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                相关资源
                最近更新 更多