为什么功能测试不够?单元测试提供什么?

时间:2008-10-08 11:49:01

标签: unit-testing tdd functional-testing

我刚与我的首席开发人员进行过对话,他们不同意单元测试是必要或重要的。在他看来,具有足够高的代码覆盖率的功能测试应该足够,因为任何内部重构(接口更改等)都不会导致需要重写或重新检查测试。

我尝试了解释,但没有走得太远,并认为你们可以做得更好。 ;-)所以......

功能测试不提供的单元测试代码有什么好的理由?如果您只有功能测试,会有什么危险?

编辑#1 感谢所有出色的答案。我想通过功能测试补充一点,我并不仅仅意味着对整个产品进行测试,而是对产品中的模块进行测试,而不是在必要时进行模拟的单元测试的低级别等等。另请注意我们的功能测试是自动的,并且持续运行,但它们只需要比单元测试更长的时间(这是单元测试的一大优势)。

我喜欢砖与房子的例子。我想我的主要开发人员说的是测试房子的墙壁就足够了,你不需要测试单个砖......: - )

8 个答案:

答案 0 :(得分:16)

脱离我的头顶

  • 单元测试可以轻松重复。写一次,运行数千次,不需要人工,反馈比功能测试快得多
  • 单元测试测试小单元,因此立即指向发生错误的正确“扇区”。功能测试指出错误,但它们可能由大量模块引起,即使在合作中也是如此。
  • 我几乎没有把界面改变称为“内部重构”。接口更改往往会破坏大量代码,并且(在我看来)强制新的测试循环而不是没有。

答案 1 :(得分:9)

单元测试是指开发人员查看代码失败的地方

功能测试是为了让企业查看代码是否符合他们的要求

答案 2 :(得分:5)

  

单元测试是指开发人员查看代码失败的地方

     

功能测试是为了让企业查看代码是否符合他们的要求

单元测试正在检查您是否正确制造了砖块

功能测试是检查房屋是否符合客户的需求。

它们是不同的东西,但如果前者已经实施,后者会更容易。

答案 3 :(得分:4)

如果功能测试失败,找到问题的根源可能会困难得多,因为您每次都在有效地测试整个代码库。相比之下,单元测试划分了潜在的问题区域。如果所有其他单元测试成功但这个,则可以确保问题出在您正在测试的代码中而不是其他地方。

答案 4 :(得分:1)

在开发周期中应尽快捕获错误 - 错误从设计转移到代码,或代码到测试,或者(希望不是)测试到生产会增加修复它所需的成本和时间。

我们的商店仅凭这个原因执行单元测试(我确信还有其他原因,但这对我们来说已经足够了。)

答案 5 :(得分:0)

如果您使用纯粹的极限编程/敏捷开发方法,则始终需要进行单元测试,因为它们是开发的要求。

在纯XP / Agile中,根据将要对应用程序执行的测试来制定所有要求

  • 功能测试 - 生成功能需求。
  • 单元测试 - 生成函数或对象要求。

除此之外,单元测试可用于持续跟踪功能要求。

即。如果您需要更改函数的工作方式,但输入字段和输出保持不变。然后,单元测试是跟踪可能出现问题的最佳方法,因为您只需要运行测试。

答案 6 :(得分:0)

TDD/BDD中,编写程序需要进行单元测试。这个过程

  

测试失败 - >代码 - >通过测试 - >重构 - >重复

链接的文章还提到了TDD / BDD的好处。总结:

  • 非常接近消除使用调试器(我现在只在测试中使用它,很少用于那些)
  • 代码不能长时间保持凌乱
  • 内置API的文档示例
  • 强制松耦合

该链接还有一个(愚蠢的)TDD / BDD示例,但它是PowerPoint(ew),所以here是一个HTML版本。

答案 7 :(得分:0)

假设您已经一整套功能测试,检查每个可用的用例,并考虑添加单元测试。由于功能测试将捕获所有可能的错误,因此单元测试无法帮助捕获错误。然而,与单元测试,集成测试和功能测试的组合相比,使用功能测试存在一些权衡。

  • 单元测试运行得更快。如果您曾经在一个大型项目上工作,测试套件需要花费数小时才能运行,您就可以理解为什么快速测试非常重要。
  • 根据我的经验,实际上,功能测试更可能是片状的。例如,有时无头capybara-webkit浏览器由于某种原因无法访问您的测试服务器,但您重新运行它并且工作正常。
  • 单元测试更容易调试。假设单元测试已经发现了一个错误,那么就可以更容易,更快速地确定问题的确切位置。

另一方面,假设您决定只保留功能测试而添加任何单元测试

  • 如果您需要重新构建整个系统,则可能不必重写任何测试。如果你有单元测试,很多可能会被删除或重写。
  • 如果您需要重新构建整个系统,则无需担心回归。如果您依靠单元测试来覆盖极端情况,但是您被迫删除或重写这些单元测试,那么新单元测试比旧单元测试更容易出错。
  • 一旦你已经设置了功能测试环境并且你已经超越了学习曲线,编写额外的功能测试通常比单元测试,集成测试和功能测试的组合更容易编写并且通常更容易编写