什么是测试金字塔?如何使用测试金字塔来构建自动化测试体系?

news2024/11/18 23:20:57

测试金字塔 (Test Pyramid)是一套使用单元测试,集成测试和端到端测试来构建自动化测试体系的方法。

如下图所示,在金字塔的最下方是单元测试,中段是集成测试,最上方是端到端测试。单元测试实现的成本最低,运行速度最快,是毫秒级的。集成测试的实现成本比单元测试高,因为要跟外部系统连接,所以运行速度比单元测试要慢1-2各个数量级。端到端测试最符合用户的完整体验,从 UI 开始通过 API 直达系统内部代码,因为涉及的环节更多,所以实现成本更高,运行速度比集成测试更慢。

在这里插入图片描述

测试金字塔理论推荐单元测试应该是数量最多,覆盖范围最大的测试种类。道理很简单,单元测试成本低,运行速度快,在发现问题的时候解决问题也最快。集成测试数量次之,最后才是昂贵的端到端测试。由于端到端测试经过的环节更多,所以通过端到端测试发现的问题,解决起来用时更多。

单元测试

单元测试是一种由开发者实现的白盒测试。在测试金字塔里,单元测试是自动化测试体系的基础。一般使用代码覆盖率来评价单元测试是否达到了测试的要求,但是在实践中开发团队往往发现很难达到指定的代码覆盖率。开发工程师写的单元测试和测试工程师编写的测试用例也很难匹配,跟产品经理的业务描述差得更远。

这里的一个重要原因是许多开发者把程序简单地理解为增删改查(CRUD),而没有围绕业务逻辑来编写代码。对外部服务没有构建“以我为中心”的模型,编写代码的时候直接使用要依赖服务定义的模型,这样在编写单元测试时就会因为模拟某些服务难度太高不得不放弃,只能使用集成测试来验证代码的正确性。

我们可以借鉴《领域驱动设计》里的分层架构,以及六边形架构来构建抽象的领域模型,并且使用单元测试来验证模型实现了产品经理的业务描述。这样我们就可以使用面向对象知识围绕业务构建领域层,把外界服务看做各种连接到模型的“端口”。在编写单元测试时,就不会遇到无法模拟其他服务的问题。

总结一下,我们的单元测试应该构建在“领域层”之上,以验证领域模型对业务描述的正确性为主要目标。

单元测试是否可以连接数据库?

单元测试是系统内部的测试,单元测试不能跨越系统。数据库是另外一个系统,跨系统的测试属于集成测试的范畴,所以单元测试中是不可以连接数据库的。单元测试要遵循 FIRST 原则,其中的 “F” 就表示要快。单元测试的范围在系统内部不访问外部系统才可能快。访问数据库会把毫秒级的测试时间,提升到几十甚至数百毫秒以上。这显然是集成测试的运行时间水平。

集成测试

集成测试是验证系统和系统之间的相互调用是否符合预期的测试。因为要跨越系统,所以和单元测试相比集成测试运行起来要慢1到2个数量级。

当发现问题时,问题可能会出在集成测试连接的任意一个系统中,开发者需要排查每一个系统直到找到问题为止,而在单元测试中发现问题时只需要排查本系统,所以集成测试相比单元测试排查问题用时也更多。

开发者在设计集成测试时可以限定要集成的系统范围,这样就可以把测试重点放在开发者关心的系统上。集成测试往往以 API 调用的方式进行,开发者编写测试脚本按顺序调用 API,检查结果是否符合预期。

在这里插入图片描述
集成测试是系统之间的测试。数据库也是一种系统

端到端测试

端到端测试以 UI 为起点,模拟用户使用系统的场景,从 UI 输入验证系统的输出是否符合预期。因为涉及到 UI,端到端测试必然会跨系统,又因为开发者只能控制 UI 部分的输入顺序和数量,所以开发者不能控制端到端测试中被调用的 API 的顺序和数量,在发现问题时不光要检查各个可能要涉及的系统,还要考虑 API 可能被调用的顺序和数量,排查问题的难度比集成测试更高。

在运行时间上,UI 测试模拟用户的输入而不是像集成测试那样直接调用系统 API,所以运行时间类似于人类反应的时间,与集成测试相比端到端测试整体运行时间又有数量级级别的下降。

端到端测试也包含了部分探索性测试和人工测试。

在这里插入图片描述
端到端测试的输入从UI开始

端到端测试在性能测试上更能反映系统在真实世界的运行情况

