您当前的位置:首页 > 电脑百科 > 程序开发 > 编程百科

单元测试 vs 集成测试,你该怎么选?

时间:2021-01-14 10:54:00  来源:  作者:

在 1998 年,Kent Beck 编写了 sUnit,一个面向 SmallTalk 的单元测试框架。之后,他将这个框架移植到 JAVA,即 jUnit。从那时起,xUnit 框架扩展到那些最流行的编程语言。比较新的语言,如 Golang 和 Rust,已经将测试直接合并到编译器和标准库中。

单元测试 vs 集成测试,你该怎么选?

 

但是单元测试并不是唯一。还有集成测试和性能测试等等。在我看来,集成测试和单元测试是健壮软件的基石。因此,今天让我们看看单元测试与集成测试之间的区别,以及你什么时候该选择哪种测试。

什么是一个单元?

单元测试 vs 集成测试,你该怎么选?

一个单元是逻辑上分离的最小代码块

单元测试是一种孤立地测试尽可能小的代码片段的测试。那么,什么是一个单元?

术语“单元”来自数学。数字 1 被认为是单元,因为它是最小的自然数。它是最小的正整数。以此类推,你源代码的一个单元就是逻辑上与其余代码分离的最小代码片段。它是一个完整的且逻辑上不同的代码片段,而且是最小的部分。

在大多数编程语言中,你的单元会是一个函数或方法调用。

单元测试的好处是,如果你的代码由独立的小片段组成,那么,为它们编写测试就相当容易。这种易编写性意味着你可以在开发功能时完成单元测试。

与其它形式的测试相比,单元测试的执行时间相当短。这意味着你可以频繁运行单元测试。随着软件的成熟,一套单元测试是防止回归和降低维护成本的有力工具。

追溯单元测试

在考虑将单元测试添加到现有软件时,需要考虑成本和收益。

单元测试的一个关键假设是,被测试的软件很容易分成不同的单元。在没有考虑单元测试编写的软件中,这个假设很少成立。向现有软件添加单元测试通常是一种非常好的方法,来稳定软件并防止将来回归,但是重构代码来支持简单的单元测试可能需要大量工作,甚至会引入新的缺陷。在考虑将单元测试添加到现有软件时,需要考虑成本和收益。如果你的代码正在工作,如果代码很少需要修改,如果代码不容易进行单元测试,那么加入单元测试的好处可能无法保证成本。在这些情况下,可以依靠集成测试来防止该领域的缺陷。

什么是集成测试?

单元测试 vs 集成测试,你该怎么选?

集成测试聚焦于整个软件栈

如果单元测试的哲学是基于这样一种认识,即测试小的独立代码片段是防止回归的一种好方法,那么集成测试是基于这样一种理解,即事情通常在边缘状态出错。外部世界是一个混乱的地方,它与你代码交互的地方通常是意外发生的地方。

你可以通过单元测试实现 100%代码覆盖率,但仍然发现你的软件失败。你可能试图从错误的位置读取文件,或者你的软件可能从一个调用的服务得到预期之外的输出,或者它可能以一种无效的方式调用数据库。

尽管单元测试应该快速运行并且数量众多,但是一个好的集成测试策略应该关注较少数量的高影响测试。

这些测试应该跨越单元测试无法跨越的所有界限,写入文件系统,接触外部资源,等等。

当集成测试棘手时

某些外部系统确实很难集成到测试中。这是因为它们在现实世界中有着无法消除的副作用:金融交易、电子邮件发送、物理移动一个喷漆机器人等。在你在测试中放弃并避开它们之前,找找解决方案。

许多外部系统有一个文档化的方法来在集成测试中使用它们。支付处理程序通常有测试信用卡号,可以设置具有测试邮箱账户的测试用户来测试邮件发送。

集成测试越接近真实世界的交互,就越有可能发现问题并提供真正的价值。

Amazon SES——Test email addresses

Paypal——Test credit card numbers

