我应该对JavaScript进行单元测试吗?

12

我很好奇是否有价值,我想开始使用QUnit,但我真的不知道从哪里开始。实际上,我不会撒谎,我对测试还是很新的,不仅限于JS。

我希望能获得一些提示,如何在已经有大量JavaScript(大约500行,并不算太多,但足以让我想知道是否存在未被发现的回归)的应用中开始使用单元测试。您会建议从哪里开始,我该在哪里编写我的测试?

(例如它是Rails应用程序,哪里是放置JS测试的逻辑位置,如果它们可以放在/test目录中,那将是很不错的,但它位于公共目录之外,因此似乎不可能...嗯,是吗?)


500行根本不算什么,顺便说一下:P - Ed Altorfer
是的,我知道,但我肯定想在它失控之前把它解决掉...你懂的。 - JP Silvashy
当然。祝你好运,编写代码有时就像赶猫一样。 - Ed Altorfer
还有这篇博客文章,它描述了JavaScript的测试驱动开发,我认为它非常不错[http://msdn.microsoft.com/en-us/scriptjunkie/ff452703]。 - jamiebarrow
5个回答

12

好的,先从JsUnit开始。但听起来您更关心单元测试。

如果单元测试做得正确,您可以获得以下好处:

  • 能够检测到代码中的回归问题,正如您所提到的
  • 集成会更加轻松,因为每个代码块已经进行了独立测试
  • 清晰地了解您的代码应该(或不应该)如何使用

单元测试应基本涉及代码中的任何公共方法。有时您可能需要测试私有方法,我相信您可以决定何时进行测试。目标很简单:

  • 测试该方法在正确输入的情况下是否执行正确的操作
  • 测试该方法在错误输入的情况下是否执行正确的操作。

在许多方面,您的测试应定义方法的功能。

有时人们编写单元测试时,有意“stub out”任何集成代码(即从数据库、文件或业务逻辑返回其他数据的方法调用)并使其返回静态数据。这可帮助您更有信心地仅测试逻辑中存在的代码。

您可能想要阅读更多有关良好和不良单元测试实践的信息。

编辑:我对在Ruby on Rails中执行此操作的方法不太了解,但您可以考虑查看其他人正在进行的工作。最终,可用工具和测试结构 取决于您的框架和语言。


没问题,祝你好运!当你第一次进行单元测试时,可能会感到有些奇怪,但如果你做得正确,它绝对可以帮助你保持代码的工作状态。 - Ed Altorfer
我还建议阅读Martin Feathers的书籍《与遗留代码有效地工作》,以获取一般测试思路,并启用对已有代码进行测试和修改(而不是测试驱动开发 - TDD,它从测试开始并填充代码)。 - jamiebarrow

2
我发现使用JavaScript进行单元测试非常有帮助。单元测试可以弥补语言类型安全性的不足。它还允许您快速验证在不同浏览器中运行的代码。
对于我的测试,我使用QUnit作为测试运行器,使用JSMock进行模拟。我使用Firebug来调试它们。
与C#或Java相比,学习JavaScript测试的教育资源较少。因为它是一种动态语言,所以测试方式也不同...最好从C#或Java开始进行测试。
直到我阅读了www.xunitpatterns.com上的材料之后,我才真正有效地编写单元测试。因此,如果您刚开始学习,请购买并阅读这本书。

更新:现在我建议使用Jasmine而不是QUnit,请参阅http://pivotal.github.com/jasmine/。 - Frank Schwieterman
出于好奇,为什么选择Jasmine而不是QUnit? - Andrew De Andrade
一些原因:设置/拆卸更加顺畅和灵活。间谍对于修改依赖项非常有效... - Frank Schwieterman

1

使用Rails时,我建议使用 Blue Ridge。它是ScrewUnit、一些rake任务的打包,以及通过Rhino运行浏览器外测试的能力。我们有相当多的Javascript测试。这些测试更类似于RSpec而不是其他提到的工具,因此对思维方式的转换较小...效果非常好!

要开始,请最好在网络上寻找其他成功案例。在Github上有一些例子。


1
在编写旧代码时,最好的指南之一是《与遗留代码有效工作》。在您的情况下,您不需要担心大量的代码。只需从现有代码中开始添加测试,并考虑如何更轻松地构建代码以允许进行一般性的测试。

1

直接测试JavaScript并不容易(因为它需要一个“外部”解释器,在生产环境中是浏览器)。因此,很难将其包含在您的持续集成环境中。

因此,由于JavaScript单元测试需要很高的工作量,我倾向于在集成测试中更加粗略地测试。例如:canoo-webtest包含一个JavaScript解释器。您可以模拟用户操作(例如点击按钮),然后触发JavaScript。因此,您进行间接测试。

但仍有一些与UI相关的JavaScript内容(例如淡入效果等)。这需要手动测试。


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