单元,function,验收和集成testing有什么区别?

单元,function,接受和集成testing(以及我没有提及的任何其他types的testing)之间有什么区别?

根据你看的地方,你会得到一些不同的答案。 我已经阅读了很多关于这个主题的文章,这里是我的精华。 再次,这些稍微毛茸茸的和其他人可能不同意。

unit testing

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

  • 打电话给(非平凡的)合作者
  • 访问networking
  • 打一个数据库
  • 使用文件系统
  • 旋转一个线程
  • 等等

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

简而言之,unit testing尽可能简单,易于debugging,可靠(由于外部因素减less),可以快速执行,并且有助于certificate程序中最小的构build块在组合之前按照预期运行。 需要注意的是,虽然你可以certificate它们完全孤立地工作,但是代码的单元在组合时可能会炸毁,从而导致我们…

集成testing

集成testing基于unit testing,将代码单元与testing结果相结合,从而得到正确的组合。 这可以是一个系统的内部结构,也可以将多个系统结合在一起,做一些有用的事情。 另外,区分集成testing和unit testing的另一点是环境。 集成testing可以并将使用线程,访问数据库或执行所需的任何操作,以确保所有代码不同的环境更改都能正常工作。

如果你已经构build了一些序列化代码,并且unit testing了它的内部而没有接触到磁盘,那么当你加载并保存到磁盘时,你怎么知道它会工作呢? 也许你忘了刷新和处理文件stream。 也许你的文件权限是不正确的,你已经testing了在内存stream中使用的内部。 唯一可以肯定的方法就是使用最接近生产的环境进行“真实”testing。

主要优点是他们会发现unit testing不能接错的错误(例如A类的实例意外地收到B的空实例)和环境错误(它在我的单CPU机器上运行正常,但是我的同事的四核心机器不能通过testing)。 主要缺点是集成testing涉及更多的代码,不太可靠,故障难以诊断,testing难以维护。

此外,集成testing不一定能certificate一个完整的function。 用户可能不关心我的程序的内部细节,但我呢!

functiontesting

functiontesting通过将给定input的结果与规范进行比较来检查特定function的正确性。 functiontesting不关心自己的中间结果或副作用,只是结果(他们不关心,做x后,对象y有状态z)。 它们是为了testing规范的一部分而写的,例如“用2返回4的参数来调用函数Square(x)”。

验收testing

验收testing似乎分为两种types:

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

优点是testing用简单的英文描述,并确保软件作为一个整体function完整。 缺点是你已经把testing金字塔的层次提升了。 验收testing涉及到代码的山峰,所以追踪失败可能会非常棘手。

此外,在敏捷软件开发中,用户验收testing涉及创buildtesting,以反映软件客户在开发过程中为其创build的用户故事。 如果testing通过,这意味着软件应该符合客户的要求,故事可以被认为是完整的。 验收testing套件基本上是一个用领域特定语言编写的可执行规范,用于描述系统用户使用的语言的testing。

结论

他们都是互补的。 有时候把注意力集中在一种types上或者完全避开它们是有好处的。 对我来说主要的区别在于,一些testing从程序员的angular度来看待事物,而另一些则使用客户/最终用户的焦点。

重要的是你知道这些术语对你的同事意味着什么。 例如,不同的团体对于“完整的端到端”testing的定义会略有不同。

我最近在Google的命名系统中遇到了他们的testing,我非常喜欢它 – 他们只是使用Small,Medium和Large来绕过这些争论。 为了决定testing适用于哪个类别,他们看几个因素 – 运行需要多长时间,访问networking,数据库,文件系统,外部系统等。

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

我可以想象,当前工作场所的“小”,“中”和“大”之间的区别可能与Google的不同。

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

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

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

我会从他的总结幻灯片中引用:

  • unit testing – 练习应用程序中最小的可testing软件,以确定它们是否按预期运行。
  • 集成testing – validation组件之间的通信path和交互以检测接口缺陷。
  • 组件testing – 将被执行的软件的范围限制在被测系统的一部分,通过内部代码界面操纵系统,并使用testing双打将被测代码与其他组件隔离。
  • 合同testing – validation外部服务边界处的交互,声明它符合消费服务所期望的合同。
  • 端到端testing – validation系统是否满足外部要求并实现其目标,从端到端testing整个系统。

unit testing – 顾名思义,这个方法在对象级testing。 对各个软件组件进行任何错误testing。 该testing需要程序的知识,并且创buildtesting代码来检查软件的行为是否符合预期。

functiontesting – 在没有任何系统内部工作知识的情况下进行。 testing人员将通过提供不同的input和testing生成的输出来尝试使用系统。 这个testing也被称为封闭testing或黑盒testing。

验收testing – 这是软件交付给客户之前进行的最后一次testing。 这是为了确保开发的软件满足所有客户的要求。 有两种types的验收testing – 一个由开发团队成员执行,称为内部验收testing(Alphatesting),另一个由客户或最终用户(Betatesting)执行,

集成testing – 已经受到unit testing的各个模块相互集成。 一般来说,这两种方法是:

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

这很简单。

  1. unit testing:这是由具有编码知识的开发人员实际完成的testing。 这个testing是在编码阶段完成的,它是白盒testing的一部分。 当一个软件来开发时,它被开发成一段代码或称为代码片。 而这些单元的单独testing称为开发人员所做的unit testing,以找出某种types的人为错误,比如语句覆盖率的缺失等。

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

  3. 验收testing:知道是UAT。 这实际上是由testing人员以及开发人员,pipe理团队,作者,作者以及所有参与此项目的人员完成的。 确保项目终于可以免费发布了。

  4. 集成testing:代码单元(在第1点中说明)相互集成以完成项目。 这些代码单元可以用不同的编码技术编写,也可以是不同的版本,所以这个testing是由开发者完成的,以确保代码的所有单元与其他代码兼容,并且不存在任何集成问题。

unit testing:在应用程序中testing单个模块或独立组件是已知的unit testing,unit testing将由开发人员完成。

集成testing:结合所有模块并testing应用程序以validation通信和模块之间的数据stream是否正常工作,此testing也由开发人员执行。

检查应用程序的个别function的functiontesting意味着functiontesting

验收testing此testing由最终用户或客户完成,无论构build应用程序是否符合客户要求,以及客户规范,这被称为验收testing

我会用一个实际的例子和理论来解释你:

开发人员编写代码。 没有GUI实现。 在这个级别的testingvalidationfunction正常工作,数据types是正确的。 这个testing阶段称为unit testing。

当开发GUI时,将应用程序分配给testing人员,他会validation客户端的业务需求并执行不同的scheme。 这就是所谓的functiontesting。 这里我们将客户需求与应用程序stream程进行映射。

集成testing:假设我们的应用程序有两个模块:人力资源和财务。 HR模块先前已交付和testing。 现在财务已经开发出来,可以testing了。 相互依赖的function现在也是可用的,所以在这个阶段,你将testing两者之间的通信点,并将validation它们按照要求工作。

回归testing是另一个重要的阶段,这是在任何新的开发或错误修复后完成的。 其目的是validation以前的工作职能。