单元测试或功能测试?

Wil*_*ler 27 .net unit-testing functional-testing testdrivendesign

我最近听说过单元测试的功能测试.

我知道单元测试从最原子的形式测试给定代码片段的每种可能性.但功能测试怎么样?

这听起来像只测试代码是否有效,但它是否像单元测试一样可靠?

我被告知有两个关于这个问题的学校.某些人更喜欢单元测试,其他人更喜欢功能测试.

有没有什么好的资源,链接,书籍,任何参考文献或者你们中的任何一个能够解释和完善我的主题的人?

谢谢!

jas*_*son 26

单元测试与功能测试不是一个xor,而是一个and.单元测试是关于单独测试单元的,而功能测试是关于在整合中测试整体(所有单元是否一起正常工作?).

两者都是良好软件工程实践的必要组成部分.


Tru*_*ill 25

杰森的回答是正确的.不同类型的测试具有不同的目的,并且可以分层以获得最佳结果(良好的设计,满足规范,减少缺陷).

  • 单元测试=驱动器设计(使用测试驱动开发或TDD)
  • 集成测试=将所有部分协同工作
  • 客户验收测试=是否符合客户的要求
  • 手动测试=通常涵盖UI; 专用测试人员可以找到自动化失误的原因
  • 负载测试=系统在实际数据量方面的表现如何

这些类别之间存在一些重叠; 例如,单元测试可以指定行为.

还有其他人; 比大多数人更关心,请参阅软件测试.

人们错过的一点是单元测试是孤立地测试代码片段.例如,良好的单元测试不会影响数据库.这有两个好处:它使测试运行得很快,因此你会更频繁地运行它们,它会迫使你编写松散耦合的类(更好的设计).

你问了资源; 我推荐Roy Osherove的书"用.NET中的例子进行单元测试的艺术".虽然没有一本书是完美的,但这本书给出了许多关于编写好测试的优秀指导.

编辑:对于针对现有软件编写测试,没有什么比Michael Feathers的" 有效使用遗留代码 "一书更好.

  • 单元测试不一定能推动设计.在TDD中,它确实在其他范例中确保您的代码按照您的预期运行,并且对类的内部的更改不会破坏单个功能部分 (3认同)
  • 一些其他类型的测试(仅供讨论):安全测试=适当的代码攻击面.所有攻击媒介都处理得好吗?性能/并发测试=您的应用程序一次处理几千个用户的程度如何? (3认同)

RHS*_*ger 11

单元测试测试您的代码单元(方法等),以确保它们按照您的期望执行.

功能测试测试您的系统设计,以确保碎片正确交互.如果你编写一个带有int和int的命令并返回一个字符串并完全测试它,你可以确定它是有效的.但是,如果您没有进行系统测试,您可能永远不会注意到其余代码认为它可以接受null,但它不能.

两种类型的测试都很重要.

编辑:为gbjbaanb所说的添加略有不同的视图:

  • 单元测试=我的代码有效
  • 功能测试=我的设计工作
  • 集成测试=我的代码正确使用您的第三方内容(数据库等)
  • 工厂验收测试=我的系统工作
  • 网站验收测试=您的代码很糟糕,这完全不是我要求的!?!


gbj*_*anb 6

  • 单元测试=最低,粒度级别.
  • 功能测试=中等,模块化水平.
  • 集成测试=更高的应用程序级别
  • 工厂验收测试=看到一切正常
  • 现场验收测试=看到它全部失败:)

以上所有内容都很有用,但它们并不相互排斥.你应该做大部分时间,但你花在每个部分上的时间取决于你从中得到的结果,就是这样.如果您的代码太模块化而无法轻松进行单元测试,那么请花费精力进行功能测试.如果你正在编写一个小型组件库,花时间对它们进行单元测试,如果你正在为军用导弹编写控制系统,你肯定应该对它们进行现场验收测试(即使失败也很有趣:))