单元测试和集成测试有啥区别? [复制]

Posted

技术标签:

【中文标题】单元测试和集成测试有啥区别? [复制]【英文标题】:What's the difference between unit tests and integration tests? [duplicate]单元测试和集成测试有什么区别? [复制] 【发布时间】:2011-07-18 11:22:53 【问题描述】:

单元测试和集成测试有什么区别?

这些测试有不同的名称吗?像有些人调用单元测试功能测试等?

【问题讨论】:

softwaretestingclass.com/… 【参考方案1】:

单元测试程序员编写的测试,用于验证相对较小的一段代码是否正在执行其预期的操作。它们的范围很窄,它们应该易于编写和执行,它们的有效性取决于程序员认为什么是有用的。这些测试是供程序员使用的,它们对其他任何人都没有直接用处,但是,如果他们完成了他们的工作,下游的测试人员和用户应该会从看到更少的错误中受益。

作为单元测试的一部分是暗示被测代码之外的东西被模拟或删除。单元测试不应该依赖于外部系统。他们测试内部一致性,而不是证明他们与某些外部系统配合得很好。

集成测试是为了证明系统的不同部分可以协同工作。集成测试可以覆盖整个应用程序,并且需要付出更多的努力才能组合在一起。它们通常需要为它们分配数据库实例和硬件等资源。与一组单元测试相比,集成测试在展示系统工作方面(尤其是对非程序员)更有说服力,至少在集成测试环境类似于生产的程度上。

实际上,“集成测试”可用于各种各样的事情,从针对类似于生产环境的全面系统测试到使用未模拟的资源(如数据库或队列)的任何测试.在频谱的低端,集成测试可能是 junit 测试,其中针对内存数据库执行存储库,在高端,它可能是验证应用程序可以交换消息的系统测试。

【讨论】:

单元测试的描述很好,但是你有没有考虑过成对集成并没有涵盖整个应用程序只是两个可测试的单元,系统测试也涵盖了整个应用程序。 区别不在于测试代码的大小。这个定义也遗漏了一个实际的方面:单元测试应该只依赖于被测试的实现单元;它们不应依赖于外部组件,例如数据库、网络服务、Web 浏览器交互。当需要这样的外部元素时,单元测试使用模拟对象。 我花了很长时间才理解这一点,因为当你说单位时,我曾经认为“一小段代码”的例子是 getCitiesFromCountry(string Country) 应该验证数据库返回“伦敦,曼彻斯特” 如果你通过“英国”。那对我来说是一个单位。所以我会使用一个模拟来模拟数据库并尝试返回一个过滤列表。我现在明白这是一个集成测试,如果数据库在询问英国城市时返回纽约,则 QA 将接受该测试。单元测试只是测试往返,例如控制器被调用并按应有的方式运行。 @PauloMerson 这是一个很好的观点,谢谢。测试代码的大小没有定义一个单位。实际上,高级开发人员告诉我其他情况,他们会在单元测试中容忍外部数据库连接,这证明这个主题非常令人困惑。 我要补充一点,目前(在我写这篇文章的 2018 年年中)执行集成测试比以前便宜得多。这主要是由于容器化的持续发展。如果您需要数据库、redis、SFTP 等,它们实际上是一个“docker pull”,而 docker-compose 可以很容易地在单个“docker-compose up”命令中启动您的应用程序及其依赖项。 【参考方案2】:

单元测试不应依赖于单元测试之外的代码。您通过寻找最小的可测试部分来决定单元是什么。如果存在依赖关系,则应将其替换为错误对象。模拟、存根 .. 测试执行线程在最小的可测试单元内开始和结束。

当虚假对象被真实对象替换并且测试执行线程交叉到其他可测试单元时,您就有了集成测试

【讨论】:

感谢@Dave,但为什么单元测试应该没有外部依赖? @BKSpureon 因为在单元测试中,您只想在定义明确的上下文中检查测试函数的行为。它不应受到依赖项中潜在错误的影响。如果你想断言函数和依赖项的组合按预期工作,你正在编写一个集成测试。 根据我的经验(通常是银行业务,通常是大规模的糟糕代码),每个人都将所有测试称为“单元测试”。他们还倾向于匆忙将方法编码成有效的大长脚本,并且设计不正确,因此他们无法进行真正的单元测试,但他们认为它们是单元测试,因为它们使它们在没有网络连接的情况下运行良好。当您将数百个以激光为重点的小型类的设计组合起来并将内容框架化到 NuGet 包中时,单元测试的真正意义就变得显而易见了。【参考方案3】:

单元测试在(尽可能)完全隔离的情况下进行。

当被测对象或模块使用其他代码按应有的方式工作时,就会完成集成测试。

【讨论】:

【参考方案4】:

单元测试测试您可以完全控制的代码,而集成测试测试您的代码如何使用或与其他代码“集成”。

因此,您将编写单元测试以确保您自己的库按预期工作,然后编写集成测试以确保您的代码与您正在使用的其他代码(例如库)很好地配合。

功能测试与集成测试相关,但更具体地指测试整个系统或应用程序的测试,所有代码一起运行,几乎是超级集成测试。

【讨论】:

另外值得一提的是,单元测试通常是指测试最少代码量的测试,例如单个函数【参考方案5】:

单元测试通常针对软件模块中实现的单个功能进行。测试范围完全在此软件模块内。单元测试永远不会满足最终的功能要求。它属于白盒测试方法。

而集成测试是为了确保不同的软件模块实现。测试通常在软件开发完成模块级集成之后进行。该测试将涵盖功能需求,但不足以确保系统验证。

【讨论】:

以上是关于单元测试和集成测试有啥区别? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

SIT和UAT有啥区别

单元测试集成测试系统测试和验收测试的联系和区别

单元测试/集成测试/系统测试的区别

黑盒测试白盒测试单元测试集成测试系统测试验收测试的区别与联系

SIT和UAT有啥区别?谢谢!

Rust能力养成之(15)集成测试