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

news2024/11/27 3:46:55

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

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


最后,绵薄之力

感谢每一个认真阅读我文章的人,虽然不是什么很值钱的东西,如果你用得到的话可以直接拿走:

 这些资料,对于【软件测试】的朋友来说应该是最全面最完整的备战仓库,这个仓库也陪伴上万个测试工程师们走过最艰难的路程,希望也能帮助到你!

资料获取方式:

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

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

相关文章

【论文笔记】SAM3D: Zero-Shot 3D Object Detection via Segment Anything Model

原文链接:https://arxiv.org/pdf/2306.02245.pdf 1.引言 分割一切模型(SAM)作为视觉领域的基石模型,有强大的泛化性,能解决很多2D视觉问题。但是SAM是否可以适用于3D视觉任务,仍需要被探索。   目前几乎…

深蓝学院C++基础笔记 第 2 章 对象和基本类型

第 2 章 对象和基本类型 1. 从初始化/赋值语句谈起 初始化 / 赋值语句是程序中最基本的操作,其功能是将某个值与一个对象关联起来 – 值:字面值、对象(变量或常量)所表示的值…… – 标识符:变量、常量、引用…… –…

《Lua程序设计》--学习2

表 Lua语言中的表本质上是一种辅助数组(associative array),这种数组不仅可以使用数值作为索引,也可以使用字符串或其他任意类型的值作为索引(nil除外)。 Lua语言中的表要么是值要么是变量,它…

Linux进程间通信【命名管道】

✨个人主页: 北 海 🎉所属专栏: Linux学习之旅 🎃操作环境: CentOS 7.6 阿里云远程服务器 文章目录 🌇前言🏙️正文1、什么是命名管道1.1、创建及简单使用1.2、命名管道的工作原理1.3、命名管道…

Shell脚本攻略:文本三剑客之awk

目录 一、理论 1.awk原理 2.awk打印 3.awk条件判断 4.awk数组与循环 5.awk函数 6.常用命令 二、实验 1.统计磁盘可用容量 2.统计/etc下文件总大小 3.CPU使用率 4.统计内存 5.监控硬盘 一、理论 1.awk原理 (1)概念 awk由 Aho,W…

PriorityBlockingQueue的介绍及方法内部实现

SynchronousQueue的介绍 SynchronousQueue是一个优先级队列,不满足先进先出FIFO的概念。 会将插入的数据进行排序,输出排序之后的结果(小根堆,由小变大升序) 内部实现原理介绍 SynchronousQueue是基于二叉堆结构实现…

Linux——多线程

Linux多线程 多线程进程内进行资源划分什么是线程进一步理解线程线程的优缺点Linux进程VS线程线程的异常 创建线程两个的接口线程的控制线程的创建线程的终止线程的等待线程取消C的线程库线程的分离如何理解每个线程都有自己独立的栈结构 封装线程接口 多线程 进程内进行资源划…

Java代码块和属性的赋值顺序

代码块 类的成员之四:代码块(初始化块)(重要性较属性、方法、构造器差一些) 1.代码块的作用:用来初始化类、对象的信息 2.分类:代码块要是使用修饰符,只能使用static 分类:静态代码块 vs 非静态…

nacos升级到2.0.3(单机模式)

前提&#xff1a;https://github.com/alibaba/spring-cloud-alibaba/wiki/版本说明 Spring Cloud AlibabaSpring CloudSpring BootNacos2.2.7.RELEASESpring Cloud Hoxton.SR122.3.12.RELEASE2.0.3 一、pom.xml文件 <parent><groupId>org.springframework.boot&…

网工内推 | 高级网工专场,上市公司,3年经验以上,HCIE证书优先

01 名创优品&#xff08;广州&#xff09;有限责任公司 &#x1f537;招聘岗位&#xff1a;高级网络工程师 &#x1f537;职责描述&#xff1a; 1、负责集团总部有线&#xff06;无线、公有云、仓库的网络规划建设与运维&#xff1b; 2、负责公有云的网络台日常上线部署、规划…

3.3 分析特征内部数据分布与分散状况

