单元,功能,验收和集成测试之间有什么区别?

And*_*rew 787 testing terminology definition

单元,功能,验收和集成测试(以及我未提及的任何其他类型的测试)之间有什么区别?

Mar*_*son 1336

根据您的外观,您会得到略有不同的答案.我已经读了很多关于这个主题的内容,这是我的精华; 再次,这些是略微愚蠢的,其他人可能不同意.

单元测试

测试最小的功能单元,通常是方法/函数(例如,给定具有特定状态的类,在类上调用x方法应该导致y发生).单元测试应该集中在一个特定的功能上(例如,当堆栈为空时调用pop方法应该抛出InvalidOperationException).它触及的一切都应该在记忆中完成; 这意味着测试代码被测代码不应该:

  • 呼唤(非平凡的)合作者
  • 访问网络
  • 点击数据库
  • 使用文件系统
  • 旋转一个线程
  • 等等

任何缓慢/难以理解/初始化/操作的依赖都应该使用适当的技术进行存根/模拟/处理,这样您就可以专注于代码单元正在做什么,而不是它的依赖关系.

简而言之,单元测试尽可能简单,易于调试,可靠(由于外部因素减少),执行速度快,并且有助于证明程序中最小的构建块在组合之前按预期运行.需要注意的是,虽然你可以证明它们完全孤立地工作,但代码单元在组合时可能会爆炸,这使我们...

集成测试

集成测试建立在单元测试的基础上,通过组合代码单元并测试生成的组合正确运行.这可以是一个系统的内部结构,也可以将多个系统组合在一起以做一些有用的事情.此外,将集成测试与单元测试区分开来的另一个因素是环境.集成测试可以并将使用线程,访问数据库或执行所需的任何操作,以确保所有代码不同的环境更改都能正常工作.

如果你已经构建了一些序列化代码并且单元测试了它的内部而没有触及磁盘,你怎么知道它在你加载并保存到磁盘时会起作用?也许你忘了刷新和处理文件流.也许你的文件权限不正确,你已经在内存流中测试了内部.唯一可以确定的方法是使用最接近生产的环境来测试它"真实".

主要的优点是,他们会发现单元测试无法发现的错误,例如布线错误(例如A类实例意外收到B的空实例)和环境错误(它在我的单CPU机器上运行正常,但是我的同事的4核心机无法通过测试).主要缺点是集成测试会触及更多代码,可靠性降低,故障难以诊断且测试难以维护.

此外,集成测试不一定证明完整的功能有效.用户可能不关心我的程序的内部细节,但我这样做!

功能测试

功能测试通过将给定输入的结果与规范进行比较来检查特定功能的正确性.功能测试不涉及中间结果或副作用,只是结果(他们不关心在执行x之后,对象y具有状态z).它们被编写为测试规范的一部分,例如"调用函数Square(x),参数为2,返回4".

验收测试

验收测试似乎分为两种类型:

标准验收测试涉及在整个系统上执行测试(例如,通过Web浏览器使用您的网页),以查看应用程序的功能是否满足规范.例如,"单击缩放图标应将文档视图放大25%." 没有真正的连续结果,只有通过或失败的结果.

优点是测试用简单的英语描述,并确保整个软件功能完整.缺点是你已经在测试金字塔上移动了另一个级别.验收测试触及大量代码,因此追踪故障可能会非常棘手.

此外,在敏捷软件开发中,用户验收测试涉及创建测试以镜像在开发期间由软件客户创建的用户故事.如果测试通过,则意味着软件应满足客户的要求,并且可以认为故事是完整的.验收测试套件基本上是以域特定语言编写的可执行规范,该语言描述了系统用户使用的语言中的测试.

结论

他们都是互补的.有时,关注一种类型或完全避开它们是有利的.对我来说,主要的区别在于,一些测试从程序员的角度来看待事物,而其他测试则以客户/最终用户为中心.

  • +1.@Mark Simpson功能和验收测试可以概括为"系统测试"吗?端到端测试适合哪些地方?(根据我的口味,词汇量太多了) (18认同)
  • 尽管投票很多,但这是完全错误的.单元测试甚至不测试"琐碎"的合作者; 必须嘲笑任何注入的依赖.功能测试不测试"行为"; 他们只测试"功能",即"f(A)返回B".如果副作用很重要,那就是"行为".如果这些包括系统调用,它们也是"系统"测试,如"行为系统测试".(参见下面的testerab @.)"接受"测试是"行为系统测试"的一个子集,涵盖了全栈."集成"向上测试,模拟实际使用情况; 它测试所有依赖关系可以在实践中集成. (15认同)
  • @MarkSimpson虽然你的答案非常好,但我想了解一些关于功能测试的细节.我的意思是在你的答案中,对我来说,很难区分功能测试和单元测试.我希望你有时间做这件事,继续做好工作! (10认同)
  • @ cdunn2001:别担心,建设性的批评总是好的:)你的评论告诉了我一些我不知道的事情,并在某种程度上清理了我的术语.我总是热衷于从热衷于测试的开发人员那里学习新东西.我记得我第一次发现MiškoHevery的博客 - 它就像一个宝库:) (7认同)
  • @Franz我正在谈论通过隔离代码单元并测试它们来降低风险的能力和方便性.你是对的,我使用的语言有点宽松,因为测试无法证明代码没有错误. (3认同)
  • @benregn理想情况下,您的Continuous Integration服务器会运行所有测试.这就是持续整合的重点.单元测试很快,应该在每次提交后运行.如果你的功能测试太慢,你可能会经常运行它们,但它们仍然有助于运行它们. (2认同)
  • @ cdunn2001:至于其余部分,我只是让我理解了这些测试是什么,因为我发现大多数来源都给出了相当模糊的定义(加上敏捷开发使用的类似术语混淆了水域).我已经纠正了一些错误并删除了一些含糊不清的条款,谢谢.听起来你有一些有用的东西可以添加,所以你能添加一个答案而不是一个脚注吗?此外,非常感谢文章/书籍的链接,干杯! (2认同)
  • @ mark-simpson:我不是故意批评你*!你有300多个upvotes清楚地传达了常见的用法.相反,我正在为测试领域的*歧视*进行一场失败的战斗.至于保持"琐碎"的合作者,是的,我喜欢这个,但我称之为*功能*测试.如果你今天在网上搜索,你会发现*单元测试*正在失去光彩.它经常将测试与实现细节结合起来.它因动态语言而变得流行,我们必须保证执行每一行代码,但*functional*一直更易于维护. (2认同)

