【问题标题】:Should I unit test my JavaScript?我应该对我的 JavaScript 进行单元测试吗?
【发布时间】:2011-01-01 20:55:42
【问题描述】:

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

我希望获得一些提示,了解如何开始对已经有大量 JavaScript 的应用程序使用单元测试(好吧,大约 500 行,不是很大,足以让我怀疑我是否有回归这被忽视了)。您建议如何开始以及我将在哪里编写测试?

(例如它的 rails 应用程序,哪里是我的 JS 测试的合乎逻辑的地方,如果它们可以进入 /test 目录会很酷,但它在公共目录之外,因此不可能.. . 错了吗?)

【问题讨论】:

  • 顺便说一句,500 行不算什么。 :P
  • 是的,我知道,但我绝对想在它失控之前解决它......你知道的。
  • 当然。祝你好运,争吵代码有时就像放牧猫一样。
  • 还可以查看这篇描述使用 JavaScript 进行测试驱动开发的博文,我认为这是一篇不错的文章 [msdn.microsoft.com/en-us/scriptjunkie/ff452703]

标签: javascript jquery unit-testing


【解决方案1】:

好吧,从JsUnit 开始。不过,听起来您一般对单元测试更感兴趣。

你从单元测试中得到的东西(如果他们做得对的话)是:

  • 如您所述,检测代码中的回归的能力
  • 更轻松的集成,因为您的每一段代码都已经过自己的测试
  • 清楚地了解您的代码的预期(和非预期)使用方式

单元测试基本上应该触及代码中的任何public 方法。有时您可能有理由测试私有方法,我相信您可以决定何时进行。目标很简单:

  • 测试该方法使用正确的输入是否正确
  • 错误输入测试方法是否正确。

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

有时,当人们编写单元测试时,他们会故意“删除”任何集成代码(即,从数据库、文件或业务逻辑返回其他数据的方法调用)并让它们返回静态数据。这有助于您更加自信,您只是在测试您正在测试的逻辑中存在的代码。

您可能想read on 了解有关良好和不良单元测试实践的更多信息。

编辑:我对在 Ruby on Rails 中执行此操作了解不多,但您可以考虑看看 some other people are doing 是什么。最终,您可用的工具和测试结构将取决于您的框架和语言。

【讨论】:

  • 没问题,祝你好运!当你第一次进行单元测试时可能会觉得有点奇怪,但如果你做得对,它绝对可以帮助你保持代码正常工作。
  • 我还建议阅读 Martin Feathers 的《有效地使用遗留代码》一书,了解一般测试想法,并启用对已经存在的代码的测试和修改(与测试驱动开发相对) - TDD,从测试开始,填写代码)。
【解决方案2】:

我发现使用 javascript 进行单元测试非常有帮助。单元测试将弥补语言中类型安全的不足。它还允许您快速验证在不同浏览器中运行的代码。

对于我的测试,我使用 QUnit 作为测试运行器,并使用 JSMock 进行模拟。我使用 firebug 来调试它们。

用于学习 Javascript 测试的教育资源比 C# 或 Java 少。事情的测试方式不同,因为它是一种动态语言……最好用 C# 或 Java 开始测试。

在阅读 www.xunitpatterns.com 上的材料之前,我并没有真正有效地编写单元测试。因此,如果您刚刚开始,我会说买这本书并阅读它。

【讨论】:

  • 更新:现在我建议使用 Jasmine 而不是 QUnit,请参阅 pivotal.github.com/jasmine
  • 出于好奇,为什么是 Jasmine 而不是 QUnit?
  • 一些原因:设置/拆卸更加顺畅和灵活。间谍非常适合修改依赖项...
【解决方案3】:

对于 Rails,我推荐Blue Ridge。它是ScrewUnit、一些rake任务的打包,以及在浏览器之外运行测试的能力(通过Rhino)。我们进行了很多 Javascript 测试。与提到的其他工具相比,这些测试与 RSpec 更相似,因此它的思维方式转变较少……效果很好!

要开始,最好的方法就是开始在网络上为其他在这方面取得成功的人进行探索。 github上有例子。

【讨论】:

    【解决方案4】:

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

    因此,由于 JavaScript 单元测试的工作量很大,我倾向于在集成测试中测试更粗粒度的东西。例如:canoo-webtest 包含一个 java-script 解释器。您伪造用户操作(例如单击按钮)并触发 javascript。所以你间接测试。

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

    【讨论】:

      【解决方案5】:

      Working Effectively with Legacy Code 是您可以找到的关于将测试合并到旧代码中的最佳指南之一。就您而言,您不需要担心大量代码。只需开始将其放在您可以使用的地方,并考虑如何更轻松地构建代码以进行一般测试。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-07-23
        • 1970-01-01
        • 1970-01-01
        • 2014-03-25
        • 1970-01-01
        相关资源
        最近更新 更多