单元测试或功能测试?

时间:2010-02-09 15:44:40

标签: .net unit-testing functional-testing testdrivendesign

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

我理解单元测试从最原子的形式测试给定代码片段的每种可能性。但是功能测试呢?

这对我来说只是测试代码是否有效,但它是否与单元测试一样可靠?

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

是否有任何好的资源,链接,书籍,任何参考资料或者其中一位能够解释和完善我的主题的人?

谢谢!

8 个答案:

答案 0 :(得分:26)

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

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

答案 1 :(得分:25)

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

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

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

还有其他人;比大多数人都知道的更多,请参阅Software Testing

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

你要求资源;我推荐Roy Osherove的书The Art of Unit Testing with Examples in .NET。虽然没有一本书是完美的,但这本书给出了许多关于编写好测试的优秀指导。

编辑:对于针对现有软件编写测试,没有什么比Michael Feathers的书Working Effectively with Legacy Code更胜一筹。

答案 2 :(得分:11)

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

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

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

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

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

答案 3 :(得分:6)

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

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

答案 4 :(得分:4)

功能测试,也称为System testing,旨在测试整个系统,并验证功能要求是否得到满足。

Unit testing旨在测试“单位”,即系统从孤立构建的功能或方法。它有时被称为开发人员测试。事实之后单元测试可能很难,这就是TDD在代码之前编写测试的原因。

那些是补充,因为这些单位可以独立工作,而不是整合在一起,或者他们可以通过单元测试,而不是满足所有产品要求。

答案 5 :(得分:3)

单元测试和功能测试有两种不同的结果。

单元测试验证一小段代码是否按预期工作。它通常由开发人员完成,以确保代码正常工作。它们通常也由测试框架自动化。

功能测试通过程序中的某个路径验证功能是否按预期工作。它们通常由软件上的人执行,确保程序以他们应该为用户的方式工作。因此,它是更高级别,因此可以同时测试多个单元。

我认为两者都很重要。如果您的资源有限,并且必须选择技术,我认为这取决于您创建的产品,但对于我所做的事情(人类通过某些按钮使用的汽车控制产品),功能测试是最重要的。它检查并确保当用户获得产品时,它会完成它应该做的事情。这并不意味着我们应该选择退出单元测试,但如果推动即将推出,功能对于确保良好的用户体验并将产品推向市场至关重要。

如果您生产数据库引擎(或其他一些不一定面向用户的产品),单元测试可能就是您真正应该做的事情。

答案 6 :(得分:3)

单元测试测试一段代码并确认程序员另一段代码正在做它应该做的事情。在测试驱动开发中,在编写代码导致测试通过之前,首先编写单元测试并观察其失败。程序员对单元测试很感兴趣。单元测试可以快速执行。

功能测试测试您的黑匣子要求,并演示了一个用户功能。例如,如果我按下大红色按钮,铃声开始振铃。功能测试甚至可能不测试代码。也许有一个机械过程会导致铃声按下按钮。客户对功能测试感兴趣,因为他们确认如果以他们理解的方式工作的高级过程。它们通常执行起来很慢。

答案 7 :(得分:2)

在大多数开发工作中都有两个地方。

单元测试用于测试小型代码单元,以确保它们按预期工作。

功能测试用于测试系统的整体功能是否符合预期。

它们处于不同的级别,都应该使用它们。