【发布时间】:2010-09-22 23:39:28
【问题描述】:
我研究并考虑了许多 JavaScript 单元测试和测试工具,但一直找不到合适的选项来保持完全符合 TDD。那么,有没有完全符合 TDD 的 JavaScript 单元测试工具呢?
【问题讨论】:
标签: javascript unit-testing tdd
我研究并考虑了许多 JavaScript 单元测试和测试工具,但一直找不到合适的选项来保持完全符合 TDD。那么,有没有完全符合 TDD 的 JavaScript 单元测试工具呢?
【问题讨论】:
标签: javascript unit-testing tdd
Karma 是一个使用 Node.js 构建的 JavaScript 测试运行器,用于单元测试。
Protractor 用于端到端测试,使用 Selenium Web Driver 驱动测试。
两者都是由 Angular 团队制作的。你可以使用任何你想要的断言库。
相关:
优点:
缺点:
我完全没有资格评论 mocha.js 的特性、优势和劣势, 但它只是由我在 JS 社区中信任的人推荐给我的。
其网站报告的功能列表:
这不再存在,而是重定向到sequential.js
Yolpo 是一个可视化 javascript 执行的工具。鼓励 Javascript API 开发人员编写他们的用例来展示和讲述他们的 API。这些用例构成了回归测试的基础。
内置对 ES2015 的支持的未来派测试运行程序。尽管 JavaScript 是单线程的,但 Node.js 中的 IO 由于其异步特性而可以并行发生。 AVA 利用这一点并同时运行您的测试,这对于 IO 繁重的测试特别有用。此外,测试文件作为单独的进程并行运行,从而为每个测试文件提供更好的性能和独立的环境。
使用 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)
优点:
缺点:
* TestSwarm 也是一个持续集成服务器,而 Buster.js 需要一个单独的 CI 服务器。但是,它会输出 xUnit XML 报告,因此应该很容易与 Hudson、Bamboo 或其他 CI 服务器集成。
https://github.com/jquery/testswarm
如 GitHub 网页上所述,TestSwarm 正式不再处于积极开发中。他们推荐 Karma、browserstack-runner 或 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/
另一个很棒的工具是sinon.jsTest-Driven JavaScript Development 的作者 Christian Johansen。最好由他自己描述:
独立测试间谍、存根和模拟 用于 JavaScript。没有依赖项有效 与任何单元测试框架。
Intern Web site 提供了与此列表中其他测试框架的直接功能比较。它提供了比任何其他基于 JavaScript 的测试系统更多的开箱即用功能。
一个新的但非常强大的测试框架。它还允许基于快照的测试,这提高了测试速度并在测试方面创造了新的动态
查看他们的演讲之一:https://www.youtube.com/watch?v=cAKYQpTC7MA
更好的是:Getting Started
【讨论】:
看看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.html) 和 dijit.robotx (暂时停止)。后者是为验收测试而设计的。 更新:
参考文章解释了如何使用它们,如何模拟用户使用鼠标和/或键盘与您的 UI 交互,以及如何记录测试会话,以便您以后可以自动“播放”它。
【讨论】:
我创建了一个名为 Chutzpah 的开源项目,它是 JavaScript 单元测试的测试运行程序。 Chutzpah 使您能够从命令行和 Visual Studio 内部运行 JavaScript 单元测试。还支持在 TeamCity 持续集成服务器中运行。
【讨论】:
Wikipedia 条目的 JavaScript 部分 List of Unit Testing Frameworks 提供了可用选项列表。它指示它们是在客户端、服务器端还是两者都工作。
【讨论】:
还有来自Christian Johansen 的BusterJS,他是Test Driven Javascript Development 和Sinon 框架的作者。来自网站:
Buster.JS 是一个新的 JavaScript 测试框架。它通过在实际浏览器中自动运行测试(想想 JsTestDriver)以及 Node.js 测试来进行浏览器测试。
【讨论】:
谷歌发布的JavaScript测试框架: https://github.com/google/gjstest
- 极快的测试启动和执行时间,无需运行 浏览器。
- 在通过和失败测试的情况下输出清晰、可读的输出。
- 一个可以简单刷新的browser-based test runner 每当 JS 发生变化时。
- 样式和语义类似于 C++ 的 Google Test。
- 需要最少样板代码的内置模拟框架(例如,没有
$tearDown或$verifyAll) 具有基于 Google C++ Mocking Framework 的样式和语义。
目前没有适用于 Windows 的二进制文件
【讨论】:
【讨论】:
作为专业人士,您“在实际浏览器上运行”,但根据我的经验,这是一个缺点,因为它很慢。但使其有价值的是非浏览器替代品缺乏足够的 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。
【讨论】:
YUI 也有一个testing framework。 This video 来自雅虎!剧院是一个很好的介绍,虽然前面有很多关于 TDD 的基础知识。
这个框架是通用的,可以针对任何 JavaScript 或 JS 库运行。
您可能还对 qooxdoo 中的单元测试框架感兴趣,这是一个类似于 Dojo、ExtJS 等的开源 RIA 框架,但具有相当全面的工具链。
试试testrunner 的在线版本。提示:点击左上角的灰色箭头(应该更明显)。这是一个运行选定测试的“播放”按钮。
要了解有关可让您定义单元测试的 JS 类的更多信息,请参阅在线 API viewer。
对于自动化 UI 测试(基于 Selenium RC),请查看Simulator 项目。
【讨论】:
我们在我们的 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;
}
}
【讨论】:
MochiKit 有一个名为 SimpleTest 的测试框架似乎已经流行起来。 这是blog post from the original author。
【讨论】: