软件性能测试学习笔记(LoadRunner):从零开始

文章目录

    • 概述
    • LoadRunner的使用
      • 创建编辑脚本(Virtual User Generator)
        • 集合点
        • 思考时间
        • 事务
        • 检查点
        • 关联
        • 参数化
      • 运行负载测试(Controller)
    • 性能测试报告
      • 场景设置表格
      • 测试指标记录表
    • 其他的杂谈内容

概述

软件的性能测试与软件的功能测试完全不同,只关注服务器的表现。软件的测试方式有多种,常用的有三种,分别是压力测试、负载测试和稳定性测试。除此之外,还有故障转移与恢复测试等方式。

  • 压力测试:一瞬间给软件进行高强度施压,因此压力测试也被称为并发测试。
  • 负载测试:持续地给软件增大压力。
  • 稳定性测试:将压力保持到一定的较高值后维持来测试软件的忍耐力。稳定性测试往往需要持续几个小时。

在进行性能测试之前,需要完成前期的准备工作:

  1. 确定性能测试的类型:确定进行性能测试的方式是哪一种。例如,对接口进行并发属于压力测试;测试网站的客户容量属于负载测试。
  2. 确定性能测试的指标:事先确定用于评价软件性能的标准。例如,对于网站的响应时间而言,一般认为1秒内是非常好,3秒内是很好,5秒内是良好,7秒以内是合格,超过7秒是不合格。
  3. 确定测试机配置和服务器配置:需要使得测试机和服务器的实力尽可能“旗鼓相当”,不能有一方过强或太弱。还需要确定服务器的数量和测试机的数量(多台测试机可以进行多机联合测试),因为多台服务器或多台测试机都会使得一方的力量增强。
  4. 确定服务器的IP地址:只有知道了服务器的IP地址,才能远程对服务器的各项指标进行监控。
  5. 编写性能测试用例:也就是设计一个对软件进行使用的流程,通过该流程来对性能进行测试。

进行软件性能测试必须要已经安装好测试软件。本篇博客中使用的软件是LoadRunner。如果需要对接口进行性能测试,则需要使用另一款软件JMeter,此处不进行展开,仅介绍业务的性能测试。

业务性能测试的流程

  1. 录制性能脚本:根据需要进行测试的业务录制好性能脚本;
  2. 进行脚本增强:直接通过录制获得的脚本仅仅是初步的脚本内容,不能直接使用,需要进行脚本增强。脚本增强中的常用技术包括集合点、事务、关联、检查点、参数化、用户思考时间和其他函数设置等,将在后面进行介绍。脚本增强也是本篇博客内容的重难点。
  3. 设计性能场景:将经过增强后的性能脚本进行导入,并对虚拟用户人数、持续时间、结束时间等进行设置(相当于模拟出网站被很多用户使用的情况)。设计完成后即可运行场景。
  4. 性能指标评估:对上一步的场景运行结果通过定量的指标进行评估,常用的指标包括吞吐量、响应时间、每秒点击次数、并发用户数量、报错信息、HTTP响应数量、CPU/内存占用情况和网络延迟时间等。
  5. 编写测试报告:通过对结果制作分析表的方式对结果进行分析。

LoadRunner的使用

注意事项:LoadRunner的打开最好使用以管理员身份打开,否则可能会出现一些奇怪的报错。例如,可能导致出现无法连接Internet的报错。

LoadRunner的组成:LoadRunner由创建编辑脚本(Virtual User Generator)、运行负载测试(Controller)和分析测试结果(Analysis)三部分组成。我使用的LoadRunner版本是12.02。

创建编辑脚本(Virtual User Generator)

打开VUG后的界面如下图所示:

在这里插入图片描述

新建一个运行脚本:点击左上角菜单的文件选项,在下拉部分选择新建一个脚本和解决方案,如下所示。另外,在文件菜单中也可以选择打开一个运行脚本(解决方案)。

在这里插入图片描述

