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

Posted

技术标签:

【中文标题】单元测试?集成测试?回归测试?验收测试?【英文标题】:Unit Test? Integration Test? Regression Test? Acceptance Test? 【发布时间】:2011-12-02 02:50:14 【问题描述】:

有没有人可以清楚地定义这些测试级别,因为我发现在进行 TDD 或单元测试时很难区分。请谁能详细说明如何、何时实施这些?

【问题讨论】:

What is Unit test, Integration Test, Smoke test, Regression Test?的可能重复 另见What's the difference between unit, functional, acceptance, and integration tests? 【参考方案1】:

简单地说:

单元测试 - 您对每段单独的代码进行单元测试。考虑每个文件或类。

集成测试 - 将多个交互的单元放在一起时,您需要进行集成测试,以确保将这些单元集成在一起不会引入任何错误。

回归测试 - 在集成(并且可能修复)之后,您应该再次运行单元测试。这是回归测试,以确保进一步的更改不会破坏任何已经测试过的单元。您已经进行的单元测试已经生成了可以反复运行以进行回归测试的单元测试。

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

您可能还想研究白盒和黑盒测试。还有性能和负载测试,以及需要考虑的“功能”测试。

【讨论】:

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

我会试试的:

    单元测试:开发人员会编写一个来测试单个组件或类。 集成测试:涉及多个需要协作的组件或包的更广泛的测试 回归测试:对应用程序进行一次更改会强制您重新运行所有测试并检查所有功能。 验收测试:最终用户或 QA 在签署接受应用程序交付之前执行这些测试。它显示“该应用符合我的要求。”

【讨论】:

【参考方案3】:

以下是对上述每个测试及其适用时间的简单说明:

单元测试 单元测试是在一个独立的单元(通常是一个类或方法)上执行的,并且应该在一个单元已经实现或单元的更新已经完成时执行。

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

集成测试 集成测试旨在测试几个单元之间的交互情况。每当单元之间建立新的通信形式或它们的交互性质发生变化时,都应执行此类测试。

这意味着只要将最近编写的单元集成到系统的其余部分或更新与其他系统交互的单元(并成功完成其单元测试),它就会运行。

回归检验 每当系统中发生任何更改时,都会执行回归测试,以检查是否没有引入新的错误。

这意味着它在所有补丁、升级和错误修复之后运行。回归测试可以看作是单元测试和集成测试相结合的一个特例。

验收测试 只要与检查子系统(可能是整个系统)是否满足其全部规范相关,就会执行验收测试。

这意味着它主要在完成新的可交付成果或宣布完成更大的任务之前运行。在跑向客户/老板并宣布胜利之前,将此视为您最后的检查,看看您是否真的完成了目标。

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

【讨论】:

我无法真正区分回归测试和单元测试。我的意思是在每次更改/提交之后,您仍然可以运行单元测试......并且它们可以捕获新代码引入的错误。对吗? @Honey 好吧,回归测试套件主要是您的部分或全部单元和集成测试的选择。这是一个政策问题,你想做多少回归测试。主要区别在于单元测试是在积极开发中完成的,而回归测试更多地是用来检查以前的项目在你回去修补它们时不会中断。 AFAIK 你实际上不应该对方法进行单元测试。如果你测试类,你应该把它当作一个整体来对待,所以你测试的是类的公共接口,而不是它的实现细节。尽管您可以对独立功能进行单元测试,但这很好。【参考方案4】:

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

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

验收测试:当它失败时,它告诉您应用程序没有按照客户期望的那样做。

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

【讨论】:

【参考方案5】:

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

集成测试:我的两个单独开发的模块放在一起是否可以正常工作?

回归测试:我是否因更改/编写新代码而破坏了任何东西? (每次提交运行单元/集成测试在技术上(自动化)回归测试)。更常用于 QA 环境 - 手动或自动。

验收测试:由客户完成的测试,他“接受”交付的软件

【讨论】:

【参考方案6】:

无法评论(声誉低 :-| )所以...

@Andrejs 很好地指出了与每种测试类型相关的环境之间的差异。

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

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

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

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

【讨论】:

以上是关于单元测试?集成测试?回归测试?验收测试?的主要内容,如果未能解决你的问题,请参考以下文章

软件测试

测试岗位概述 _4.21

测试分类

测试基础面试题

软件测试流程

持续集成和验收测试驱动开发