IntegrationTest

2018年1月16日

集成测试确定独立开发的软件单元在彼此连接时是否能正确工作。这个术语已经变得模糊了,即使是在软件行业的分散标准下,所以我在写作中一直小心翼翼地使用它。特别是,许多人认为集成测试的范围必须很广,而在较窄的范围内可以更有效地完成它们。

对于这些事情,最好从一些历史开始。当我第一次了解集成测试时,那是在20世纪80年代,瀑布模型是软件开发思想的主要影响因素。188比分直播完整手机版在一个更大的项目中,我们将有一个设计阶段,该阶段将指定系统中各个模块的接口和行为。然后将模块分配给开发人员进行编程。一个程序员负责一个模块并不罕见,但这将是足够大的,它可能需要几个月来构建它。所有这些工作都是独立完成的,当程序员认为已经完成时,他们会将其交给QA进行测试。

测试的第一部分是单元测试,它将根据设计阶段完成的规范独立测试模块。完成之后,我们将转向集成测试,将各种模块组合在一起,或者组合到整个系统中,或者组合到重要的子系统中。

顾名思义,集成测试的重点是测试许多单独开发的模块是否如预期的那样一起工作.它是通过激活许多模块并对所有模块运行更高级别的测试来执行的,以确保它们一起运行。这些模块可以是单个可执行文件的一部分,也可以是单独的。

从2010年代的角度来看,这两者合并了两种不同的东西:

  • 测试分别开发的模块可以正确地一起工作
  • 测试一个由多个模块组成的系统是否如预期的那样工作。

这两件事很容易合并,毕竟,在不将购物车和目录模块同时激活到单个环境中并运行运行两个模块的测试的情况下,如何测试它们呢?

2010年代的视角提供了另一种选择,这在20世纪80年代很少被考虑。在另一种方法中,我们通过执行购物车中与catalog交互的代码部分来测试购物车和catalog模块的集成,对TestDouble的目录。如果test double是catalog的忠实double,那么我们就可以在不激活完整catalog实例的情况下测试catalog的所有交互行为。如果它们是单个应用程序的独立模块,这可能不是什么大问题,但如果catalog是一个独立的服务,需要自己的构建工具、环境和网络连接,这就很重要了。对于服务,此类测试可以针对进程内测试double运行,或针对在线上测试double运行,使用类似于江湖郎中

对double进行集成测试时,一个明显的问题是该double是否真正忠实。但我们可以单独使用ContractTests

使用这种使用窄集成测试和契约测试的组合,我可以放心地与外部服务进行集成,而无需对该服务的实际实例运行测试,这极大地简化了构建过程。这样做的团队可能仍然会对所有实际服务进行某种形式的端到端系统测试,但如果是这样的话,这只是一个带有非常有限的测试路径的最终冒烟测试。它也有助于有一个成熟的QA在生产能力,如果它足够成熟,可能根本就没有完成端到端系统测试。

问题是,我们(至少)有两种不同的概念构成一个集成测试。

狭窄的集成测试

  • 只练习我的服务中与单独服务对话的那部分代码
  • 使用这些服务的测试副本,无论是进程中的还是远程的
  • 因此由许多狭窄范围的测试组成,通常范围不比单元测试大(并且通常使用用于单元测试的相同测试框架运行)

广泛的集成测试

  • 需要所有服务的实时版本,需要大量的测试环境和网络访问
  • 测试所有服务的代码路径,而不仅仅是负责交互的代码

有很多软件开发人员对他们来说,“集成测试”仅仅意味着“广泛的集成测试”,当他们遇到使用狭义方法的人时,会导致大量的困惑。

如果您的集成测试是广泛的,那么您应该考虑探索狭义的风格,因为它很可能显著提高您的测试速度、易用性和弹性。由于狭窄的集成测试的范围有限,它们通常运行得非常快,所以可以在早期阶段运行DeploymentPipeline,在它们变红时提供更快的反馈。

似乎这种术语上的混乱还不够,随着“集成测试”的再次使用,情况在2010年代后期变得更糟了。这来自意义上的分歧单元测试.有些人将单元测试定义为我所说的单独的单元测试,其中除了被测试的元素之外的所有程序元素都被测试双倍替换。鉴于这种狭义的定义,一些作者将“整合测试”定义为社会性单元测试。

这就是为什么我对“集成测试”非常谨慎。当我读它的时候,我会寻找更多的背景,这样我就知道作者真正想表达的是哪一种。如果我谈论广泛的集成测试,我更喜欢使用“系统测试”或“端到端测试”。对于狭义集成测试,我没有更好的名称,所以我使用它(但是用“狭义”来帮助向读者表明这些测试的性质)。我继续使用“单元测试”来区分这两种类型,当我需要区分时,我使用孤独测试和社交测试。

确认

Birgitta Böckeler, Brian Oxley, Dave Rice, Deepti Mittal, Jonny Leroy, Kief Morris, Raimund Klein, Rogerio Chaves和Tiago Griffo在我们的内部邮件列表中讨论了这篇文章的草稿。

修正

2021年6月3日更新,将“集成测试”的用法从脚注改为正文