协慌网

登录 贡献 社区

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

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

答案

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

单元测试

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

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

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

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

集成测试

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

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

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

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

功能测试

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

验收测试

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

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

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

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

结论

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

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

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

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

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

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

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

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

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

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