42

我的主要 JavaScript 框架是jQuery,所以我希望我的单元测试和模拟框架与它兼容。我宁愿不必介绍另一个 JavaScript 框架。

我目前使用QUnit进行单元测试,使用Jack进行模拟,但我对 JavaScript 的整个单元测试还是很陌生。

有没有更好的工具可以推荐?什么对你有用?

4

14 回答 14

21

我认为 Jack 是撰写本文时最好的 JavaScript 模拟框架。主要原因是适合 JavaScript 的东西不一定适合 Java 这样的强类型语言。

许多 JavaScript 模拟框架都受到 Java 模拟框架的启发(例如优秀的 JsMockito)。但问题在于它们需要依赖注入,因为这是在 Java 中使用模拟的唯一合理方法。但是在 JavaScript 中,有很多方法可以使用 mocking,而且你不会被迫到处使用依赖注入。

例如,使用 JsMockito,您必须制作模拟,然后将这些模拟传递到您的被测软件 (SUT)。SUT 必须直接调用模拟。因此,您被迫将 SUT 编码为将其所有依赖项作为参数的构造函数或函数。(有时,这是实现它的好方法,但并非在所有情况下。如果您的模拟框架的设计强制您的实现方法,那么尾巴就会摇摆不定。)

在 JavaScript 中,很容易“劫持”任何函数。因此,有很多方法可以构建一些东西,这样您就可以模拟它的一部分,而无需显式地将其依赖项注入其中。例如,Jack 允许您模拟任何函数,无论它是公共的还是本地对象上的。从那里你可以监视它,存根它,或表达对它的期望。关键是:一旦你模拟了一个函数,任何对该原始函数的调用都将被定向到你的 mock。换句话说,即使调用了原始的、未模拟的函数,你的模拟仍然会被使用。结果,您不会被迫注入依赖项,尽管在需要它的情况下您当然可以这样做。