如果以集成测试的方式来做性能测试,开发者可以按照指定的顺序调用API,模拟在规定时间内调用 API 的数量下系统的响应能力,但是在真实世界,用户是通过 UI 来驱动系统的,UI 页面往往包含各类信息,这类信息会并发地以不同顺序调用系统的 API,这样在用户流量大的情形下,不同 API 被纠缠在一起以不同的顺序和数量传递到不同的系统里。

在上图中,用户打开“新浪财经”页面会调用页面UI,要闻,突发,股市指数,天气预报等10几个系统。这比单纯的集成测试要调用的系统数量上要多,调用顺序由UI页面结构决定,每次页面调整都会导致 API 调用顺序的改变。显然端到端测试要比集成测试复杂。

和集成测试相比,基于端到端测试实现的性能测试,结果可能会和开发者的预期差距更大,但是可能会发现更多问题。

如何使用测试金字塔来构建自动化测试体系

基于对测试金字塔中 3 种不同种类测试的特点的分析,考虑到运行速度和实现成本,我们推荐开发者以单元测试为自动化测试的基础,以尽可能低的成本发现尽可能多的问题,通过集成测试检查系统间的相互调用问题,辅以端到端测试优化用户体验来构建自动化测试体系。

结论

本文通过比较单元测试、集成测试和端到端测试在实现成本,负责范围和纠错时间的区别和联系,介绍了测试金字塔的概念,以及以按照单元测试、集成测试和端到端测试的顺序构建自动化测试体系的必要性。

参考链接

  • 单元测试中的 AAA 规则
  • 单元测试中的 FIRST 原则
  • The Practical Test Pyramid

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/163613.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Android 深入系统完全讲解(17)

这个就是我们在初始化的时候给对应的属性设置上下文。chcon 这个可以修改上下文。 我们在遇见类似的属性读取不到的时候,一般操作是: getprop -z 看下属性的上下文,然后 ps -z 看下进程的上下文,然后判断出来是否有对应的 权限&am…

1. PyTorch是什么?

这篇博客将介绍PyTorch深度学习库,包括: PyTorch是什么如何安装PyTorch重要的PyTorch功能,包括张量和自动标记PyTorch如何支持GPU为什么PyTorch在研究人员中如此受欢迎PyTorch是否优于Keras/TensorFlow是否应该在项目中使用PyTorch或Keras/T…

ArcGIS10.2保姆式安装教程,超详细;附安装包

安装前请关闭杀毒软件,系统防火墙,断开网络连接 参考链接:请点击 下载链接: 通过百度网盘分享的文件:ArcGIS10.2zip 链接:https://pan.baidu.com/s/1s_xc1HvmMdo4fnnUo97ldA 提取码:v74k 复制这段内容打开「百度网盘A…

2022年11月下午案例分析真题及答案解析

试题一(共15分)(202211) 阅读下列说明和图,回答问题1至问题4,将解答填入答题纸的对应栏内。 【说明】 随着新能源车数量的迅猛增长,全国各地电动汽车配套充电桩急速增长,同时也带…

2023年网络安全比赛--Linux系统渗透提权中职组(超详细)

一、竞赛时间 180分钟 共计3小时 二、竞赛阶段 竞赛阶段 任务阶段 竞赛任务 竞赛时间 分值 1.使用渗透机对服务器信息收集,并将服务器中SSH服务端口号作为flag提交; 2.使用渗透机对服务器信息收集,并将服务器中主机名称作为flag提交; 3.使用渗透机对服务器信息收集,并将服…

数据科学家必备的 3 个 Jupyter Notebook 扩展

如果您是数据科学家、机器学习工程师或任何其他类型的数据专业人员,您可能已经花了很多时间使用 Jupyter 笔记本。虽然 Jupyter notebooks 已经是一个强大的工具,但还有许多扩展可以进一步增强您的体验。 在本文中,我们将向您介绍三个最有用…

活动星投票创心服务网络评选微信的投票方式线上免费投票

“创心服务”网络评选投票_视频投票评选小程序_线实时投票小程序_微信投票链接创建现来说,公司、企业、学校更多地想借助短视频推广自己。通过微信投票小程序,网友们就可以通过手机拍视频上传视频参加活动,而短视频微信投票评选活动既可以给用…

表单验证的简单实现

表单验证一. 作用二. 需求三. 实现需求一:HTML:JavaScript:需求二:JavaScript:一. 作用 如果没有表单验证,错误的数据就会发往服务端,会造成服务端压力过大; 所以在前端对数据进行过…

ArcGIS基础实验操作100例--实验98计算上游集水区污染值

