我的主要 JavaScript 框架是jQuery,所以我希望我的单元测试和模拟框架与它兼容。我宁愿不必介绍另一个 JavaScript 框架。
我目前使用QUnit进行单元测试,使用Jack进行模拟,但我对 JavaScript 的整个单元测试还是很陌生。
有没有更好的工具可以推荐?什么对你有用?
我认为 Jack 是撰写本文时最好的 JavaScript 模拟框架。主要原因是适合 JavaScript 的东西不一定适合 Java 这样的强类型语言。
许多 JavaScript 模拟框架都受到 Java 模拟框架的启发(例如优秀的 JsMockito)。但问题在于它们需要依赖注入,因为这是在 Java 中使用模拟的唯一合理方法。但是在 JavaScript 中,有很多方法可以使用 mocking,而且你不会被迫到处使用依赖注入。
例如,使用 JsMockito,您必须制作模拟,然后将这些模拟传递到您的被测软件 (SUT)。SUT 必须直接调用模拟。因此,您被迫将 SUT 编码为将其所有依赖项作为参数的构造函数或函数。(有时,这是实现它的好方法,但并非在所有情况下。如果您的模拟框架的设计强制您的实现方法,那么尾巴就会摇摆不定。)
在 JavaScript 中,很容易“劫持”任何函数。因此,有很多方法可以构建一些东西,这样您就可以模拟它的一部分,而无需显式地将其依赖项注入其中。例如,Jack 允许您模拟任何函数,无论它是公共的还是本地对象上的。从那里你可以监视它,存根它,或表达对它的期望。关键是:一旦你模拟了一个函数,任何对该原始函数的调用都将被定向到你的 mock。换句话说,即使调用了原始的、未模拟的函数,你的模拟仍然会被使用。结果,您不会被迫注入依赖项,尽管在需要它的情况下您当然可以这样做。
JavaScript 是与 Java(和 C# 等)不同的语言。它允许不同的实现习惯用法。依赖注入仍然是 JavaScript 工具箱中的一个有价值的工具,但它不再是唯一的游戏。您的模拟框架需要了解并尊重这一事实。杰克和其他几个人这样做,但在这样做的人中,杰克似乎是最成熟和功能最丰富的。
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 许可证
优点
缺点
我不确定为什么没有人提到JsTestDriver!如果您在其他语言中使用过单元测试工具,它必须是唯一能够真正像您期望的那样工作的 JavaScript 测试工具之一。
运行测试可以在不接触浏览器的情况下完成,你可以将它与 IDE 集成,你可以将它与持续集成系统集成......哦,它速度很快,并且可以同时在多个浏览器中运行测试。
你也可以使用其他的测试框架,比如 YUITest,让它变得更好。
YUI Test 是雅虎用户界面(YUI) 库的测试框架。Yahoo 使用它来测试自己的库,并且具有类似于 JUnit 的语法。
与 jsUnit 一样,YUI Test 带有自己的日志控制台,除了每次测试的结果之外,它还可以输出信息、警告和错误。
YUI 还提供了以 JSON 或 XML 格式发送结果报告的能力。
YUI Test 是 BSD 许可的。
优点
缺点
另请查看 http://sinonjs.org/
它有测试间谍、测试存根、模拟、假计时器、假XMLHttpRequest (XHR)、假服务器、沙盒和断言
它确实与 QUnit 一起工作,到目前为止这是一个加分项。
这是对可用于 JavaScript 的模拟框架的一个很好的回顾:
http://testdrivenwebsites.com/2010/05/06/java-script-mock-frameworks-comparison
对于 JavaScript 中的模拟,请查看qMock,这是我和同事编写的一个框架,用于补充我们对 QUnit 的使用。尽管后者非常适合单元测试,但它不允许非常有效的异步/业务逻辑测试。我们没有将任何版本“标记”为稳定版本,但那里有一些不错的文档,如果您查看 SVN 存储库,您会看到 qmock 本身有其背后的单元测试,这是不言自明的。
哦,为了在构建过程中自动化测试,我们使用了一个简单的 Selenium 脚本来浏览我们的测试套件(每个 JavaScript 文件一个测试页面),并“监听”通过或失败的 CSS 类(由 QUnit 添加)。这也适用于 Internet Explorer 和 Firefox 2、AFAIK。
对于 Firefox 开发,我爱上了基于 MozUnit的UXU ,但它仍然很活跃。它有很好的功能,比如模拟服务器和 sleep / yield 方法。
我使用了Screw Unit 测试框架,并编写了我自己的名为jsMocha 的模拟库,该库在我工作的公司中被大量使用了6 个多月。
我知道您在要求兼容 jQuery 的框架,但我想将script.aculo.us加入其中以确保完整性。他们有一个不错的单元测试套件。
当我查看 CrossCheck 时,它似乎非常强大,但我们目前还没有将它整合到我们的构建过程中。它具有无浏览器的优势,因此应该在自动化的构建和测试场景中运行良好。
JsUnit可以从浏览器通过其 Eclipse 插件运行,也可以通过 Ant 任务自动运行。您创建了一个带有一堆测试函数的 HTML 页面,这些函数必须以前缀“test”命名,包括您正在测试的 JavaScript 文件。当函数中的任何断言失败时,整个函数都会失败并停止执行。这些测试的运行顺序没有保证。您可以创建setup()
和teardown()
功能。
许可证:GPL、GLPL 和 MPL
优点
缺点
我们一直在使用jsspec。如果您喜欢 rspec 和BDD ,那就太好了。我刚刚看到Justin Gehtland 的一篇关于使用它“无头”的文章。
你可以试试HtmlUnit ,它在一年前有一个jQuery 兼容版本。
HtmlUnit 的优点是它不驱动浏览器,所以速度很快。
缺点是它没有驱动浏览器,所以有些 JavaScript 东西不起作用。但是抵消了他们可以运行 jQuery 测试,因此 JavaScript 支持可能足以满足您的需要。