JavaScript 是与 Java(和 C# 等)不同的语言。它允许不同的实现习惯用法。依赖注入仍然是 JavaScript 工具箱中的一个有价值的工具,但它不再是唯一的游戏。您的模拟框架需要了解并尊重这一事实。杰克和其他几个人这样做,但在这样做的人中,杰克似乎是最成熟和功能最丰富的。

于 2010-10-27T06:35:00.820 回答
19

QUnit
jqUnit
使用 QUnit 和 jqUnit 编写 JavaScript 测试

QUnit 是 jQuery JavaScript 框架的单元测试框架。测试框架本身使用 jQuery 库,但是可以为任何 JavaScript 编写测试,并且不需要使用 jQuery 的代码。

jqUnit 是 QUnit 的修改版本,它添加了更典型的 xUnit 框架的 setup、teardown 和 assert 函数,并将所有内容封装在一个全局变量中。

testrunner 页面的可视化界面很好,让您可以深入查看每个测试方法中的每个断言。编写测试相当容易,您可以直接在 testRunner 页面 [8] 上运行测试代码。这允许简单且可见的 DOM 测试。

QUnit:MIT 或 GPL(选择) jqUnit:MIT 许可证

优点

  • 异步支持
  • 适合 DOM 测试
  • 测试总是按照它们添加到套件中的顺序依次运行
  • 使用 firebug 在测试页面上调试
  • 如果使用 jqUnit,语法类似于 JUnit,但如果使用 QUnit,则易于学习

缺点

  • 自动化将难以实施
于 2008-10-16T18:22:56.430 回答
12

我不确定为什么没有人提到JsTestDriver!如果您在其他语言中使用过单元测试工具,它必须是唯一能够真正像您期望的那样工作的 JavaScript 测试工具之一。

运行测试可以在不接触浏览器的情况下完成,你可以将它与 IDE 集成,你可以将它与持续集成系统集成......哦,它速度很快,并且可以同时在多个浏览器中运行测试。

你也可以使用其他的测试框架,比如 YUITest,让它变得更好。

于 2009-12-12T23:20:00.410 回答
6

YUI 测试
TDD 与 YUI 测试

YUI Test 是雅虎用户界面(YUI) 库的测试框架。Yahoo 使用它来测试自己的库,并且具有类似于 JUnit 的语法。

与 jsUnit 一样,YUI Test 带有自己的日志控制台,除了每次测试的结果之外,它还可以输出信息、警告和错误。

YUI 还提供了以 JSON 或 XML 格式发送结果报告的能力。

YUI Test 是 BSD 许可的。

优点

  • 非常好的文档
  • 活跃的社区
  • 定期发布
  • 语法类似于 JUnit(测试套件、断言和设置/拆卸)
  • 异步支持
  • 适合 DOM 测试
  • 测试总是按照它们添加到套件中的顺序依次运行

缺点

  • 自动化实现起来并不简单,但比其他框架更容易实现
于 2008-10-16T18:29:29.067 回答
3

另请查看 http://sinonjs.org/

它有测试间谍、测试存根、模拟、假计时器、假XMLHttpRequest (XHR)、假服务器、沙盒和断言

它确实与 QUnit 一起工作,到目前为止这是一个加分项。

于 2011-03-25T17:41:07.487 回答
2

这是对可用于 JavaScript 的模拟框架的一个很好的回顾:

http://testdrivenwebsites.com/2010/05/06/java-script-mock-frameworks-comparison

于 2011-06-02T23:51:58.810 回答
1

对于 JavaScript 中的模拟,请查看qMock,这是我和同事编写的一个框架,用于补充我们对 QUnit 的使用。尽管后者非常适合单元测试,但它不允许非常有效的异步/业务逻辑测试。我们没有将任何版本“标记”为稳定版本,但那里有一些不错的文档,如果您查看 SVN 存储库,您会看到 qmock 本身有其背后的单元测试,这是不言自明的。

哦,为了在构建过程中自动化测试,我们使用了一个简单的 Selenium 脚本来浏览我们的测试套件(每个 JavaScript 文件一个测试页面),并“监听”通过或失败的 CSS 类(由 QUnit 添加)。这也适用于 Internet Explorer 和 Firefox 2、AFAIK。

于 2008-11-20T10:24:19.513 回答
1

对于 Firefox 开发,我爱上了基于 MozUnit的UXU ,但它仍然很活跃。它有很好的功能,比如模拟服务器和 sleep / yield 方法。

于 2009-10-30T16:02:28.403 回答
1

我使用了Screw Unit 测试框架,并编写了我自己的名为jsMocha 的模拟库,该库在我工作的公司中被大量使用了6 个多月。

于 2009-12-12T23:09:34.020 回答
0

我知道您在要求兼容 jQuery 的框架,但我想将script.aculo.us加入其中以确保完整性。他们有一个不错的单元测试套件。

于 2008-10-16T17:08:55.550 回答
0

当我查看 CrossCheck 时,它似乎非常强大,但我们目前还没有将它整合到我们的构建过程中。它具有无浏览器的优势,因此应该在自动化的构建和测试场景中运行良好。

http://thefrontside.net/crosscheck

于 2008-10-16T18:07:08.020 回答
0

JsUnit可以从浏览器通过其 Eclipse 插件运行,也可以通过 Ant 任务自动运行。您创建了一个带有一堆测试函数的 HTML 页面,这些函数必须以前缀“test”命名,包括您正在测试的 JavaScript 文件。当函数中的任何断言失败时,整个函数都会失败并停止执行。这些测试的运行顺序没有保证。您可以创建setup()teardown()功能。

许可证:GPL、GLPL 和 MPL

优点

  • 自动化相对容易实现
  • 很多功能
  • 语法类似于 JUnit

缺点

  • 不太适合 DOM 测试,因为它在 iFrame 中运行测试。
  • 不保证测试将按照编写的顺序运行。
  • 无法在 testrunner 页面上使用 Firebug。需要使用实际测试代码打开另一个选项卡。
于 2008-10-16T18:17:22.680 回答
0

我们一直在使用jsspec。如果您喜欢 rspec 和BDD ,那就太好了。我刚刚看到Justin Gehtland 的一篇关于使用它“无头”的文章。

于 2008-11-19T07:38:04.203 回答
0

你可以试试HtmlUnit ,它在一年前有一个jQuery 兼容版本。

HtmlUnit 的优点是它不驱动浏览器,所以速度很快

缺点是它没有驱动浏览器,所以有些 JavaScript 东西不起作用。但是抵消了他们可以运行 jQuery 测试,因此 JavaScript 支持可能足以满足您的需要。

于 2008-11-19T07:57:27.393 回答