本实验专栏参考自汤国安教授《地理信息系统基础实验操作100例》一书 实验平台:ArcGIS 10.6 实验数据:请访问实验1(传送门) 空间分析篇--实验98 计算上游集水区污染值 目录 一、实验背景 二、实验数据 三、实验步骤 &#xff0…

【阶段三】Python机器学习28篇:机器学习项目实战:KMeans算法的基本原理与KMeans聚类分群模型

本篇的思维导图: KMeans模型 KMeans算法的基本原理 KMeans算法名称中的K代表类别数量,Means代表每个类别内样本的均值,所以KMeans算法又称为K-均值算法。KMeans算法以距离作为样本间相似度的度量标准,将距离相近的样本分配至同一个类别。样本间距离的计算方式可以是…

QListWidget 自定义 item的图标和文字的位置

目录前言思路一思路二思路二缺陷思路三思路四前言 楼主并没有完整的解决这个问题,如果你是着急寻找解决方案的就可以划走了,如果你对楼主的解决思路有兴趣,那么可以继续向下阅读。首先需求是可以控制QListWidgetItem的icon和text x轴的位置&…

【树】树、二叉树的基础知识

树定义:树是n(n≥0)个结点的有限集合T。当n0时,称为空树;当n>0时,该集合满足如下条件: (1) 其中必有一个称为根(root)的特定结点,它没有直接前驱&#xff…

基于javaweb jsp+servlet学生宿舍管理系统

基于javaweb jspservlet学生宿舍管理系统 博主介绍:5年java开发经验,专注Java开发、定制、远程、文档编写指导等,csdn特邀作者、专注于Java技术领域 作者主页 超级帅帅吴 Java毕设项目精品实战案例《500套》 欢迎点赞 收藏 ⭐留言 文末获取源码联系方式 …

Mysql入门技能树-时间日期函数(一)-练习篇

DAY Joe 需要从日期中提取当天是几号,下列哪些函数可以实现这个功能? 1.DAY 2.DAYOFMONTH 3.DAYOFYEAR 4.TO_DAYS 答案是:C SELECT DAY(2023-02-14)SELECT DAYOFMONTH(2023-02-14)结果都是14 -- 返回 d 是一年中的第几天,范围…

【学习笔记】【Pytorch】九、非线性激活

【学习笔记】【Pytorch】九、非线性激活学习地址主要内容一、前言二、Pytorch的非线性激活三、nn.ReLU类的使用1.使用说明2.代码实现二、nn.Sigmoid类的使用1.使用说明2.代码实现学习地址 PyTorch深度学习快速入门教程【小土堆】. 主要内容 一、前言 我们知道人类大脑中的神…

【RabbitMQ】基础篇,学习纪录+笔记

目录 一.介绍 1.1MQ概述 1.2MQ优势和劣势 1.3常见的 MQ 产品 1.4RabbitMQ简介 1.5RabbitMQ中的相关概念 1.6RabbitMQ的安装 二.快速入门 2.1入门程序 2.2工作模式 2.2.1Work queues 工作队列模式 2.2.2Pub/Sub 订阅模式 2.2.3Routing 路由模式 2.2.4Topics 通配符…

vite 4.0 来了,带你手撕 create-vite 源码

通过本文你将了解到以下内容: 1,npm create 具体执行流程2,minimist、prompts、kolorist三个库3,create-vite 的源码分析 vite源码下载: //复制一份vite源码到自己的本地 git clone https://github.com/vitejs/vit…

抗击洪涝灾害,河道水雨情动态在线监测解决方案

一、项目背景我国是个多山的国家且位于东南季风区,降雨分布广泛还分布不均匀,这样一来使汛期高度集中。导致很多沿海城市以及临近河道的地区面临着河道决堤的威胁如何实时监测河道雨水情动态成了让人头疼的问题。在2022年1月,发改委、水利部在…

基于jsp+mysql+Spring的SpringBoot招聘网站项目(完整源码+sql)

基于jspmysqlSpring的SpringBoot招聘网站项目(完整源码sql)主要实现了管理员登录,简历管理,问答管理,职位管理,用户管理,职位申请进度更新,查看简历 博主介绍:5年java开发经验,专注Java开发、定制、远程、文档编写指导等,csdn特邀…

Exchanges

文章目录ExchangesExchanges的类型FanoutDirectTopicExchanges (交换机)RabbitMQ 消息传递模型的核心思想是: 生产者生产的消息从不会直接发送到队列。 Exchanges的类型 直接(direct),主题(topic),标题(headers),扇出(fanout)&…