Playwright快照测试:如何让UI回归测试变得轻松高效
引言
使用带有模拟数据的PlaywrightP快照可以显著提高UI回归测试的速度。它能够快速自动化检查三大主流浏览器(Chromium、Firefox、Webkit)中的 UI 元素。你可以将多个断言绑定到一个快照上,这极大地提高了 UI 测试的效率。在 GUI 应用快速扩展的背景下,这种效率至关重要。
Playwright 是一个功能强大的自动化测试库,广泛应用于回归测试。它在基于 Web 的测试方面表现出色,即导航到链接并执行各种用户流程,这些流程的行为始终应保持一致。通常会自动化用户流程测试以验证事物的运行方式,但事物的外观又该如何呢?
问题所在
主要挑战是创建一个仪表板,显示预测空气质量与实时测量值之间的差异。主页面相对简单,因为它使用了 ag-grid,因此我们可以模拟并断言每个单元格中的值。然而,对于类似图表的元素来说,情况就没那么简单了。我们需要测试这些图表中的数据是否正确地以默认模拟数据进行了可视化,然后,我们还需要测试各种 UI 交互是否会按预期改变图表。
完整背景信息请参阅此案例研究。
上图展示了一个包含六个不同图表的 UI,这些图表显示了预测的和现场测量的污染物数据。第一个大问题是数据是非静态的。我们通过 Playwright Mock API 来模拟数据解决了这个问题。这样一来,我们的回归测试就可以专注于数据的功能以及数据所经历的各种转换。第二个问题是,我们如何知道实际数据是否被正确地可视化了呢?这就是 Playwright 快照的用武之地。
Playwright 快照详解
Playwright 会启动每个浏览器,并完成各种操作,例如按钮点击、滚动、数据输入。在执行完操作后,将捕获 DOM 元素(或多个元素)状态的截图。然后,它会依次检查每个像素,并查看其 RGBA 值是否与代码库中创建的比较图像相匹配。
借助 Playwright 快照,我们可以轻松断言页面元素应有的外观。如果代码库中没有比较图像,那么我们首次运行 `npx playwright test` 时,它将为我们创建一个比较图像。接下来,我们需要调整测试步骤,直到对 Playwright 创建的快照感到满意。一旦满意,我们再次运行相同的命令,并添加 `--update-snapshots` 标志,这将把快照保存为我们参考的黄金标准图像。此后,每次运行测试时,我们都会将其与该图像进行比较。
请注意,对于我们启用的每个浏览器,都会创建一个比较图像。因此,如果我运行 `toMatchSnapshot('Image.png')`,那么它将分别为 Chrome、Firefox 和 Webkit 创建单独的图像。
示例代码片段
如果没有额外参数,只要有一个像素不同,比较就会失败。此选项可实现最大精度。
javascripttest('Verify so2 graph updates correctly when sites are removed', async ({cityPage,}) => {//移除一个空气质量监测站点的操作await cityPage.siteRemover('Centro')//捕获硫化氢图表的快照const chartShot = await cityPage.captureChartScreenshot(cityPage.so2Chart)//将其与我们保存在代码库中的参考图像进行比较expect(chartShot).toMatchSnapshot('rio-so2-graph-without-centro.png')})
在这里,我们在页面对象模型中创建了一个方法,该方法接受我们希望在测试结束时截取屏幕快照以供比较的图表/图形。
测试中针对 Chrome 浏览器的元素尺寸为 600x400 像素,这意味着如果 1/240000 个像素不匹配,测试就会失败。然而,我们可以通过提供额外参数来放宽一些限制,例如:
· 进行视觉回归测试时,允许的最大像素差异值。
.toMatchSnapshot("in-situ-AQI-is-4-at-00:00-due-to-PM2.5.png",{ maxDiffPixels: 27 })
如果 27/240000 个像素不同,测试将通过。28/240000 个不同的像素将导致测试失败。
进行视觉回归测试时,允许的最大像素比差异阈值。
.toMatchSnapshot("in-situ-AQI-is-4-at-00:00-due-to-PM2.5.png",{ maxDiffPixelRatio: 27 })
这是一个百分比检查。如果最多有 27% 的像素不匹配,测试仍将通过。通过运行 Playwright CLI 命令进行测试后,测试结束时会生成一份报告。这将向我们展示图像中的不同之处。
失败是什么样子的?
通过 CLI 运行测试后,默认情况下会在 localhost:9323 上生成一份报告。
然后,用户可以选择失败的快照测试,并能够看到各种比较选项。如下面所示,有多个选项可供选择,以进一步调查失败原因。我们可以查看预期图像、实际图像,但最重要的是查看差异。这是最有用的视图,因为它会突出显示所有未能与我们的比较图像匹配的像素。
预期:
实际:
差异:
使用示例
通过结合模拟数据和快照视觉测试,可以轻松发现系统功能的明显回归。在回归测试中测试多个图表会迅速变得单调乏味且耗时。特别是对于我们的 UI,图表可能有多种形式。
以下是城市页面上的一个传感器选择功能:
图中的每条不同颜色的线代表一个不同的传感器,可以切换。我们可以通过选择标签页禁用传感器,或者通过双击实际图表上的线条来禁用传感器。然后,图表将重新调整自身,以便更好地呈现数据。
示例测试流程:
1. 使用模拟数据对默认图表进行快照。
2. 移除一个站点。
3. 现在创建一个新快照,显示更新后的图表形状。
然后,我们可以有一些测试来移除不同的站点,并断言图表的新预期形状。
下面展示的是主要的 AQI 图表。蓝色的现场线会根据启用的传感器动态变化。这是通过前端对每个时间点的每个点进行平均来完成的。然后绘制出最高的平均值为蓝色。
测试流程:我们希望测试蓝色线是否根据启用的站点准确绘制。因此,我们移除站点,然后手动检查新的绘制是否正确。一旦满意,我们就可以重复步骤,创建一个我们刚刚修改的图表的新快照。最后,我们的测试将简单地导航到页面,移除一个站点,并断言图表与我们刚刚捕获的快照匹配。
这解决了什么问题?
它解决了尝试断言许多不同元素的问题,这些元素可能相当繁琐,需要逐个定位和断言。
这个页面使用 echarts 库来渲染图表。
- 它就像一双额外的眼睛。如果我们对数据应有的外观有很好的了解,那么它将使 UI 回归测试更加高效。
- 除了由于数据可视化不正确而导致的失败外,我们还可以捕捉到许多其他无意的更改,例如填充或边距的变化。
- 节省了一些繁琐的手动工作。如上所示,我们可能需要手动检查并点击 6 个不同的图表,如果按工单进行回归测试,这将非常耗时。
- 有时你可以期望元素可见,但实际内容可能被错误表示或损坏。
- 我们可以快速测试元素的数据在多个浏览器/视口中的正确呈现。这将进一步减少多平台应用的工作量。
维护和变更
快照测试需要团队之间密切协调。当进行新更改时,作为测试人员,了解或调查需要更新哪些快照非常重要。然后,这将需要与开发人员合作,以确保新的快照与任何新实现保持一致。为了提高效率,我们最终作为团队达成一致,在工单的开发分支或单独的分支上更新这些快照。这意味着新的实现将与更新的快照一起合并到主分支中,以减少回归运行中的许多失败。
使用 `-–update-snapshots` 标志更新快照相当轻松。
示例快照更新
一个新实现的更新快照。之前背景颜色分级的最大值为八百。现在更新为没有上限。
命名规范
为快照命名也很重要。这使得团队中的任何人都更容易理解它们的用途。这也使得调试变得更容易。
- “graph-image.png” 与 “graph-is–bristol-air-quality”。使用类似后者的内容,你将更清楚哪些功能失败了。
有用的函数
javascriptasync siteRemover(location: string) {await this.siteForm.waitFor({ state: 'visible' })await this.siteForm.scrollIntoViewIfNeeded()const siteDeselect = this.page.getByLabel(`Remove ${location}`)await siteDeselect.click()}
有许多不同的问题可能导致你的屏幕截图测试变得不稳定。像其他 Playwright 测试一样,确保使用诸如 `waitFor({ state: visible })` 和 `scrollIntoViewIfNeeded()` 之类的函数。这将确保你每次都能准确地捕获屏幕截图。
可以到我的个人号:atstudy-js
这里有10W+ 热情踊跃的测试小伙伴们,一起交流行业热点、测试技术各种干货,一起共享面试经验、跳槽求职各种好用的
欢迎加入 ↓ ↓ ↓
多行业测试学习交流群,内含直播课+实战+面试资料
AI测试、 车载测试、自动化测试、银行、金融、游戏、AIGC.
我们还可以在表示加载状态的元素上使用 `waitFor({ state: hidden })`。
在我们的项目中,我们还实现了一种网络轮询方法,这将确保在为某些元素拍摄屏幕截图之前,所有网络活动都已停止。在某些情况下,由于元素处于加载状态,屏幕截图可能不准确,这被证明是非常有用的。
使用 Playwright 高效模拟数据
模拟数据是拼图的另一个重要部分。
最初,我们只是简单地提取一个 JSON 对象,然后从一个辅助文件中导出它。这在实际代码方面相当繁琐(有时一个测试项的模拟数据代码会达到四千行)。
然后,我们通过使用重写接口减少了不必要的代码。
javascriptinterface forecastAPIResponse {base_time: stringvalid_time: stringlocation_type: stringlocation_name: stringlocation: { longitude: number; latitude: number }overall_aqi_level: numberno2: { aqi_level: number; value: number }o3: { aqi_level: number; value: number }pm2_5: { aqi_level: number; value: number }pm10: { aqi_level: number; value: number }so2: { aqi_level: number; value: number }}
这意味着我们现在可以有默认的模拟值,并且只在实际测试场景中更改我们需要的内容。
javascriptexport function createForecastAPIResponseData(overrides: Partial<forecastAPIResponse> = {},): forecastAPIResponse {const defaultForecastResponse = {base_time: '2024-07-08T00:00:00Z',valid_time: '2024-07-08T00:00:00Z',location_type: 'city',location_name: 'Los Angeles',location: { longitude: -22.90642, latitude: -43.18223 },overall_aqi_level: 3,no2: { aqi_level: CaseAQI3.aqiLevel, value: CaseAQI3.no2 },o3: { aqi_level: CaseAQI3.aqiLevel, value: CaseAQI3.o3 },pm2_5: { aqi_level: CaseAQI3.aqiLevel, value: CaseAQI3.pm2_5 },pm10: { aqi_level: CaseAQI3.aqiLevel, value: CaseAQI3.pm10 },so2: { aqi_level: CaseAQI3.aqiLevel, value: CaseAQI3.so2 },}return { ...defaultForecastResponse, ...overrides }}
现在来看一个测试设置的使用示例。我们希望保持其他所有内容不变,只更改四个值。
javascripttest.describe('City graph snapshots', () => {test.beforeEach(async ({ cityPage, page, banner }) => {const mockedForecastResponse = [createForecastAPIResponseData({base_time: '2024-07-01T00:00:00Z',valid_time: '2024-07-01T00:00:00Z',location_name: 'Rio de Janeiro',overall_aqi_level: 1,})]// 满足模拟并开始测试步骤})})
这使我们无需为使用不同端点的测试模拟许多对象。因此,减少了大量代码,使测试更容易遵循和维护。
结论
Playwright 快照测试易于设置,甚至 API 模拟也非常简单。但应谨慎使用。团队必须紧密合作,确保在需要时适当维护和更新快照。特别是如果这些快照测试是 CI/CD 回归管道的一部分。你还应该清楚正在测试的确切范围,因为 Playwright 中的模拟数据可能会无意中绕过任何 API 功能。这就是为什么它主要用于面向前端的 UI 功能,而不是完整的端到端流程。它是一个快速扩展的 GUI 应用程序的绝佳补充,因为它在任何测试阶段都能节省大量时间。
相关文章:
Playwright快照测试:如何让UI回归测试变得轻松高效
引言 使用带有模拟数据的PlaywrightP快照可以显著提高UI回归测试的速度。它能够快速自动化检查三大主流浏览器(Chromium、Firefox、Webkit)中的 UI 元素。你可以将多个断言绑定到一个快照上,这极大地提高了 UI 测试的效率。在 GUI 应用快速扩…...
控制理论-传递函数
【硬核】终于有人把传递函数和卷积定理讲明白了!自动控制原理入门-传递函数 | 卷积定理 | 频率响应 | 喵星考拉...
虚拟世界的AI魔法:AIGC引领元宇宙创作革命
云边有个稻草人-CSDN博客——个人主页 热门文章_云边有个稻草人的博客-CSDN博客——本篇文章所属专栏 ~ 欢迎订阅~ 目录 1. 引言 2. 元宇宙与虚拟世界概述 2.1 什么是元宇宙? 2.2 虚拟世界的构建 3. AIGC在元宇宙中的应用 3.1 AIGC生成虚拟世界环境 3.2 AIGC…...
带QT界面的文件管理系统
下载地址 下载&完整介绍地址:https://www.mcso.top/course-design/qt-filesystem/ 开源地址:https://github.com/mcdudu233/FileSystem.git 软件包含 (1)设计数据的结构 (2)设计文件管理系统 &…...
【区块链安全 | 第二十六篇】表达式与控制结构(二)
文章目录 表达式与控制结构赋值结构化赋值与返回多个值数组和结构体的赋值复杂性作用域和声明检查或不检查的算术运算错误处理:Assert、Require、Revert 和异常通过 assert 进行 Panic 和通过 require 进行 Errorreverttry/catch表达式与控制结构 赋值 结构化赋值与返回多个…...
2025年前端框架全景解析:React、Vue、Angular的生态与未来之争
一、市场格局:全球与国内的双重差异12 全球市场React:凭借Facebook的支持和庞大的社区,全球使用率超40%,尤其在数据密集型应用(如金融、社交平台)中占据主导。其跨平台能力(React Native)和灵活生态(Next.js、Redux)是核心竞争力。Vue:亚洲市场占比显著,中国开发者…...
【VScode】C/C++使用教程
编辑器 1. VScode本质上是一款代码编辑器,上面包含了许多插件。 VScode下载 1. 下载链接:Download Visual Studio Code - Mac, Linux, Windowshttps://code.visualstudio.com/download2. 在拓展部分下载汉化包:Chinese。 编译器 1. 我们使用M…...
【Node】如何使用PM2高效部署nodejs前端应用
引言 Node.js 这个服务端 JavaScript 运行时,能帮你打造高性能的实时 Web 和移动应用。不过相比传统的 Apache 或 Nginx 这类 Web 服务器,Node 应用的管理可要多花点心思。 PM2 就是专为生产环境设计的 Node 应用进程管理系统。这篇指南将手把手教你安…...
从零开始的图论讲解(1)——图的概念,图的存储,图的遍历与图的拓扑排序
目录 前言 图的概念 1. 顶点和边 2. 图的分类 3. 图的基本性质 图的存储 邻接矩阵存图 邻接表存图 图的基本遍历 拓扑排序 拓扑排序是如何写的呢? 1. 统计每个节点的入度 2. 构建邻接表 3. 将所有入度为 0 的节点加入队列 4. 不断弹出队头节点,更新其…...
无人机双频技术及底层应用分析!
一、双频技术的核心要点 1. 频段特性互补 2.4GHz:穿透力强、传输距离远(可达5公里以上),适合复杂环境(如城市、建筑物密集区),但易受Wi-Fi、蓝牙等设备的干扰。 5.8GHz:带宽更…...
基础知识补充篇:认识区块链浏览器
专栏:区块链入门到放弃查看目录-CSDN博客文章浏览阅读218次。为了方便查看将本专栏的所有内容列出目录,按照顺序查看即可。https://blog.csdn.net/qq_22502303/article/details/147022618?spm=1001.2014.3001.5501 前言 在《基础知识补充篇:什么是区块链RPC节点》文中笔者…...
git rebase复杂场景验证
经常面临复杂的分支管理,这里对几种场景的行为做一些验证。 结论总结 git rebase br_name:等价与新建br_name分支,然后找到当前分支与br_name分支的分叉点。然后把分叉点以后的提交(当前分支)一个一个的cherry-pick过…...
安宝特应用 | 工业AR技术赋能高端制造领域验收流程数字化转型
引言 随着高端制造行业对效率与安全要求的不断提升,传统验收模式正迎来智能化升级。针对特殊行业产品验收过程中存在的跨区域协作难、人工核验效率低等痛点,基于AR增强现实技术的智能验收方案正在成为转型新方向。 01 可视化协同提升验收效能 安宝特AR…...
Spring启示录、概述、入门程序以及Spring对IoC的实现
一、Spring启示录 阅读以下代码: dao package org.example1.dao;/*** 持久层* className UserDao* since 1.0**/ public interface UserDao {/*** 根据id删除用户信息*/void deleteById(); } package org.example1.dao.impl;import org.example1.dao.UserDao;/**…...
Oracle 23ai Vector Search 系列之4 VECTOR数据类型和基本操作
文章目录 Oracle 23ai Vector Search 系列之4 VECTOR数据类型和基本操作VECTOR 数据类型基本语法Vector 维度限制和向量大小向量存储格式(DENSE vs SPARSE)1. DENSE存储2. SPARSE存储3. 内部存储与空间计算 Oracle VECTOR数据类型的声明格式VECTOR基本操…...
如何用开源工具,把“定制动漫面具”做成柔性制造?
原文链接:https://www.nocobase.com/cn/blog/kigland。 引言 在苏州,有一支团队正在悄悄改变个性化制造的方式。他们不做快消品,也不靠规模取胜,却在全球角色扮演爱好者圈子里收获了不少“忠粉”。 他们叫 KIGLAND,一…...
《命理学》专项探究与研习
基础论调 八字是什么 八字:用天干地支表示一个人的出生时间 例如: 如上图:某人的干支历出生时间:甲申年--己巳月--戊戌日--癸丑时 十天干 甲乙丙丁戊己庚辛壬癸 奇数位为阳,偶数位为阴 十二地支 子丑寅卯辰巳午未申酉…...
Linux 指令初探:开启终端世界的大门
前言 当我们初次接触 Linux,往往会被一串串在黑底屏幕中跳动的字符震撼甚至吓退。然而,正是这些看似晦涩的命令,构建了服务器、嵌入式系统乃至云计算的世界。 本篇将带你从最基础的 Linux 指令开始,逐步揭开命令行的神秘面纱。从…...
CentOS 7 yum 无法安装软件的解决方法
一、解决方法 1、备份原有的 CentOS 7 默认 YUM 源配置文件 mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.backup2、从阿里云镜像源下载 CentOS 7 的 YUM 源配置文件,并覆盖原有的配置文件 wget -O /etc/yum.repos.d/CentOS-Base.re…...
oracle 游标的管理
8.2.1游标的概念和类型 游标(CURSOR)存储于服务器端,当服务器执行了一个查询后,查询返回的记录集存放在光标中,通过光标上的操作可以把这些记录检索到客户端的应用程序。光标是一种变量,它对应于一个查询语句确定的结果集。它用于…...
深入理解PCA降维:原理、实现与应用
1. 引言 在机器学习与数据科学领域,我们经常会遇到高维数据带来的"维度灾难"问题。随着特征数量的增加,数据稀疏性、计算复杂度等问题会显著加剧。主成分分析(PCA, Principal Component Analysis)作为一种经典的降维技术,能够有效解…...
AI重构农业:从“面朝黄土“到“数字原野“的产业跃迁—读中共中央 国务院印发《加快建设农业强国规划(2024-2035年)》
在东北黑土地的万亩良田上,无人机编队正在执行精准施肥作业;在山东寿光的智慧大棚里,传感器网络实时调控着番茄生长的微环境;在云南的咖啡种植园中,区块链溯源系统记录着每粒咖啡豆的旅程。这场静默的农业革命…...
当前主流的LLM Agent架构、能力、生态和挑战
一、LLM Agent的基本架构 尽管LLM Agent的具体实现五花八门,但大部分系统在架构层面上可以归纳为以下几个关键模块: 感知(Perception) Agent需要感知外界的信息。对于文本环境,感知往往是读取输入(如用户指…...
网站缓存怎么检查是否生效?
为何选择CDN缓存技术? 部署内容缓存系统可有效提升网页响应效率,降低服务器资源占用与流量消耗,改善访客交互体验,强化系统架构容错能力,促进搜索引擎优化效果,达成资源分配与运行效能的动态平衡。 科学配…...
Qt的稳定版本与下载
Qt的稳定版本主要包括Qt5和Qt6的长期支持(LTS)版本。以下是详细的版本信息: Qt5的稳定版本 Qt5.6 LTS:2016年3月15日发布,是一个长期支持版本。 Qt5.9 LTS:2017年6月16日发布,也…...
用 OpenCV 给图像 “挑挑拣拣”,找出关键信息!
目录 一、背景 二、OpenCV 关键词提取基础概念 什么是关键词提取 OpenCV 在关键词提取中的作用 三、OpenCV 关键词提取的流程 整体流程概述 详细步骤及作用 流程图 四、OpenCV 关键词提取的代码实现 环境准备 代码演示 代码说明 五、常见问题及解决方法 特征提取不…...
14-Hugging Face 模型微调训练(基于 BERT 的中文评价情感分析(二分类))
1. datasets 库核心方法 1.1. 列出数据集 使用 datasets 库,你可以轻松列出所有 Hugging Face 平台上的数据集: from datasets import list_datasets # 列出所有数据集 all_datasets list_datasets() print(all_datasets)1.2. 加载数据集 你可以通过…...
php-cgi参数注入攻击经历浅谈
起因: 阿里云服务器再次警告出现挖矿程序。上一次服务器被攻击后,怕有恶意程序残留,第一时间重装了系统,也没有详查攻击入口。不过事后还是做了一些防范,这台留作公网访问的服务器上并未保留业务数据,只作…...
istio流量治理——重试
Istio 的重试功能的底层原理主要依赖于其数据平面组件 Envoy 代理(Sidecar 或 Gateway)的实现。Envoy 是一个高性能的代理服务器,负责处理所有流入和流出的流量,并在 Istio 的服务网格中执行流量管理策略,包括重试逻辑…...
Spring Cloud之服务入口Gateway之Route Predicate Factories
目录 Route Predicate Factories Predicate 实现Predicate接口 测试运行 Predicate的其它实现方法 匿名内部类 lambda表达式 Predicate的其它方法 源码详解 代码示例 Route Predicate Factories The After Route Predicate Factory The Before Route Predicate Fac…...
测试分类篇
文章目录 目录1. 为什么要对软件测试进行分类2. 按照测试目标分类2.1 界面测试2.2 功能测试2.3 性能测试2.4 可靠性测试2.5 安全性测试2.6 易用性测试 3. 按照执行方式分类3.1 静态测试3.2 动态测试 4. 按照测试方法分类4.1 白盒测试4.1.1 语句覆盖4.1.2 判定覆盖4.1.3 条件覆盖…...
Django接入 免费的 AI 大模型——讯飞星火(2025年4月最新!!!)
上文有介绍deepseek接入,但是需要 付费,虽然 sliconflow 可以白嫖 token,但是毕竟是有限的,本文将介绍一款完全免费的 API——讯飞星火 目录 接入讯飞星火(免费) 测试对话 接入Django 扩展建议 接入讯飞星火…...
使用NVM下载Node.js管理多版本
提示:我解决这个bug跟别人思路可能不太一样,因为我是之前好用,换个项目就不好使了,倦了 文章目录 前言项目场景一项目场景二解决方案:下载 nvm安装 nvm重新下载所需Node 版本nvm常用命令 项目结构说明 前言 提示&…...
下载安装Node.js及其他环境
提示:从Node版本降级到Vue项目运行 文章目录 下载Node.js环境配置配置环境变量 安装 cnpm(我需要安装)安装脚手架安装依赖安装淘宝镜像(注意会更新)cnpm vs npm 与新旧版本核心差异包管理器不同功能差异如何选择&#…...
Java 基础-31-枚举-认识枚举
在Java编程语言中,枚举(Enum)是一种特殊的类,它允许一组固定的常量。它们非常适合用来表示一组固定的值,比如星期几、季节、颜色等。枚举自Java 5开始引入,为定义常量提供了一种更强大和方便的方式。本文将…...
问题1:Sinal 4在开启PAC检查的设备崩溃
问题信息 硬件不支持PAC(Pointer Authentication),此类错误就是signal 11的错误,崩溃信息如下: Build fingerprint: google/sdk_gphone64_arm64/emu64a:16/BP22.250221.010/13193326:userdebug/dev-keys Revision: 0 ABI: arm64 Timestamp: 2025-04-06 11:33:13.923…...
美团Leaf分布式ID生成器:雪花算法原理与应用
📖 前言 在分布式系统中,全局唯一ID生成是保证数据一致性的核心技术之一。传统方案(如数据库自增ID、UUID)存在性能瓶颈或无序性问题,而美团开源的Leaf框架提供了高可用、高性能的分布式ID解决方案。本文重点解析Leaf…...
【C++奇遇记】C++中的进阶知识(多态(一))
🎬 博客主页:博主链接 🎥 本文由 M malloc 原创,首发于 CSDN🙉 🎄 学习专栏推荐:LeetCode刷题集 数据库专栏 初阶数据结构 🏅 欢迎点赞 👍 收藏 ⭐留言 📝 如…...
C++自学笔记---指针在数组遍历中的应用
指针在数组遍历中的应用 在这一篇文章中,我们可以看到指针在数组遍历中的具体应用例子。 1. 赋值 我们要创建一个将数组的所有元素赋值为 1 的函数,并使用解引用运算符来访问数组元素. 代码为: #include <iostream> using namespac…...
Java八股文-List集合
集合的底层是否加锁也就代表是否线程安全 (一)List集合 一、数组 array[1]是如何通过索引找到堆内存中对应的这块数据的呢? (1)数组如何获取其他元素的地址值 (2)为什么数组的索引是从0开始的,不可以从1开始吗 (3)操作数组的时间复杂度 ①查找 根据索引查询 未…...
二叉树——队列bfs专题
1.N叉树的层序遍历 我们之前遇到过二叉树的层序遍历,只需要用队列先进先出的特性就可以达到层序遍历的目的。 而这里不是二叉树,也就是说让节点的孩子入队列时不仅仅是左右孩子了,而是它的所有孩子。而我们看这棵多叉树的构造,它…...
ESPIDF备忘
ESP8266 环境搭建 Windows 首先确保安装好了vscode和git 在工作目录使用git 克隆这个 git clone --recursive https://github.com/espressif/ESP8266_RTOS_SDK.git下载 集成环境和 ESP8266编译工具 旧版本的集成工具可能有问题 这里用20200601版本的 https://dl.espressif.co…...
4-c语言中的数据类型
一.C 语⾔中的常量 1.生活中的数据 整数: 100,200,300,400,500 小数: 11.11 22.22 33.33 字母: a,b,c,d A,B,C,D 在 C 语⾔中我们把字⺟叫做字符. 字符⽤单引号引⽤。例如A’ 单词…...
ST 芯片架构全景速览:MCU、无线 SoC、BLE 模块、MPU 差异详解
在嵌入式开发中,ST 是一个非常常见的芯片厂商,其产品线覆盖了 MCU、无线芯片、BLE 模块以及运行 Linux 的 MPU 等多个领域。很多开发者初次接触 ST 时会对这些产品之间的关系感到困惑。 本文从分类视角出发,带你快速了解 ST 芯片家族的核心架构和主要用途。 🧭 ST 芯片四…...
第十章Python语言高阶加强-SQL(数据库)
目录 一.数据库介绍 二.MySQL的安装 三.MySQL入门使用 四.SQL基础和DDL 五.SQL—DML 六.SQL—DQL 1.基础查询 2.分组聚合 七.Python操作MySQL 1.基础使用 2.数据插入 此章节主要掌握并且了解SQL语法和基础使用。如:安装、增删改查,SQL在未来我…...
NO.71十六届蓝桥杯备战|搜索算法-递归型枚举与回溯剪枝|枚举子集|组合型枚举|枚举排列|全排列问题(C++)
什么是搜索? 搜索,是⼀种枚举,通过穷举所有的情况来找到最优解,或者统计合法解的个数。因此,搜索有时候也叫作暴搜。 搜索⼀般分为深度优先搜索(DFS)与宽度优先搜索(BFS)。深度优先遍历vs深度优先搜索,宽度…...
C++ 中为什么构造函数不需要实现虚函数,而析构函数需要?
在C中,构造函数不需要是虚函数,而析构函数往往需要,原因如下: 构造函数 对象创建顺序:构造函数的主要任务是初始化对象的成员变量,创建对象时需要先调用基类的构造函数,再调用派生类的构造函数…...
如何获取oracle cloud永久免费的vps(4C/24G)?
1.注册oracle cloud账号 Oracle Cloud 免费套餐 | Oracle 中国 新注册的小伙伴,可以在 30 天内,利用 300 美元免费储值,任性使用所有 Oracle Cloud 基础设施服务。 30 天后呢?你仍然可以畅享 Always Free 免费套餐中的云服务&am…...
TypeScript面试题集合【初级、中级、高级】
初级面试题 什么是TypeScript? TypeScript是JavaScript的超集,由Microsoft开发,它添加了可选的静态类型和基于类的面向对象编程。TypeScript旨在解决JavaScript的某些局限性,比如缺乏静态类型和基于类的面向对象编程,…...
java面试篇 并发编程篇
目录 1.线程的基础知识 1.线程与进程的区别? 2.并行与并发的区别? 3.创建线程的方式有哪些? 4.线程包括哪些状态?状态之间是如何变化的? 5.T1,T2,T3三个线程新建完毕后,如何保证…...