选择单协议Web - HTTP/HTML,表示仿真浏览器和Web服务器之间的通讯。同时需要设置脚本名称和存储位置。

在这里插入图片描述

另外,点击左下角的协议分析软件按钮,选择录制所用的浏览器和需要进行测试的URL地址,然后点击开始分析。注意,这一步并非必须的,只是用于判定当前所使用的浏览器是否受到支持。

在这里插入图片描述

注意事项①:如果使用的是LoadRunner 11系列的版本,则可能对一些浏览器不支持。此时可以安装一个火狐24版本的浏览器并设置即可。
注意事项②:由于LoadRunner的虚拟用户对网站具有攻击性,因此不能用该软件随意对各类网站进行测试实验。LoadRunner提供了一个飞机订票模拟网站用于练手。

在上上张图中点击创建按钮,即可创建一个原始的Action测试脚本,效果如下图所示。此时的脚本内容是空的,我们需要通过接下来的录制来向脚本中自动添加内容。

在这里插入图片描述

在上面的界面的菜单栏中依次点击录制录制选项录制,选择基于HTML的脚本。这是因为基于HTML的脚本比基于URL的脚本更加简洁和干净。

在这里插入图片描述

点击右侧的HTML 高级,将脚本类型设置为仅包含明确URL的脚本

在这里插入图片描述

点击左侧脚本按钮,将脚本语言设置为C语言

在这里插入图片描述

点击左侧的高级按钮,在勾选字符集中选择UTF-8。如果不勾选可能会返回乱码。

在这里插入图片描述

上述设置完成后,点击确定按钮即完成录制设置。之后,点击主界面上方菜单的录制按钮即可对本次录制进行定义。目前,录制到操作暂时选择Action,录制模式选择Web浏览器,应用程序即用于录制所用的浏览器,URL地址即需要进行性能测试的网站。另外,还需要设置工作目录。之后,点击开始录制即可开始。开始后会自动打开指定的URL。

注意事项:下面的图片中,给定的浏览器程序是Internet Explore,但是实际上并不能使用这款浏览器,因为会导致录制的脚本是空白的。所以,推荐使用安装LoadRunner自带的火狐浏览器,相关博文链接:解决LoadRunner录制脚本为空的办法。如果还是录制失败,则可以尝试关闭后台的所有浏览器,清理内存和检查配置是否有误。

在这里插入图片描述

脚本录制实际上就是演示一遍需要进行性能测试的操作流程的内容。例如,我需要对网站的用户注册进行性能测试,我就在录制过程中完成一次完整的用户注册,然后结束录制即可。录制开始后的菜单如下。菜单中有停止录制、暂停录制等按钮。当录制完成时,只需要点击停止录制按钮即可。

在这里插入图片描述

停止录制后,再回到LoadRunner的软件界面,即可以看到出现了对应的脚本内容。一个好习惯是对生成的脚本运行(回放)一次,观察是否有报错,如果没有报错再进行后续的脚本增强等步骤。最后一定要记得保存脚本。

在这里插入图片描述

需要注意的是,录制过程一定要目的明确,不要做与所需要测试的流程无关的内容,这样会导致生成的脚本中内容很乱,无法直接用于后续的过程。

下面先介绍几个概念:

集合点
  • 定义:用于控制录制流程中进行施压的地方,此时,各个虚拟用户以不同的速度到达集合点后,只有等最后的虚拟用户也到达之后才会继续前进。因此,集合点能够控制在集合点之前的流程中不会出现大规模并发使得服务器提前崩溃的现象,也可以更好地集中力量测试我们所关心的界面的性能。

注意事项:一个脚本中尽量只有一个集合点,除非两个集合点之间的间距很长。这样做会使得第二个集合点的结果失真,并且给服务器造成了更大的压力。

插入集合点的方式非常简单,只需要在向网站发送请求前,在录制菜单中点击插入集合点并命名该集合点即可。

在这里插入图片描述