UPS——Test api mode

一个电子商务例子

假设你正在编写一个简单的电商网站,一个简化版的 amazon.com。这里的细节很重要,所以我们假设,你会使用 PostgreSQL 作为你的数据存储,使用 PayPal 进行支付,使用 UPS 进行发货、使用 Amazon Simple Email Service 来发送电子发票邮件。

单元测试:

单元测试策略将以一种孤立的方式测试应用程序的逻辑。这可能包括:

  • 测试税费计算逻辑是否正确地计算出各个司法管辖区的税费
  • 测试放置到购物车数据结构中的项目是否被正确添加
  • 测试折扣代码是否被正确使用

这些领域中的每一个都可能有几个测试。每个测试将验证一小部分功能。单元测试的能力来自它们的数量、简单性以及它们的执行速度和便捷性。

集成测试:

另一方面,你的集成测试将专注于测试你的电子商务代码与其它系统的交互。这意味着不仅要测试与数据存储的集成,还要测试与邮件发送服务的集成、与支付服务的集成等等。这些可能包括:

  • 测试是否可以从外部运输服务中检索运输费率
  • 测试发票是否可以生成并正确发送
  • 测试订单信息是否可以持久化并从数据存储中正确检索
  • 测试交易是否可以发送并被支付处理程序正确处理

这些功能中的每一个都可能需要一个或两个集成测试来验证。这些测试运行起来会比较慢,可能涉及一些安装和拆卸步骤。结果是,每个测试的代码覆盖率会相当大。这些测试将通过捕获单元测试不能捕获的问题来产生价值。然而,维护成本和执行时间可能会比较高。

集成测试 vs 单元测试

单元测试 vs 集成测试,你该怎么选?

是时候正面比较了

那么,应该首选哪种类型的测试呢?单靠两者中的任一个都是不够的。这两者都是综合测试计划的一部分。让我们直接比较一下:

单元测试 vs 集成测试,你该怎么选?

 

基于理想化测试的工作软件

每种情况都是独特的,基于在其它情况下有效的建议不应盲目遵循。

现在我们明白了,单元测试不应该触及文件系统,而集成测试应该只集成松散的组件。但实际上,将测试划分为两个明确的类别有点太简单了,如果我们只关注定义,我们就会忽略目标,即正确的工作软件。

一些非常有想法的开发者认为单元测试可以并且应该读写数据库。其它人则认为单元测试是一种浪费,粗粒度的集成测试提供的价值最大。

问题是,每种情况都是独特的,基于在其它情况下有效的建议不应盲目遵循。需要牢记的一个问题是,这个测试要捕获什么类型的缺陷。如果每个测试都是经过深思熟虑编写来提升软件可靠性的,如果测试在不再有价值时被删除,那么随着时间的推移,将发现为特定项目提供最大价值的特定测试方法。

原文链接:

https://blog.earthly.dev/unit-vs-integration/