3.3 分析特征内部数据分布与分散状况 3.3.1 绘制直方图 bar()3.3.2 绘制饼图 pie()3.3.3 绘制箱线图 boxplot()3.3.4 任务实现1、绘制国民生产总值构成分布直方图2、绘制国民生产总值构成分布饼图3、绘制国民生产总值分散情况箱线图 小结 3.3.1 绘制直方图 bar() 直方图&#x…

Vue源码解析

【尚硅谷】Vue源码解析之虚拟DOM和diff算法 【Vue源码】图解 diff算法 与 虚拟DOM-snabbdom-最小量更新原理解析-手写源码-updateChildren] 文章目录 2. snabbdom 简介 及 准备工作2.1 简介2.2 搭建初始环境1. 安装snabbdom2. 安装webpack5并配置3. 复制官方demo Example 3. …

IJCAI 2023 | 如何从离散时间事件序列中学习因果结构?

本文分享一篇我们在IJCAI 2023的最新工作&#xff0c;文章分析了在离散时间事件序列上存在的瞬时效应问题&#xff0c;提出了一种利用瞬时效应的结构霍克斯模型&#xff0c;且在理论上证明了事件序列上的瞬时因果关系同样是可识别的。 相关论文&#xff1a; Jie Qiao et al. “…

基于SpringBoot的家庭记账管理系统的设计与实现

摘 要 随着社会的发展&#xff0c;社会的方方面面都在利用信息化时代的优势。互联网的优势和普及使得各种系统的开发成为必需。 本文以实际运用为开发背景&#xff0c;运用软件工程原理和开发方法&#xff0c;它主要是采用java语言技术和mysql数据库来完成对系统的设计。整个…

数据结构之线性表

1.线性表的定义 线性表是由n(n≥0)个类型相同的数据元素组成的有限 序列&#xff0c;记作:L &#x1d44e;0, &#x1d44e;1, ⋯ , &#x1d44e;&#x1d456; , ⋯ , &#x1d44e;&#x1d45b;−1 2 线性表的顺序存储结构实现 线性表的顺序存储结构称为顺序表&#xff08;…

2023年前端面试汇总-HTML

1. src和href的区别 src和href都是用来引用外部的资源&#xff0c;它们的区别如下&#xff1a; src表示对资源的引用&#xff0c;它指向的内容会嵌入到当前标签所在的位置。src会将其指向的资源下载并应用到文档内&#xff0c;如请求js脚本。当浏览器解析到该元素时&#xff…

HyperLogLog数据结构

基数计数(cardinality counting) 通常用来统计一个集合中不重复的元素个数&#xff0c;例如统计某个网站的UV&#xff0c;或者用户搜索网站的关键词数量。数据分析、网络监控及数据库优化等领域都会涉及到基数计数的需求。 要实现基数计数&#xff0c;最简单的做法是记录集合中…

34岁出来面试,还被拒绝有多惨?

我强烈建议大家定期去参加一下外面的面试&#xff0c;尤其是BAT大厂的面试&#xff0c;不要一直闷在公司里&#xff0c;不然你很容易被这个世界遗弃。 前言 昨天&#xff0c;我们小组长奉命去面了一个34岁的测试员。 去了大概半个多小时吧&#xff0c;回来后&#xff0c;他的…

图数据库(二):Java操作图数据库

在上篇文章中&#xff0c;我们介绍了什么是Neo4j&#xff0c;什么是Cypher以及Neo4j的使用&#xff0c;今天我们学习一下如何使用Java操作Neo4j图数据库。 Cypher查询 在使用Java操作Neo4j之前&#xff0c;我们先了解一点&#xff0c;Cypher语句简单查询。 本文使用的是Neo4j…

Flutter的状态管理之Provider

Provider简介 Flutter Provider是Flutter中一个非常流行的状态管理库&#xff0c;它可以帮助开发者更加方便地管理应用程序中的状态。Provider提供了一种简单的方式来共享和管理应用程序中的数据&#xff0c;并且可以根据数据的变化来自动更新UI界面。 Provider的核心思想是将…