28

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

我知道单元测试会从最原子的形式测试给定代码的每一种可能性。但是功能测试呢?

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

有人告诉我,这件事有两种观点。某些人更喜欢单元测试,其他人更喜欢功能测试。

是否有任何好的资源、链接、书籍、任何参考资料或你们中的任何一个可以解释和阐明我在这个主题上的道路?

谢谢!

4

8 回答 8

27

单元测试与功能测试不是一个xor,而是一个and. 单元测试是关于孤立地测试单元,而功能测试是关于在集成中测试整体(所有单元是否一起正常工作?)。

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

于 2010-02-09T15:47:59.960 回答
25

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

  • 单元测试 = 驱动设计(使用测试驱动开发,或 TDD)
  • 集成测试 = 让所有部分一起工作
  • 客户验收测试=是否满足客户的要求
  • 手动测试 = 经常覆盖 UI;专门的测试人员可以找到自动化遗漏的内容
  • 负载测试 = 系统在实际数据量下的表现如何

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

还有其他人;对于大多数人想知道的更多信息,请参阅软件测试

人们忽略的一点是单元测试是孤立地测试代码片段。例如,好的单元测试不会影响数据库。这有两个优点:它使测试运行得更快,因此您将更频繁地运行它们,并且它迫使您编写松散耦合的类(更好的设计)。

您要求资源;我推荐 Roy Osherove 的书The Art of Unit Testing with Examples in .NET。虽然没有一本书是完美的,但这本书为编写好的测试提供了许多极好的指导。

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

于 2010-02-09T16:22:10.600 回答
11

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

功能测试测试您的系统设计以确保各个部分正确交互。如果您编写一个接受和 int 并返回字符串的命令并对其进行全面测试,您可以确定它可以工作。但是,如果您没有系统测试,您可能永远不会注意到其余代码认为它可以接受 null 但它不能。

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

编辑:为 gbjbaanb 所说的添加一个稍微不同的观点:

  • 单元测试 = 我的代码有效
  • 功能测试 = 我的设计作品
  • 集成测试 = 我的代码正确使用了您的 3rd 方的东西(数据库等)
  • 工厂验收测试 = 我的系统工作正常
  • 现场验收测试 = 你的代码很烂,这完全不是我要求的!?!
于 2010-02-09T15:53:13.130 回答
6
  • 单元测试 = 最低的粒度级别。
  • 功能测试 = 中等、模块化水平。
  • 集成测试=更高的应用级别。
  • 工厂验收测试 = 一切正常
  • 现场验收测试 = 全部失败 :)

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

于 2010-02-09T15:50:06.823 回答
4

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

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

这些是互补的,因为单元可以独立工作而不是集成在一起,或者它们可以通过单元测试,但不能满足所有产品要求。

于 2010-02-09T16:30:01.577 回答
3

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

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

功能测试通过通过程序的特定路径来验证功能是否按预期工作。它们通常由软件上的人执行,以确保程序能够按照用户应有的方式运行。因此,它是更高级别的,因此一次测试多个单元。

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

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

于 2010-02-09T15:49:13.453 回答
3

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

功能测试测试您的黑盒需求,并证明某项用户功能已到位。例如,如果我按下红色的大按钮,铃声就会响起。功能测试甚至可能不是测试代码。也许有一个机械过程导致按下按钮后铃声响起。客户对功能测试很感兴趣,因为他们确认以他们理解的方式工作的高级流程。它们的执行速度通常很慢。

于 2012-08-29T19:42:07.667 回答
2

在大多数开发工作中,两者都有一席之地。

单元测试用于测试小代码单元,以查看它们是否按预期工作。

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

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

于 2010-02-09T15:48:39.940 回答