思考时间
  • 定义:思考时间是脚本中用于模拟用于在页面停留的函数,使用思考时间可以使得脚本更加真实。在脚本中的表示方法是lr_think_time(思考秒数) 。另外,LoadRunner中自带的函数都是以lr开头。

在录制后的脚本中,脚本中会自动根据录制过程中在每个页面的停留时长自动给思考时间赋值。但是,如果想要思考时间生效则需要进行运行时设置。点击左上角菜单中的查看,然后点击解决方案资源管理器,如下所示:

在这里插入图片描述

在左边弹出的菜单中,选择运行时设置,在弹出的界面中点击思考时间。可以看到,默认情况下会自动忽略思考时间,我们可以根据需要将其调整为按录制参数回放思考时间,也可以通过使用录制思考时间的随机百分比,来模拟多用户使用的情况,在这种情况下还可以选择将思考时间限制为指定的秒数。

在这里插入图片描述

注意事项:集合点之前不能设置思考时间。

事务
  • 定义:一段被包裹起来的过程。可以认为事务就是录制过程中的一小部分。通过对事务进行封装,可以将大的过程拆分为小的单独的单元进行处理。

LoadRunner中插入事务的方法非常简单,只需要在录制的过程中,对于需要单独进行分析的事件之前,在录制菜单中选择插入开始事务并命名,然后事件完成后点击插入结束事务并选择对应的开始事务名即可。尽管可以通过写代码的方式在脚本中直接插入事务,但是还是推荐初学者在录制的过程中插入。

在这里插入图片描述
在这里插入图片描述
需要注意的是,事务的内部不能有思考时间。这是因为如果事务内部有思考时间,则会影响响应时间的结果。另外,集合点也不应该放在事务的内部,否则集合的时间也会影响响应时间的结果。

浪费的时间:响应时间中的浪费的时间是指服务器收到请求后到服务器回复请求所需的时间。

检查点
  • 定义:用于确保每一个页面都是正确测试的,不存在隐藏的错误。

检查点可以分为文本检查点和图片检查点,其中文本检查点通过查找返回的网页中是否有指定的字符串来判断是否出错。需要注意的是,插入脚本的位置是在界面获取完成之后。我们可以通过修改脚本代码的方式插入文本检查点:

web_find("web_find","What=待查找的内容",LAST)

需要说明的是,检查点也最好放在事务的外面,防止影响响应时间的检测。修改完代码后,进入脚本的运行时设置,勾选启用图像和文本检查,然后再运行脚本时就会进行检查了。

在这里插入图片描述
图像检查点在此不进行介绍。

关联
  • 定义:关联是指对于录制结果脚本中的一部分内容,其本身并不是常量而是变量(例如网站的Token),因此重复运行相同的脚本可能会失败获得不符合测试的内容要求,因此可以定义关联。

关联需要在变量获得之前进行插入,因为这样才能告诉服务器,其中某一个值是作为变量,请用特殊的方式进行处理。

LoadRunner12.02中建立关联的方式非常简单。在每一次完成脚本录制后,都会产生如下所示的窗口:

在这里插入图片描述
上述窗口表示LoadRunner在脚本录制的过程中自动扫描到了一个关联,即字段为userSession的部分。确定结果无误之后,可以点击窗口中的关联来创建这个关联。然后点击关闭。创建关联完成后,可以看到脚本文件中的userSession字段被替换为一个大括号表示的形式,如下图:

在这里插入图片描述

参数化
  • 定义:对于脚本中用户输入的部分,如果每一次的输入内容不同,则需要对不同的这一部分内容进行参数化,使得一个脚本可以处理多个不同的输入。

参数化和关联的区别:参数化是指由于用户输入内容不同所导致的脚本内容不同,参数化是由于服务器返回内容不同所导致的。

LoadRunner中对脚本中的部分内容进行参数化的方法非常简单。首先选中需要参数化的部分,然后右键点击,在菜单中依次选择使用参数替换新建参数,即可得到如下图所示的界面:

