2008-10-08 110 views
12

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

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

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

编辑#1感谢您的所有好的答案。我想通过功能测试补充说,我并不是说只对整个产品进行测试,而是对产品中的模块进行测试,而不是对单元测试的低级别进行测试,如果有必要的话,嘲讽等。我们的功能测试是自动的,并且持续运行,但它们只比单元测试花费更长的时间(这是单元测试的一大优点)。

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

+1

关于砖的例子:砖是大规模生产的,它们都是一样的,这与功能或单位不同。 – philant 2008-10-13 19:24:48

+0

好点@支架。不知道我同意你的主要开发人员。正如在评论中提到的那样,软件单元/模块并非完全相同,并且由于各种答案中提到的所有原因,单独进行单元测试是非常重要和有用的。 – Sid 2015-04-26 15:42:19

回答

16

关闭我的头顶

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

我同意后面两点 - 但功能测试也可以自动化。 – slim 2008-10-08 12:15:28

4

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

1

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

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

9

单元测试主要是针对开发者,看看那里的代码失败

功能测试是为商家看看代码做了什么,他们问

4

单元测试主要是针对开发者,看看那里的代码失败

功能测试是为商家看看代码做了什么,他们问

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

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

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

0

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

在纯XP /敏捷一个使得基于其将要执行的应用程序

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

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

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

0

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

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

也与文中提到TDD/BDD的好处。总结:

  • 非常接近消除使用调试器(我只在测试中使用,现在,很少对那些)
  • 代码不能停留凌乱超过了几分钟
  • 用于API文档的例子内置
  • 力松耦合

链路还具有TDD/BDD的(傻)步行通过例子,但它是在PowerPoint(EW),所以here的一个html版本。

0

假设你已经有已经有一个全面的功能测试,检查每个可能的用例,你正在考虑添加单元测试。由于功能测试会捕获所有可能的错误,因此单元测试无法帮助发现错误。然而,与单元测试,集成测试和功能测试的组合相比,单独使用功能测试存在一些折衷。

  • 单元测试运行速度更快。如果您曾经参与过一个测试套件需要数小时才能运行的大型项目,那么您可以理解为什么快速测试很重要。根据我的经验,实际上,功能测试更可能是片状的。例如,有时无头帽水母浏览器由于某种原因无法到达你的测试服务器,但是你重新运行它并且工作正常。
  • 单元测试更容易调试。假设单元测试发现了一个错误,找出问题的确切位置更容易,更快速。

在另一方面,假设你决定只是保持你的功能测试和添加任何单元测试

  • 如果你需要重新设计整个系统,您可能没有重写任何测试。如果你有单元测试,其中很多可能会被删除或重写。
  • 如果您需要重新构建整个系统,则不必担心回归。如果你依靠单元测试来覆盖角落案例,但你不得不删除或重写那些单元测试,那么你的新单元测试比旧的单元测试更可能出现错误。
  • 一旦您已经建立了功能测试环境并且已经掌握了学习曲线,那么编写额外的功能测试通常比单元测试,集成测试和功能测试更容易编写,并且通常更易于正确编写。
相关问题