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

43

我的主要JavaScript框架是jQuery,因此我希望我的单元测试和模拟框架与之兼容。我宁愿不引入另一个JavaScript框架。

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

是否有更好的工具可以推荐?哪些工具适合您使用?


Jack库/链接似乎已经失效。 - Alex Nolasco
使用Grunt进行QUnit测试会更加容易。 - Steven McConnon
Jack https://github.com/keronsen/jack - Anders B
14个回答

22

我认为截至本文撰写时,Jack是JavaScript最好的模拟框架。主要原因是适用于JavaScript的东西很可能不适用于像Java这样的强类型语言。

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

例如,对于 JsMockito,您必须制作模拟对象,然后将其传递给您的软件测试对象(SUT)。SUT必须直接调用模拟对象。因此,您被迫将SUT编码为构造函数或以参数形式接收所有依赖项的函数。(有时,这种实现方式是很好的,但并非在每种情况下都是最佳选择。如果您的模拟框架设计强制您的实现方法,则尾巴摇着狗。)

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

JavaScript是一种与Java(和C#等)不同的语言。它允许使用不同的实现方式。依赖注入在JavaScript中仍然是一个有价值的工具,但不再是唯一的选择。你的模拟框架需要知道并尊重这个事实。Jack以及其他几个人都知道并遵循这个规则,但其中Jack似乎是最成熟且具有丰富特性的。


不太想点赞,但这篇文章真的很好地阐述了JS中mocking的概念。 - Adam Tolley

20

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

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

jqUnit是QUnit的修改版本,它添加了设置、拆卸和断言函数,这些函数更符合xUnit框架的典型特点,并将所有内容封装在一个全局变量中。

测试运行器页面的可视界面很好,允许您深入了解每个测试方法中的每个断言。编写测试非常容易,您可以直接在testRunner页面上运行测试代码[8]。这样可以轻松且可见地进行DOM测试。

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

优点

  • 支持异步操作
  • 适用于DOM测试
  • 测试始终按照添加到套件中的顺序依次运行
  • 使用firebug在测试页面上进行调试
  • 如果使用jqUnit,则语法类似于JUnit,但如果使用QUnit,则学习简单

缺点

  • 实现自动化可能会很困难

4
现在可以去掉其中一个缺点:QUnit 不再需要 jQuery。 - pope
另一个缺点也已经被移除:您现在可以使用NQUnit从.NET启动自动化QUnit测试(http://robdmoore.id.au/blog/2011/03/13/nqunit-javascript-testing-within-net-ci/)。 - Adrian Grigore
同时,最后一个缺点可以通过使用http://code.google.com/p/js-test-driver/来解决。 - gavenkoa

13

我不确定为什么没有人提到 JsTestDriver!它是唯一一个实际按照你在其他语言中使用单元测试工具所期望的方式运作的JavaScript测试工具之一。

无需接触浏览器即可运行测试,可以与 IDE 集成,并可与持续集成系统集成...哦,它很快,可以同时在多个浏览器中运行测试。

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


7

YUI测试
使用YUI测试进行TDD

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

与jsUnit一样,YUI测试配有自己的日志记录控制台,可以输出信息、警告和错误,以及每个测试的结果。

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

YUI测试采用BSD许可证。

优点

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

缺点

  • 自动化实现不是微不足道的,但比其他框架容易一些

3

还可以查看http://sinonjs.org/

它具有测试间谍、测试存根、模拟对象、假定时器、虚假的XMLHttpRequest (XHR)、虚假服务器、沙盒和断言。

它可以与QUnit一起使用,这是一个优点。


2

链接已经失效: "抱歉!无法找到请求的页面。" - Peter Mortensen

1

我使用Screw Unit测试框架,并编写了自己的模拟库jsMocha,在我所在的公司已经广泛使用了6个月以上。


1

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


1
“yeld”?您是指“yield”吗? - Peter Mortensen

1

关于JavaScript的模拟,可以看一下qMock,这是我和同事编写的一个框架,用来补充我们使用QUnit的测试。虽然后者非常适合单元测试,但它并不允许进行非常有效的异步/业务逻辑测试。我们还没有将任何版本标记为稳定版,但那里有一些不错的文档,如果你检出SVN存储库,你会看到qmock本身有单元测试,这些测试相当自解释。

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


0
我们一直在使用 jsspec。如果你喜欢 rspec 和 BDD,它非常棒。我刚看到 Justin Gehtland 的一篇关于“无头”使用它的文章

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接