12

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

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

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

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

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

4

8 回答 8

17

在我的头顶

  • 单元测试可以毫不费力地重复。一次编写,运行数千次,无需人工,并且比从功能测试中获得的反馈快得多
  • 单元测试测试小单元,因此立即指向发生错误的正确“扇区”。功能测试会指出错误,但它们可能是由大量模块引起的,即使是在协作时也是如此。
  • 我几乎不会将接口更改称为“内部重构”。接口更改往往会破坏大量代码,并且(在我看来)强制一个新的测试循环而不是没有。
于 2008-10-08T11:52:40.460 回答
10

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

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

于 2008-10-08T12:02:11.423 回答
6

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

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

单元测试正在检查你是否正确地制造了你的积木

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

它们是不同的东西,但如果前者已经执行,后者会容易得多。

于 2008-10-08T12:13:17.033 回答
4

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

于 2008-10-08T11:53:29.460 回答
1

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

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

于 2008-10-08T12:00:44.313 回答
0

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

在纯 XP/Agile 中,所有需求都基于将对应用程序执行的测试

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

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

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

于 2008-10-08T12:19:17.647 回答
0

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

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

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

  • 非常接近于消除调试器的使用(我现在只在测试中使用它,而且很少用于那些)
  • 代码不能保持混乱超过几分钟
  • 内置 API 的文档示例
  • 强制松散耦合

该链接还有一个 TDD/BDD 的(愚蠢的)演练示例,但它在 PowerPoint(ew)中,所以这里是一个 html 版本。

于 2013-03-03T22:23:32.207 回答
0

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

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

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

  • 如果您需要重新构建整个系统,您可能不需要重写任何测试。如果你有单元测试,其中很多可能会被删除或重写。
  • 如果您需要重新构建整个系统,则不必担心回归。如果您依赖单元测试来覆盖极端情况,但您被迫删除或重写这些单元测试,那么您的新单元测试比旧单元测试更有可能出现错误。
  • Once you already have the functional test environment set up and you have gotten over the learning curve, writing additional functional tests is often easier to write and often easier to write correctly than a combination of unit tests, integration tests, and functional tests.
于 2013-11-27T05:11:43.970 回答