Tags:单元测试   点击:()  评论:()
声明:本站部分内容及图片来自互联网,转载是出于传递更多信息之目的,内容观点仅代表作者本人,如有任何标注错误或版权侵犯请与我们联系(Email:2595517585@qq.com),我们将及时更正、删除,谢谢。
▌相关推荐
介绍怎么做单元测试的书很多,这里主要解答:为什么单元测试。客观来说,单元测试和使用版本控制系统(GIT,SVN)是一样重要的。为什么单元测试如此重要,但你却感受不到。首先要知道,代...【详细内容】
2021-05-18  Tags: 单元测试  点击:(170)  评论:(0)  加入收藏
在 1998 年,Kent Beck 编写了 sUnit,一个面向 SmallTalk 的单元测试框架。之后,他将这个框架移植到 Java,即 jUnit。从那时起,xUnit 框架扩展到那些最流行的编程语言。比较新的语...【详细内容】
2021-01-14  Tags: 单元测试  点击:(242)  评论:(0)  加入收藏
关于单元测试的三个问题作为一个程序员,或多或少听说过单元测试,但很多小伙伴还没有在实际项目中用到。究其原因,可能是对单元测试有一些「误解」,比如: 写单元测试需要花费更多...【详细内容】
2020-10-10  Tags: 单元测试  点击:(76)  评论:(0)  加入收藏
▌简易百科推荐
摘 要 (OF作品展示)OF之前介绍了用python实现数据可视化、数据分析及一些小项目,但基本都是后端的知识。想要做一个好看的可视化大屏,我们还要学一些前端的知识(vue),网上有很多比...【详细内容】
2021-12-27  项目与数据管理    Tags:Vue   点击:(1)  评论:(0)  加入收藏
程序是如何被执行的  程序是如何被执行的?许多开发者可能也没法回答这个问题,大多数人更注重的是如何编写程序,却不会太注意编写好的程序是如何被运行,这并不是一个好...【详细内容】
2021-12-23  IT学习日记    Tags:程序   点击:(9)  评论:(0)  加入收藏
阅读收获✔️1. 了解单点登录实现原理✔️2. 掌握快速使用xxl-sso接入单点登录功能一、早期的多系统登录解决方案 单系统登录解决方案的核心是cookie,cookie携带会话id在浏览器...【详细内容】
2021-12-23  程序yuan    Tags:单点登录(   点击:(8)  评论:(0)  加入收藏
下载Eclipse RCP IDE如果你电脑上还没有安装Eclipse,那么请到这里下载对应版本的软件进行安装。具体的安装步骤就不在这赘述了。创建第一个标准Eclipse RCP应用(总共分为六步)1...【详细内容】
2021-12-22  阿福ChrisYuan    Tags:RCP应用   点击:(7)  评论:(0)  加入收藏
今天想简单聊一聊 Token 的 Value Capture,就是币的价值问题。首先说明啊,这个话题包含的内容非常之光,Token 的经济学设计也可以包含诸多问题,所以几乎不可能把这个问题说的清...【详细内容】
2021-12-21  唐少华TSH    Tags:Token   点击:(9)  评论:(0)  加入收藏
实现效果:假如有10条数据,分组展示,默认在当前页面展示4个,点击换一批,从第5个开始继续展示,到最后一组,再重新返回到第一组 data() { return { qList: [], //处理后...【详细内容】
2021-12-17  Mason程    Tags:VUE   点击:(14)  评论:(0)  加入收藏
什么是性能调优?(what) 为什么需要性能调优?(why) 什么时候需要性能调优?(when) 什么地方需要性能调优?(where) 什么时候来进行性能调优?(who) 怎么样进行性能调优?(How) 硬件配...【详细内容】
2021-12-16  软件测试小p    Tags:性能调优   点击:(19)  评论:(0)  加入收藏
Tasker 是一款适用于 Android 设备的高级自动化应用,它可以通过脚本让重复性的操作自动运行,提高效率。 不知道从哪里听说的抖音 app 会导致 OLED 屏幕烧屏。于是就现学现卖,自...【详细内容】
2021-12-15  ITBang    Tags:抖音防烧屏   点击:(23)  评论:(0)  加入收藏
11 月 23 日,Rust Moderation Team(审核团队)在 GitHub 上发布了辞职公告,即刻生效。根据公告,审核团队集体辞职是为了抗议 Rust 核心团队(Core team)在执行社区行为准则和标准上...【详细内容】
2021-12-15  InfoQ    Tags:Rust   点击:(24)  评论:(0)  加入收藏
一个项目的大部分API,测试用例在参数和参数值等信息会有很多相似的地方。我们可以复制API,复制用例来快速生成,然后做细微调整既可以满足我们的测试需求1.复制API:在菜单发布单...【详细内容】
2021-12-14  AutoMeter    Tags:AutoMeter   点击:(20)  评论:(0)  加入收藏
最新更新
栏目热门
栏目头条