在这里插入图片描述
在该窗口中,我们可以设置参数的名称、类型和初始值。参数名称和初始值可以自定义,但是类型一般都是File类型。设置完成后点击确定,即可看到原始脚本代码中的值被替换。’

在这里插入图片描述
接着,我们在生成的参数处打开鼠标右键菜单,选择参数属性,打开如下所示的窗口:

在这里插入图片描述
上图中的文件路径实际上就是参数可以取的各个值,这些值被存放在指定的文件中。可以在界面中点击用记事本编辑按钮来修改文档中的内容。例如,初始打开文档的界面如下:

在这里插入图片描述
文档中的Username表示我们的参数名,T2020308250120-001表示参数需要取的一个值。如果我们需要该参数取更多值,例如T2020308250120-002,则可以修改文档内容,修改后的文档如下:

在这里插入图片描述
保存文档后退出即可看到参数属性界面的内容也发生了修改:

在这里插入图片描述

另外,也可以直接在界面中点击添加行按钮,快速增加新的参数取值。

除了一行一行设置取值之外,还可以点击数据向导按钮,从数据库中直接导入数据源。这里需要使用SQL语句,不做过多解释。

如果参数不只有一列(例如除了账号之外还有密码),则可以点击添加列按钮,进行列数据的添加。

我们可以看到界面中还有选择下一行更新值的时间两个属性,两个属性都可以取三个值,因此一共有九种不同的组合方法。这一部分内容是参数化的重点。不同组合的效果总结如下。其中的迭代次数是脚本的循环执行次数。

  • Sequential + Each iteration:每一次迭代中,都从数据表中取出下一个值。一轮迭代中所有用户的值相同。
  • Random + Each iteration:每一次迭代中,每一个虚拟用户都从数据表里面取出一个新的值。
  • Unique + Each iteration:每一次迭代中,都从数据表中取出下一个唯一的值。
  • Sequential + Each occurrence:每一次的参数出现都从数据表中取出下一个值,无论是否在同一次迭代中。
  • Random + Each occurrence:每一次的参数出现都从数据表中随机取出一个值,无论是否在同一次迭代中。
  • Unique + Each iteration:每一次迭代中,都将从数据表中取出下一个唯一值,无论是否在同一次迭代中。
  • Sequential + Once:第一次迭代中得到的值就会被每一个虚拟用户在接下来的所有迭代中使用。
  • Random + Once:第一次迭代中得到的随机值就会被每一个虚拟用户在接下来的所有迭代中使用。
  • Unique + Once:第一次迭代中分配的唯一值就会被每一个虚拟用户在接下来的所有迭代中使用。

在界面中点击模拟参数按钮,在弹出的界面中设置虚拟用户的数量迭代次数,如下所示,然后点击模拟,即可看出当前选择的属性组合情况下的参数结果。

在这里插入图片描述
根据上面的方法即可完成参数化。

其他内容:除了上述的几种脚本增强方式,脚本录制过程中还可以加入注释。完成了脚本的录制和增强后,下面就需要使用Controller来运行脚本。

运行负载测试(Controller)

打开Controller,初始界面如下所示:

在这里插入图片描述
我们可以在上述界面的左上角导入已经完成了增强的脚本并设置其名称。同时,我们还可以设置脚本所占的百分比(因为可以同时运行多个脚本)和进行测试的机器。导入需要运行的脚本并设置比例后的界面如下:

在这里插入图片描述
在脚本对应行的Load Generator处点击下拉菜单中的添加,在弹出的界面中,将名称一行设置为测试机的IP地址。如果以本机作为测试机,则直接输入localhost即可。然后点击确定

在这里插入图片描述
在Controller界面的左下角全局计划部分,双击启动VUser,选择启动脚本时的总共的虚拟用户数量,该用户数量是根据测试准备确定的。另外还可以是同时还是每隔多长时间增加指定个虚拟用户数量。设置完成后点击确定