小智 87

重要的是你知道这些术语对你的同事意味着什么.例如,当他们说"完全端到端"测试时,不同的群体对他们的意思略有不同的定义.

我最近遇到了Google的命名系统进行测试,我更喜欢它 - 他们只使用Small,Medium和Large来绕过参数.为了确定测试适合哪个类别,他们会考虑几个因素 - 运行需要多长时间,访问网络,数据库,文件系统,外部系统等等.

http://googletesting.blogspot.com/2010/12/test-sizes.html

我认为您当前工作场所的小,中,大差异可能与Google不同.

然而,这不仅仅是关于范围,而是关于目的.Mark对于测试的不同观点(例如程序员与客户/最终用户)的观点非常重要.

  • 为谷歌测试命名的东西+1,因为它有助于提供一些关于为什么各种组织/人有不同的测试定义的观点. (6认同)

Max*_*xim 61

http://martinfowler.com/articles/microservice-testing/

Martin Fowler的博客文章讲述了测试代码的策略(特别是在微服务架构中),但大多数都适用于任何应用程序.

我将引用他的摘要幻灯片:

  • 单元测试 - 在应用程序中运行最小的可测试软件,以确定它们是否按预期运行.
  • 集成测试 - 验证组件之间的通信路径和交互以检测接口缺陷.
  • 组件测试 - 将运行的软件的范围限制在被测系统的一部分,通过内部代码接口操作系统,并使用测试双精度将被测代码与其他组件隔离.
  • 合同测试 - 验证外部服务边界处的交互,声明它符合消费服务所期望的合同.
  • 端到端测试 - 验证系统是否满足外部要求并实现其目标,从头到尾测试整个系统.

  • 这不是Fowler的文章btw,只是发布在那里.合同测试是在客户开始使用您的服务之后进行的测试,然后编写测试来检查您是否没有为特定客户端破坏某些内容,即更改服务API. (2认同)

Sha*_*hah 29

单元测试 - 顾名思义,此方法在对象级别进行测试.针对任何错误测试各个软件组件.该测试需要了解程序,并创建测试代码以检查软件是否按预期运行.

功能测试 - 在不了解系统内部工作的情况下进行.测试人员将通过提供不同的输入并测试生成的输出来尝试通过遵循要求来使用系统.该测试也称为闭箱测试或黑盒测试.

验收测试 - 这是在将软件移交给客户端之前进行的最后一次测试.这样做是为了确保开发的软件满足所有客户要求.有两种类型的验收测试 - 一种由开发团队成员执行,称为内部验收测试(Alpha测试),另一种由客户或最终用户执行(Beta测试)

集成测试 - 已经进行单元测试的各个模块相互集成.一般来说,遵循两种方法:

1)自上而下
2)自下而上


小智 17

这很简单.

  1. 单元测试:这是由具有编码知识的开发人员实际进行的测试.此测试在编码阶段完成,它是白盒测试的一部分.当一个软件用于开发时,它被开发成一段代码或称为一个单元的代码片.这些单元的单独测试称为开发人员进行的单元测试,以发现某些人为错误,如缺少语句覆盖等.

  2. 功能测试:此测试在测试(QA)阶段完成,它是黑盒测试的一部分.以前编写的测试用例的实际执行情况.此测试实际上由测试人员完成,他们找到站点中任何功能的实际结果,并将此结果与预期结果进行比较.如果他们发现任何差异,那么这是一个错误.

  3. 验收测试:知道为UAT.这实际上是由测试人员以及开发人员,管理团队,作者,编写者以及参与此项目的所有人完成的.确保项目最终准备好免费提供.

  4. 集成测试:代码单元(在第1点中解释)相互集成以完成项目.这些代码单元可以使用不同的编码技术编写,也可以使用不同的编码技术,因此开发人员可以完成此测试,以确保代码的所有单元与其他单元兼容,并且不存在任何集成问题.

  • 我们永远不应该以“这很简单”开始回答,特别是如果它是一个像这个这样复杂的话题。 (4认同)
  • @OlegTsyba 在问题得到解答四年后才得到答案。 (2认同)

小智 5

我将通过一个实际的例子向您说明这一点,而没有理论上的东西:

开发人员编写代码。尚未实现GUI。在此级别上的测试将验证功能是否正常工作以及数据类型是否正确。测试的这一阶段称为单元测试。

开发GUI并将应用程序分配给测试人员后,他与客户一起验证业务需求并执行不同的方案。这称为功能测试。在这里,我们将客户需求与应用程序流进行映射。

集成测试:假设我们的应用程序具有两个模块:人力资源和财务。人力资源模块已交付并经过测试。现在已开发出Finance,并且可以进行测试。相互依赖的功能现在也可用,因此在此阶段,您将测试两者之间的通信点,并验证它们是否按要求工作。

回归测试是另一个重要的阶段,在进行任何新开发或错误修复后即完成。其目的是验证以前的工作功能。