我最近听说过功能测试优于单元测试。
我知道单元测试会从最原子的形式测试给定代码的每一种可能性。但是功能测试呢?
在我看来,这听起来像是只测试代码是否有效,但它和单元测试一样可靠吗?
有人告诉我,这件事有两种观点。某些人更喜欢单元测试,其他人更喜欢功能测试。
是否有任何好的资源、链接、书籍、任何参考资料或你们中的任何一个可以解释和阐明我在这个主题上的道路?
谢谢!
我最近听说过功能测试优于单元测试。
我知道单元测试会从最原子的形式测试给定代码的每一种可能性。但是功能测试呢?
在我看来,这听起来像是只测试代码是否有效,但它和单元测试一样可靠吗?
有人告诉我,这件事有两种观点。某些人更喜欢单元测试,其他人更喜欢功能测试。
是否有任何好的资源、链接、书籍、任何参考资料或你们中的任何一个可以解释和阐明我在这个主题上的道路?
谢谢!
单元测试与功能测试不是一个xor
,而是一个and
. 单元测试是关于孤立地测试单元,而功能测试是关于在集成中测试整体(所有单元是否一起正常工作?)。
两者都是良好软件工程实践的必要组成部分。
杰森的回答是正确的。不同类型的测试有不同的目的,并且可以分层以获得最佳结果(良好的设计、符合规范、减少缺陷)。
这些类别之间有一些重叠;例如,单元测试可以指定行为。
还有其他人;对于大多数人想知道的更多信息,请参阅软件测试。
人们忽略的一点是单元测试是孤立地测试代码片段。例如,好的单元测试不会影响数据库。这有两个优点:它使测试运行得更快,因此您将更频繁地运行它们,并且它迫使您编写松散耦合的类(更好的设计)。
您要求资源;我推荐 Roy Osherove 的书The Art of Unit Testing with Examples in .NET。虽然没有一本书是完美的,但这本书为编写好的测试提供了许多极好的指导。
编辑:对于针对现有软件编写测试,没有什么比 Michael Feathers 的书有效地使用遗留代码更好的了。
单元测试测试您的代码单元(方法等),以确保它们按照您的期望进行。
功能测试测试您的系统设计以确保各个部分正确交互。如果您编写一个接受和 int 并返回字符串的命令并对其进行全面测试,您可以确定它可以工作。但是,如果您没有系统测试,您可能永远不会注意到其余代码认为它可以接受 null 但它不能。
两种类型的测试都很重要。
编辑:为 gbjbaanb 所说的添加一个稍微不同的观点:
以上所有内容都很有用,但它们并不相互排斥。你应该做大部分,但你花在每个部分上的时间取决于你从他们那里得到的结果,仅此而已。如果您的代码过于模块化而无法轻松进行单元测试,那么请将您的精力花在功能测试上。如果您正在编写一个小型组件库,请花时间对它们进行单元测试,如果您正在为军用导弹编写控制系统,那么您绝对应该对它们进行现场验收测试(因为即使失败了爆炸也很有趣 :))
单元测试和功能测试有两个不同的结果。
单元测试验证一小段代码是否按预期工作。它通常由开发人员完成,以确保代码正常工作。它们通常也由测试框架自动化。
功能测试通过通过程序的特定路径来验证功能是否按预期工作。它们通常由软件上的人执行,以确保程序能够按照用户应有的方式运行。因此,它是更高级别的,因此一次测试多个单元。
我认为两者都很重要。但是,如果您的资源有限,并且必须选择/选择技术,我认为这取决于您创建的产品,但是对于我所做的(人类通过某些按钮使用的汽车控制产品),功能测试是最重要的。它检查并确保当用户获得产品时,它会做它应该做的事情。这并不意味着我们应该选择退出单元测试,但如果推到推,功能是最重要的,以确保良好的用户体验和产品的推出。
例如,如果您生产数据库引擎(或其他一些不一定面向用户的产品),那么单元测试可能是您真正应该做的事情。
单元测试测试一段代码并为程序员确认另一段代码正在做它应该做的事情。在测试驱动开发中,首先编写单元测试并观察到失败,然后再编写代码导致测试通过。程序员对单元测试很感兴趣。单元测试执行速度很快。
功能测试测试您的黑盒需求,并证明某项用户功能已到位。例如,如果我按下红色的大按钮,铃声就会响起。功能测试甚至可能不是测试代码。也许有一个机械过程导致按下按钮后铃声响起。客户对功能测试很感兴趣,因为他们确认以他们理解的方式工作的高级流程。它们的执行速度通常很慢。
在大多数开发工作中,两者都有一席之地。
单元测试用于测试小代码单元,以查看它们是否按预期工作。
功能测试用于测试系统的整体功能是否符合预期。
它们处于不同的级别,都应该使用。