在这里插入图片描述
回到Controller界面,同样在全局计划面板中,双击持续时间。持续时间可以分为完成前一直运行和指定的运行时间。我们根据需要进行选择,这里选择前者,然后点击确定。选择前者时则不需要考虑退出方法;如果选择后者,则是完成一次之后如果没有到达指定时间,则会重复第二遍运行。

在这里插入图片描述
上述内容设置完成后,点击运行,软件界面变为如下的形式。Controller的界面包括设计界面和运行界面,运行界面就是对各种各样的测试指标进行监控。

在这里插入图片描述
如果觉得四张测试指标图太少,可以在图像的空白区域点击右键,然后点击查看图,再点击显示八张图,这样就得到了下面所示的结果。可以进行监控的指标在左侧可用图部分,我们可以通过点击鼠标左键自由选择。

在这里插入图片描述

常用的指标包括:

  • 正在运行的VUser;(非常重要)
  • 事务的响应时间;(非常重要)
  • 每秒HTTP响应数
  • 有错误的VUser
  • 错误统计信息
  • 吞吐量;(非常重要);
  • 每秒点击次数;(非常重要,可以反映出并发的点)

LoadRunner对Windows资源(CPU和内存)的可视化效果不好,一般使用第三方工具进行监控。但是这里就先不去掉了,调整后的八张图如下所示:

在这里插入图片描述
如果还是想要使用Windows资源窗口对服务器进行资源监视,则右键点击该图,在菜单中选择添加度量。在弹出的页面中点击添加,然后输入服务器的IP地址即可。这里以本机为例:

在这里插入图片描述
按照下图选择的指标进行点击:

在这里插入图片描述

接下来,我们对图像的刷新率进行设置。在任意一张图上点击右键,在菜单中选择配置,打开如下的窗口,将刷新率进行修改,并勾选应用于所有图

在这里插入图片描述
所有设计完成后,在Controller界面中的右上角点击开始场景,就会自动执行,此时的性能指标图也会不断刷新,如下图所示:

在这里插入图片描述

点击右上角的Vuser,可以看到每一个虚拟用户的当前状态:

在这里插入图片描述
运行完成后的结果如下图所示:

在这里插入图片描述

注意事项:如果在脚本中本身插入了集合点,那么就需要先设置集合的方式后,再运行场景,否则结果可能会是错误的。

性能测试报告

性能测试报告包括场景设置表格和结果评价表格两部分。

场景设置表格

模板如下:

测试名称(包括进行测试的接口和测试类型,以及测试编号)
测试步骤
场景描述(用户数量和变化、集合点设置、需要并发的接口)
测试用例(脚本名称+占比)
运行模式
退出模式
预期结果

测试指标记录表

示例如下:

并发用户数量响 应时间吞吐量最大值CPU占用率内存占用率失败用户数量

其他的杂谈内容

  • CPU的自我保护温度:一般情况下,CPU的温度达到八九十摄氏度的时候就会报警并自动关机来实现自我保护。
  • 大型服务器的降温:将服务器放在环境温度很低的地方,从而来实现服务器的降温。
  • 服务器的操作系统:绝大多数服务器的操作系统都是Linux,这是因为Linux操作系统非常稳定。Windows系列操作系统中唯一一款能够作为服务器操作系统的是Window 2003。
  • 软件性能测试对测试机的要求:必须要较好的CPU(Intel i7以上)和较大的内存(至少8GB)。
  • 一步错步步错:如果业务性能测试的过程中,脚本录制错误,脚本增强错误等情况发生,后面的内容都是错误的,因此需要非常谨慎,保证每一步都是正确的。
  • 性能测试的时间:在用户集中使用和无人使用服务器的时候,性能测试的结果非常不一样。因此最好在无人使用服务器的时候进行性能测试。
  • 吞吐量:吞吐量是评价服务器的核心指标,表示了服务器处理事务的能力。当用户量从零开始增加时,服务器的吞吐量会上升;但是继续增加用户量,吞吐量会持续下降。在进行负载测试时,最好能够找到服务器负载的峰值对应的用户量进行测试。
  • CPU利用率的注意事项:在进行测试的过程中,一般要求CPU的利用率不能超过70%。
  • 练习过程中使用的虚拟用户数:练习过程中最好控制虚拟用户数不要太大,否则会给服务器造成很大的负担。
  • TPS:服务器处理速度的一个指标。TPS越高服务器的处理速度越快。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

