如果您已经进行功能测试,是否需要进行单元和集成测试?

时间:2009-02-17 08:54:33

标签: unit-testing testing scrum integration-testing functional-testing

我公司的人员认为单元测试是一项额外的工作,与现有的功能测试相比,它的优势更少。单元和集成测试值得吗?请注意一个大型的现有代码库,它没有考虑到测试而设计。

9 个答案:

答案 0 :(得分:12)

大多数人都不知道自动化单元测试的用途:

  1. 试验新技术
  2. 记录如何使用部分代码
  3. 确保死虫死亡
  4. 允许您重构代码
  5. 允许您更改代码的任何主要部分
  6. 创建一个较低的水印,低于该水印,产品的质量不可能下降
  7. 提高开发速度,因为现在,您知道某些东西有效(而不是希望它能在客户报告错误之前完成)。
  8. 因此,如果这些原因中的任何一个为您带来好处,那么自动化单元测试就适合您。如果没有,那就不要浪费你的时间。

答案 1 :(得分:9)

(我假设您正在使用“功能测试”来表示涉及整个系统或应用程序启动并运行的测试。)

我会在编写时单元测试 new 功能,原因有三:

  • 它可以帮助我更快地使用代码。 “单元测试失败,修复代码,单元测试通过”的周转时间通常比“功能测试失败,修复代码,功能测试通过”短批次
  • 帮助我以更清洁的方式设计我的代码
  • 它帮助我理解我的代码以及我来维护它时的意图。如果我做出改变,它会让我更有信心,我没有破坏任何东西。

(这包括错误修复,如Epaga所建议的那样。)

我强烈建议Michael Feathers'"Working Effectively with Legacy Code"向您提供有关如何开始单元测试不是为其设计的代码库的提示。

答案 2 :(得分:3)

这取决于您的功能测试是自动化还是手动完成。如果是后者,则任何类型的自动化测试套件都是有用的,因为运行这些单元/集成测试的成本远低于运行手动功能测试。您可以在那里显示真实的ROI。我建议从编写一些集成测试开始,如果将来时间/预算允许,那么请看一下单元测试。

答案 3 :(得分:3)

追溯性地为遗留代码编写单元测试通常不值得。坚持功能测试,并自动化。

然后,我们所做的是指导任何错误修复(或新功能)必须伴随单元测试,至少测试修复。这样你就可以让项目至少朝着正确的方向发展。

我必须同意Jon Skeet(我怎么能不这样做?)推荐“Working Effectively With Legacy Code”,这真的是一个有用的脱脂/阅读。

答案 4 :(得分:3)

碰巧,我昨晚在这个主题上看了a paper。作者比较了微软和IBM四个小组的项目,事后对比的是,使用单元测试和功能测试的项目以及仅使用功能测试的项目。引用作者:

  

“案例研究的结果   表示预览版本   四种产品的缺陷密度   相对减少40%至90%   对于没有使用的类似项目   TDD实践。主观上,   团队经历了15%至35%的增长   在最初的开发时间之后   采用TDD。“

这表明在为项目添加新功能时,确实值得进行单元测试。

答案 5 :(得分:1)

是的,他们是值得的,因为我开始对代码进行单元测试,所以我现在编码速度更快。我花了更少的时间修复错误,花更多的时间考虑我的代码应该做什么。

答案 6 :(得分:1)

我买了一个应用程序来咨询FAT(测试),包括21,000行切换语句。在一个案例陈述中,大多数功能单元都是几十到几百行。该应用程序有几种变体,因此交换机有很多#ifdef部分。

它不是为单元测试而设计的 - 它根本没有考虑因素。

(它的设计意义上有一个明确的,易于理解的体系结构 - malloc一个结构,向主循环发送一个用户消息,其指针指向结构作为lparam,然后在处理消息时释放它。但形式没有遵循功能,这是良好设计的核心原则。)

将单元测试添加到新功能意味着与模式的重大突破;或者您需要将代码放在除大开关之外的其他位置,并将变体选择机制的复杂性加倍,或者使用大量脚手架将消息放入队列以触发新功能。

因此,尽管单元测试新功能当然是可取的,但如果系统尚未得到很好的考虑,那么它并不总是可行的。要么重构系统以允许进行单元测试,要么进行大量测试,或者最终对代码进行基准测试并将其剪切并粘贴到现有框架中,并且单元测试代码的副本不是单元测试代码。< / p>

答案 7 :(得分:1)

当你想知道某事时,你会进行测试。如果您知道您的产品(系统,单元,服务,组件......)将起作用,则无需进行测试。如果你不确定它是否会起作用,你可能会对它有一些疑问。这些问题是否值得回答是风险和优先事项。

如果您确定您的产品能够正常运行,并且您对此产品没有任何疑问,那么还有一个问题值得一提:为什么我没有任何问题?

--- Michael B。

答案 8 :(得分:1)

单元测试确实是额外的工作,但从长远来看它会得到回报。这里有 优于集成测试的优势:

  • 你会得到一个回归套件,在重构的情况下充当安全网 - 整合测试也是如此,尽管很难说 测试涵盖了一段代码。
  • 单元测试在修改代码时立即给出反馈 - 这就是 反馈可以非常准确,指向异常的方法 是
  • 这些测试运行起来很便宜:它们运行速度非常快(通常只需几秒钟), 没有任何安装或部署,只需编译和测试。所以它们可以经常运行。
  • 一旦识别出问题,就很容易添加新的测试来重现问题, 它增加了回归套件,或回答了一个问题(“如果发生了什么,会发生什么       不使用null参数调用此函数...“)。

两者之间显然存在一些重叠,但它们是互补的,因为它们都具有优势。

现在,就像任何软件工程过程一样,必须根据测试进行测试  对项目的需求。

拥有大量的遗留代码库,遗留在未经单元测试的意义上,我愿意   建议将单元测试限制为添加到代码中的新功能    单元测试很难介绍。在这方面,  我只能第二次(第三次)推荐“工作 有效地使用遗留代码“书来帮助在现有的单元中进行单元测试 代码库。