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

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

241053 次浏览

根据你看的地方,你会得到略有不同的答案。我读过很多关于这个主题的文章,这是我的提炼;同样,这些有点模糊,其他人可能不同意。

单元测试

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

  • 召唤(非平凡的)合作者
  • 进入网络
  • 进入数据库
  • 使用文件系统
  • 旋转一根线

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

简而言之,单元测试尽可能简单、易于调试、可靠(由于减少了外部因素)、执行速度快,并有助于证明程序中最小的构建块在组合在一起之前就按预期运行。需要注意的是,尽管你可以证明它们在孤立的情况下完美地工作,但代码单元在组合时可能会爆炸,这让我们不得不…

集成测试

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

如果你已经构建了一些序列化代码并在不接触磁盘的情况下对其内部进行了单元测试,你怎么知道在加载和保存到磁盘时它会工作?也许你忘记刷新和处理文件流。也许你的文件权限不正确,你已经在内存流中测试了内部。确定的唯一方法是使用最接近生产环境的“真实”测试它。

主要优点是能发现单元测试找不到的bug,比如布线bug(比如A类的一个实例意外收到了B的一个空实例)和环境bug(在我的单核机上运行得很好,但是我同事的4核机上通不过)。主要缺点是集成测试涉及的代码多,可靠性低,故障更难诊断,测试更难维护。

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

功能测试

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

验收测试

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

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

优点是测试用简单的英语描述,并确保软件作为一个整体,功能完整。缺点是您在测试金字塔上又提升了一个层次。验收测试涉及大量代码,因此跟踪失败可能很棘手。

此外,在敏捷软件开发中,用户验收测试包括创建测试,以反映软件客户在开发过程中创建的用户故事。如果测试通过,则意味着软件应该满足客户的要求,并且故事可以被认为是完整的。验收测试套件基本上是用特定领域的语言编写的可执行规范,该规范以系统用户使用的语言描述测试。

结论

它们都是互补的。有时专注于一种类型或完全避开它们是有利的。对我来说,主要的区别是一些测试从程序员的角度看待事物,而另一些则使用客户/最终用户的焦点。

重要的是你知道这些术语对你的同事意味着什么。例如,当他们说“完整的端到端”测试时,不同的小组对他们的意思的定义会略有不同。

我最近偶然发现了谷歌的测试命名系统,我很喜欢它——他们只使用小型、中型和大型来绕过参数。为了决定测试属于哪个类别,他们会考虑几个因素——运行需要多长时间,它是否访问网络、数据库、文件系统、外部系统等。

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

我想,您当前的工作场所的小型、中型和大型之间的区别可能与Google不同。

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

单元测试:对应用程序中的单个模块或独立组件的测试称为单元测试,单元测试将由开发人员完成。

联调:结合所有模块并测试应用程序,以验证模块之间的通信和数据流是否正常工作,此测试也由开发人员执行。

功能试验检查应用程序的单个功能意味着功能测试

验收测试此测试由最终用户或客户完成,无论构建应用程序是否符合客户要求,以及客户规范,这都是已知的验收测试

我将用一个实际的例子来解释这一点,而不是理论上的东西:

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

当开发GUI并将应用程序分配给测试人员时,他会与客户端验证业务需求并执行不同的场景。这称为功能测试。这里我们将客户端需求与应用程序流映射。

集成测试:假设我们的应用程序有两个模块:HR和财务。HR模块之前已交付并测试。现在财务已开发并可用于测试。相互依赖的功能现在也可用,因此在此阶段,您将测试两者之间的通信点,并验证它们是否按要求工作。

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

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

Martin Fowler的博客文章谈到了测试代码的策略(尤其是在微服务架构中),但其中大部分都适用于任何应用程序。

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

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

这很简单。

  1. 单元测试:实际上是由具有编码知识的开发人员进行的测试。这项测试在编码阶段完成,它是白盒测试的一部分。当软件进行开发时,它被开发成一段代码或一段代码,称为单元。这些单元的单独测试称为单元测试,由开发人员完成,以找出某种人为错误,如语句覆盖率缺失等。

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

  3. 验收测试:即UAT。这实际上是由测试人员、开发人员、管理团队、作者、作者和所有参与该项目的人完成的。以确保项目最终准备好交付,没有错误。

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

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

功能测试 -在不了解系统内部工作的情况下进行。测试人员将尝试通过提供不同的输入和测试生成的输出来按照要求使用系统。这种测试也称为闭盒测试或黑盒测试。

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

集成测试 -已经接受单元测试的单个模块相互集成。通常遵循这两种方法:

1)自顶向下
2)自下而上