在抖音电商,他们帮女性实现了L码自由

“很多(女装)店铺只做到L,甚至L(其实)是M码。”身高1米6、体重60公斤的达人鸭嗓明明120斤 在抖音上吐槽道,“尤其是夏天的连衣裙,胸围很多不超过85厘米,那它的意思就是你可以胖&…

优思学院|一文快速看懂TRIZ原理

在创新领域,TRIZ被翻译为发明问题的解决理论。TRIZ理论深刻揭示了创造发明的内在规律和原理,专注于澄清和强调系统中存在的矛盾,旨在完全解决这些矛盾,实现最终的理想解决方案。实践证明,运用TRIZ理论不仅能够极大地加…

python安装pip install报错Could not fetch URL https://pypi.org/simple/pip/...更换镜像源

更换镜像源 一. 现象pycharm使用 pip install xxx安装包时,一直报错: 二. 原因:三. 解决办法:一. 临时使用二. 永久更改三. 永久更改1. Windowswindows环境下Windows(示例win10) 2. Linux or Mac3. Pycharm…

【从删库到跑路】MySQL数据库 | 全局锁 | 表级锁 | 行级锁

文章目录 🌹简述🎄全局锁⭐数据备份🎈设置全局锁🎈对表进行备份🎈释放锁 🎄表级锁🛸表锁⭐读锁⭐写锁 🛸元数据锁🛸意向锁⭐意向共享锁⭐意向排他锁 🎄行级锁…

类属性修改(为什么python类不具备被赋值能力?)

为什么python类不具备被赋值能力?,用魔术方法收集实参,在类中可以定义方法处理实际参数,实现对类“赋值”。 (笔记模板由python脚本于2023年11月15日 12:45:27创建,本篇笔记适合初通Python类class的coder翻阅) 【学习的…

Fedora Linux 39 正式版官宣 11 月 发布

导读Fedora Linux 39 正式版此前宣布将于 10 月底发布,不过这款 Linux 发行版面临了一些延期,今天开发团队声称,Fedora Linux 39 正式版将于 11 月 7 日发布。 过查询得知,在近日的 "Go / No-Go" 会议上,开…

多维时序 | MATLAB实现PSO-BiLSTM-Attention粒子群优化双向长短期记忆神经网络融合注意力机制的多变量时间序列预测

多维时序 | MATLAB实现PSO-BiLSTM-Attention粒子群优化双向长短期记忆神经网络融合注意力机制的多变量时间序列预测 目录 多维时序 | MATLAB实现PSO-BiLSTM-Attention粒子群优化双向长短期记忆神经网络融合注意力机制的多变量时间序列预测预测效果基本介绍模型描述程序设计参考…

nacos集群配置(超完整)

win配置与linux一样,换端口或者换ip,文章采用的 linux不同IP,同一端口 节点ipportnacos1192.168.253.168848nacos2192.168.253.178848nacos3192.168.253.188848 单IP多个端口 1.复制两个,重命名 2.修改 conf目录下的 application…

【软考篇】中级软件设计师 第二部分(一)

中级软件设计师 第二部分(一) 八. 层次化结构8.1 局部性原理8.2 体系8.3 分类8.3.1 存取方式8.3.2 工作方式 8.4 Cache8.4.1 例题 8.5 地址映像 九. 主存编址9.1 例题一 十. 可靠性10.1 串联系统和并联系统 十一. 网络安全11.1 保密性11.2 完整性&#x…

