您使用过哪些JavaScript单元测试和模拟框架?

时间:2008-10-16 16:56:34

标签: javascript jquery unit-testing mocking qunit

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

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

还有其他人有更好的建议工具吗?什么对你有用?

14 个答案:

答案 0 :(得分:21)

我认为Jack是撰写本文时最好的JavaScript模拟框架。主要原因是,对于像Java这样的强类型语言来说,JavaScript的正确性是不可能的。

许多JavaScript模拟框架受Java模拟框架(例如优秀的JsMockito)的启发。但是这些问题是他们需要依赖注入,因为这是在Java中使用模拟的唯一合理方式。但是在JavaScript中,有很多种方法可以使用模拟,而且强制并不是在任何地方使用依赖注入。

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

在JavaScript中,很容易“劫持”任何功能。因此,有很多方法可以构建一些东西,这样你就可以模拟它的一部分,而不会明确地将它的依赖注入其中。例如,Jack允许您模拟任何函数,无论它是公共函数还是本地对象。从那里你可以窥探,存根或表达对它的期望。关键点在于:一旦你嘲笑了一个函数,任何对原始函数的调用都将转向你的模拟。换句话说,即使调用了原始的,未模拟的函数,你的模拟仍然会被使用。因此,您不必强制注入依赖项,尽管在那些需要它的情况下您肯定可以这样做。

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

答案 1 :(得分:19)

QUnit
jQUnit
Writing JS tests with QUnit and jQUnit

QUnit是jQuery JavaScript框架的单元测试框架。测试框架本身使用jQuery库,但是可以为任何JavaScript编写测试,并且不需要代码使用jQuery。 JQUnit是QUnit的修改版本,它添加了更典型的xUnit框架的setup,teardown和assert函数,并将所有内容封装在一个全局变量中。

testrunner页面的可视化界面很不错,允许您深入查看每个测试方法中的每个断言。编写测试非常简单,您可以直接在testRunner页面上运行测试代码[8]。这样可以进行简单明了的DOM测试。

QUnit:MIT或GPL(选择)jQUnit:MIT License

<强>赞成
   - 异步支持
   - 适用于DOM测试    - 测试总是按照添加到套件中的顺序依次运行    - 使用firebug进行测试页面调试    - 如果使用JQUnit,语法类似于JUnit,但如果使用QUnit,则很容易学习 的缺点
   - 自动化很难实现

答案 2 :(得分:12)

我不确定为什么没有人提到JsTestDriver!它必须是唯一的JS测试工具之一,如果您使用其他语言的单元测试工具,它实际上会像您期望的那样工作。

运行测试可以在不触摸浏览器的情况下完成,您可以将它与IDE集成,您可以将它与Continuous集成系统集成......哦,它很快,并且可以同时在多个浏览器中运行测试。 / p>

您还可以使用YUITest等其他测试框架,使其更好。

答案 3 :(得分:6)

YUI Test
TDD With YUI Test

YUI Test是Yahoo用户界面库的测试框架。它被Yahoo用来测试它自己的库,并且具有类似于jUnit的语法。

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

YUI还以JSON或XML格式提供send reports结果的能力。

YUI测试是BSD许可。

<强>赞成
   - 非常好的文档
   - 积极的社区
   - 定期发布
   - 语法类似于jUnit(测试套件,断言和设置/拆除)
   - 异步支持
   - 适用于DOM测试    - 测试总是按照添加到套件中的顺序依次运行

<强>缺点
   - 自动化实现起来并不容易,但比其他框架更难以实现

答案 4 :(得分:3)

同时退房 http://sinonjs.org/

  

测试间谍测试存根模拟假定时器假XHR假服务器沙盒断言

它与qUnit一起工作,到目前为止已经有了加分。

答案 5 :(得分:2)

这是对Javascript可用的模拟框架的一个非常好的评论:

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

答案 6 :(得分:1)

我们一直在使用jsspec jsspec。如果你喜欢rspec和BDD,这非常好。刚刚看到article by Justin Gehtland使用它“无头”。

答案 7 :(得分:1)

对于JavaScript中的模拟,请查看qMock,这是一个同事的框架,我写这篇文章是为了补充我们对QUnit的使用。虽然后者非常适合单元测试,但它不允许非常有效的异步/业务逻辑测试。我们没有“标记”任何版本稳定,但是那里有一些不错的文档,如果你签出svn,你会看到qmock本身背后有单元测试,这些都是相当不言自明的。

哦,为了自动化测试作为构建的一部分,我们使用一个简单的selenium脚本来浏览我们的测试套件(每个JS文件一个测试页面),并“监听”传递或失败的CSS类(由QUnit添加) 。这对于IE / FF2 AFAIK

来说也是无头的

答案 8 :(得分:1)

对于mozilla开发,我爱上UXU,基于MozUnit,但仍然活跃。具有很好的功能,如模拟服务器或睡眠/ yeld方法。

答案 9 :(得分:1)

我使用了螺丝单元测试框架,并且我编写了自己的mocking library called jsMocha,这在我工作的公司中使用了6个多月。

答案 10 :(得分:0)

我知道你要求与JQuery兼容的框架,但我想把script.aculo.us放到混合中以保证完整性。他们有一个unit test套件也不错。

答案 11 :(得分:0)

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

http://thefrontside.net/crosscheck

答案 12 :(得分:0)

JsUnit从浏览器,通过其Eclipse插件运行,或通过ANT任务自动运行。您创建一个包含许多测试函数的HTML页面,必须使用前缀'test'命名,包括您正在测试的JS文件。当函数中的任何断言失败时,整个函数将失败并停止执行。没有保证顺序运行这些测试。您可以创建setup()teardown()个功能。

许可证:GPL,GLPL,MPL

<强>赞成

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

<强>缺点

  • 不支持DOM测试,因为它在iFrame中运行测试。
  • 不保证测试将按照编写顺序运行。
  • 无法在testrunner页面上使用Firebug。需要使用实际测试代码打开另一个选项卡。

答案 13 :(得分:0)

你可以尝试一年前有HtmlUnitJQuery compatible release

HtmlUnit的优势在于它不会驱动浏览器,所以它很快。

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