单元测试?集成测试?回归测试?验收测试?

129

有人能清晰地定义这些测试级别吗?我发现在进行TDD或单元测试时很难区分。如果有人能详细说明如何实施和何时实施这些测试级别,那就太好了。


6个回答

170

简述:

单元测试 - 每个代码片段都需要进行单元测试。可以将每个文件或类看作一个单元。

集成测试 - 当多个单元需要交互时,需要进行集成测试以确保组合这些单元不会引入任何错误。

回归测试 - 在集成(和可能的修复)之后,应再次运行单元测试。这是回归测试,以确保进一步的更改没有破坏已经测试过的任何单元。您已经完成的单元测试已生成可用于回归测试的单元测试。

验收测试 - 当用户/客户/业务收到功能时,他们(或您的测试部门)将进行验收测试以确保该功能符合其要求。

您还可以了解白盒测试和黑盒测试。还有性能和负载测试,以及考虑“'ilities”的测试。


1
单元测试中,被测试的单元可以有不同的大小。例如,您可以对一组类、单个方法甚至一个单独的方法进行单元测试。来源:BlueJ第9.3章“BlueJ内的单元测试”。 - Sebastian Nielsen
4
所以我们不编写回归测试,而是在进行更改(新功能或错误修复)后运行单元测试和集成测试的组合,以检查系统是否仍按预期工作?最近我实施了一个错误修复(使用与已实现的逻辑不同的另一种逻辑),但是许多单元测试失败了。将测试适应新逻辑是否可以,还是逻辑必须适应测试(只要测试成功运行)? - velocity

140

单元测试:当它失败时,会告诉您需要修复代码的哪一部分。

集成测试:当它失败时,会告诉您应用程序的各个部分未按预期协同工作。

验收测试:当它失败时,会告诉您应用程序未按客户的期望执行。

回归测试:当它失败时,会告诉您应用程序不再像以前那样运行。


22

以下是每个测试的简单解释以及它们适用的情况:

单元测试 单元测试是在自包含单元(通常是类或方法)上执行的,并且应该在实现一个单元或更新一个单元完成后进行。

这意味着当您编写类/方法、修复错误、更改功能等时运行它。

集成测试 集成测试旨在测试多个单元之间的交互如何。应该在建立单元之间的新形式通信或其交互性质发生变化时执行此类型的测试。

这意味着每当最近编写的单元集成到系统的其他部分中,或者每当与其他系统交互的单元已经更新(并成功完成其单元测试)时运行它。

回归测试 回归测试是在系统中有任何更改时执行的,以检查是否引入了新的错误。

这意味着在打补丁、升级、修复错误后运行它。可以将回归测试视为组合单元测试和集成测试的特例。

验收测试 验收测试是在需要检查子系统(可能是整个系统)是否符合其全部规格说明时执行的。

这意味着主要在完成新的可交付成果或宣布完成较大任务之前运行。将其视为最后的检查,确保在向客户/老板报告胜利之前已真正完成目标。

这至少是我学到的方式,尽管我确信还有其他相反的观点。无论如何,我希望这有所帮助。


我真的无法区分回归测试和单元测试。我的意思是,在每次更改/提交后,您仍然运行单元测试...它们可以捕获新代码引入的错误,对吧? - mfaani
@Honey Well,回归测试套件主要是选择您的单元测试和集成测试中的一些或全部。这是一个政策问题,取决于您想要进行多少回归测试。主要区别在于,单元测试是在积极开发过程中完成的,而回归测试更多地用于检查以前的项目在您返回并修补它们时是否会出现故障。 - Agentlien
据我所知,实际上你不应该对方法进行单元测试。如果你测试类,你应该将其视为一个整体,因此你测试的是类的公共接口,而不是它的实现细节。虽然你可以对独立的函数进行单元测试,这是可以的。 - Qback

17

我会尝试:

  1. 单元测试: 开发人员编写该测试来测试单个组件或类。
  2. 集成测试: 更广泛的测试,涉及多个需要协同工作的组件或程序包。
  3. 回归测试: 对应用程序进行单一更改后,强制重新运行所有测试并检查所有功能。
  4. 验收测试: 最终用户或QA在接受应用程序之前执行此测试,其目的是确认“该应用程序符合我的要求”。

17

单元测试:我的单个方法是否正常工作?(没有依赖项或已模拟依赖项)

集成测试:当把我开发的两个单独模块放在一起时,它们是否正常工作?

回归测试:更改/编写新代码是否会导致任何问题?(每次提交时运行单元/集成测试就是技术上的自动化回归测试)。在QA上下文中经常用于手动或自动化。

验收测试:由客户执行的测试,以确认其“接受”交付的软件。


2

无法评论(声誉太低:-|),所以……

@Andrejs提出了关于每种测试类型相关环境差异的好观点。

单元测试通常在开发人员的机器上运行(可能在CI构建期间),并模拟其他资源/系统的依赖关系。

集成测试因定义必须具有(某种程度)对依赖项的可用性;调用其他资源和系统,因此环境更具代表性。测试数据可能是模拟的或真实生产数据的小型混淆子集。

UAT/验收测试必须代表QA和业务团队接受软件的真实世界体验。因此需要完全集成和现实数据量以及完全遮蔽/混淆的数据集,以提供逼真的性能和最终用户体验。

其他“ilities”也很可能需要环境尽可能接近实际情况,以模拟生产体验,例如性能测试、安全性等。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接