Qt基础 QT QTextEdit自动滑动

目录 1.吐槽那些写文章不动脑子的人,不带脑子就别写,误人子弟 2.问题解决: 1.吐槽那些写文章不动脑子的人,不带脑子就别写,误人子弟 最近公司在做一个提词项目,本来对这里功能难易感觉属于一般的,谁知道碰到一个很简单问题,搞了半天,先喷一下百度浏览器 不知道是…

Visual Studio Code安装和设置中文

文章目录 Visual Studio Code安装Visual Studio Code设置中文 步骤如下: Visual Studio Code安装 1.下载安装包 VS Code的官网 下载链接中的“az764295.vo.msecnd.net” 替换为国内镜像地址“vscode.cdn.azure.cn”,下载速度直接飙升至几十 Mb/s。(在官网下载速度…

HCIA-经典综合实验(二)

经典综合实验(二) 实验拓扑配置步骤配置Eth-Trunk聚合链路第一步 配置二层VLAN第二步 配置MSTP生成树第三步 配置相关IP地址第四步 配置DHCP及DHCP中继第五步 配置三层的网关冗余协议 VRRP及OSPF第六步 配置静态路由,NAT地址转换及其他配置完善 配置验证…

微服务基础,分布式核心,常见微服务框架,SpringCloud概述,搭建SpringCloud微服务项目详细步骤,含源代码

微服务基础 系统架构的演变 随着会联网的发展,网站应用的规模不断扩大,常规的应用架构已经无法应对,分布式服务架构以及微服务架构势在必行,必须一个治理系统确保架构有条不紊的演进 单体应用框架 Web应用程序发展的早期&…

【Qt-23】Qt charts绘制曲线图

一、QChart简介 QChart是Qt中专门用于绘制图表的模块,支持折线图、柱状图、饼图等常见类型。其主要组成部分有: QChart:整个图表的容器,管理图表中的所有数据和图形属性QChartView:继承自QGraphicsView,用于…

Python安装第三方库出错完美解决方法

错误 Could not find a version that satisfies the requirement PIL (from versions: none) ERROR: No matching distribution found for PILTry to run this command from the system terminal. Make sure that you use the correct version of pip installed for your Pyth…

轻松找回您的珍贵回忆的最好的 6 种照片数据恢复软件!

照片是珍惜过去珍贵时刻的唯一方式。它们让记忆永存,帮助我们重温生命中最美好的时刻。但是,当这些时刻丢失时会发生什么?您是否曾经因系统崩溃而意外删除或丢失照片?丢失照片可能令人心碎,但仍有希望,因为…

力扣每日一道系列 --- LeetCode 138. 随机链表的复制

📷 江池俊: 个人主页 🔥个人专栏: ✅数据结构探索 ✅LeetCode每日一道 🌅 有航道的人,再渺小也不会迷途。 LeetCode 138. 随机链表的复制 给你一个长度为 n 的链表,每个节点包含一个额外增加…

【双指针】:Leetcode283.移动零

朋友们、伙计们,我们又见面了,本专栏是关于各种算法的解析,如果看完之后对你有一定的启发,那么请留下你的三连,祝大家心想事成! C 语 言 专 栏:C语言:从入门到精通 数据结构专栏&…

[数据结构]—带头双向循环链表——超详解

💓作者简介🎉:在校大二迷茫大学生 💖个人主页🎉:小李很执着 💗系列专栏🎉:数据结构 每日分享✨:旅行是为了迷路,迷路是为了遇上美好❣️❣️❣️ …

Git的基本操作以及原理介绍

文章目录 基本操作创建git仓库配置name和email .git目录的结构git add & git commit.git目录结构的变化 git追踪管理的数据git的版本回退回退的原理回退的三种情况 版本库中文件的删除git分支管理分支的删除合并分支时的冲突分支的合并模式分支策略git stash不要在master分…