性能测试工具——JMeter

news2024/12/23 11:08:33

目录

一、JMeter介绍

1、下载安装JMeter

2、打开JMeter

方式一:

方式二:

3、JMeter基础设置

4、JMeter基本使用流程

(1)启动JMeter

(2)在测试计划下添加线程组

(3)在 “线程组” 下添加 “HTTP” 取样器

(4)填写 “HTTP请求” 的相关请求数据

(5)在 “线程组” 下添加 “查看结果树” 监听器

(6)点击 “启动按钮”,查看接口测试结果

5、JMeter元件作用域和执行顺序

作用域:

执行顺序:

二、重点组件

1、线程组

2、HTTP取样器

3、查看结果树

4、HTTP Cookie 管理器

5、HTTP请求默认值

6、用户定义的变量

7、CSV数据文件设置

操作步骤

1、CSV数据文件设置

2、编写test.csv文件

3、修改登录接口及其他涉及到username和password获取的参数

4、修改线程组中线程数,使得每次取到的username和password都不一样​编辑

5、运行结果

8、JSON提取器

(1)添加JSON提取器

JSON操作符参考

(2)添加JSON配置

(3)使用刚才的配置

(4)测试

(5)分析

9、JSON断言

(1)添加断言

(2)添加JSON配置

10、同步定时器

11、事务控制器

三、安装插件

1、下载其他监听器

2、下载线程组插件

3、Stepping Thread Group

4、常见监听器

 (1)Active Threads Over Time

(2)聚合报告

(3)Response Times Over Time

(4)Transactions per Second(TPS)

四、测试报告

五、性能分析

1、响应时间

2、错误率(可靠性)

3、吞吐量


一、JMeter介绍

        环境要求:使用JMeter要求Java 8或更高的版本。

        Apache JMeter是Apache组织基于Java开发的压力测试工具,用于对软件做性能测试

        JMeter工作原理:

1、下载安装JMeter

        官网地址:Apache JMeter - Download Apache JMeter

        下载好后的路径:

2、打开JMeter

方式一:

        下载好后打开bin目录下的 jmeter.bat 文件。双击

方式二:

        配置系统环境变量,找到你下载jmeter的文件路径,添加路径,把你复制的路径粘贴上去。

        配置好路径后,打开cmd控制平台,输入jmeter。

3、JMeter基础设置

        找到 jmeter.properties 文件

        把语言设置成中文,如图:

4、JMeter基本使用流程

(1)启动JMeter

(2)在测试计划下添加线程组

(3)在 “线程组” 下添加 “HTTP” 取样器

(4)填写 “HTTP请求” 的相关请求数据

(5)在 “线程组” 下添加 “查看结果树” 监听器

(6)点击 “启动按钮”,查看接口测试结果

5、JMeter元件作用域和执行顺序

        在JMeter中,元件的作用域和执行顺序是非常重要的概念。

作用域:

        JMeter元件的作用域主要由测试计划的树形结构中的元件父子关系来确定

执行顺序:

        取样器(sampler)元件内组件不依赖其他元件就可以执行,因此取样器不存在作用问题。

        元件作用域值对它的子节点有作用。

        其他作用域默认根据测试计划中树形结构来定。


二、重点组件

1、线程组

        控制JMeter将用于执行测试的线程数,也可以把一个线程理解为一个测试用户。

线程数:一个线程即一个测试用户,设置发送的请求次数

Ramp-up时间(秒):设置性能测试运行时间,单位为秒

循环次数:

        配置指定次数:控制脚本循环执行的次数

        配置循环永远:

                需要调度器配置使用

                运行时间:脚本执行时间

                延迟启动时间:脚本等待指定时间才能运行

2、HTTP取样器

添加必需的配置:

        协议主机名/IP

        端口:

                协议端口号

        请求方法:

        路径(目录+参数)

        内容编码(默认为ISO国际标准,但对中文支持不友好,可以使用utf-8)。

        参数:

                参数可以拼在路径里,也可以写在参数中

                POST参数要放到消息数据中{wd:test}

3、查看结果树

        取样器结果:统计请求相关的信息

1、Thread Name:线程组名称

2、Sample time:发送请求时间

3、Load time:响应时间

4、Response code:接口响应状态码

        请求HTTP请求的请求头和请求体的详细信息

        响应HTTP响应的响应头和响应体的详细信息

4、HTTP Cookie 管理器

        添加了HTTP Cookie管理器后,会自动存储并发生Cookie。

        上面选项默认标准即可。

        HTTP Cookie管理器像Web浏览器应用存储和发送Cookie。如果HTTP请求并且响应包含Cookie,则Cookie管理器会自动存储该Cookie,并将其用于将来对该特定网站的所有请求。每个JMeter线程都有自己的“Cookie存储区”。因此,正在测试使用Cookie存储会话信息的网站,每个JMeter线程都将拥有自己的会话。此类Cookie不会显示在Cookie管理器显示屏上,可以使用“查看结果树监听器”查看。

        缓存配置可选择 standard(标准)或 compatibility(兼容的),当然也可以手工添加一些Cookie。

5、HTTP请求默认值

        添加完后,输入默认请求的URL

        这时候,把其他请求上的URL路径删掉,再次启动该请求,也不会保存,设置默认的URL,则会访问默认的URL。

        博客中涉及到的接口协议、IP、端口号全都一样,可以单独抽取出来存放在默认值中,其他接口就可以省略不写协议、IP、端口号。

6、用户定义的变量

        添加方式:线程组—>配置元件—>用户定义的变量

        有时候我们想要在固定的场景里使用参数化,改动后不希望影响到其他的脚本。这时候就可以自定义变量。

        使用方式在HTTP请求的取样器中引入定义的变量。${参数名}

        适用场景:变量需要在多个脚本中使用,方便统一管理和修改。

7、CSV数据文件设置

        以登录接口为例,当我们执行登录接口的性能测试时,手动配置了用户名和密码固定的username,然后实际使用中不可能只有一个用户登录,为了模拟更真实的登录环境,我们需要提供更多的用户username和password来实现登录操作。

        添加方式:线程组—>配置元件—>CSV数据文件设置

操作步骤

1、CSV数据文件设置

文件名填写CSV文件的路径。建议使用绝对路径

文件编码UTF-8

变量名称从CSV数据文件中读取的数据需要保存到变量名有多个变量时用逗号分隔

是否忽略首行是否从CSV数据文件第一行开始读取

分隔符要求与CSV数据文件中多列的分隔符一致

遇到文件结束符再次循环若选择为True,当数据不够的时候会从头去。若选择False,则需要勾选下面的配置,遇到文件结束符停止线程,这里如果不勾选,请求将会报错

2、编写test.csv文件

        如图:

3、修改登录接口及其他涉及到username和password获取的参数

        修改完该配置后,登录接口发起请求时将从CSV文件中获取配置好的username和password参数,获取顺序为从上往下依次获取获取。

4、修改线程组中线程数,使得每次取到的username和password都不一样
5、运行结果

8、JSON提取器

        接口响应成功后,通过提取返回值对应字段,可以用于其他接口的参数配置。

(1)添加JSON提取器

        针对某一个HTTP请求接口添加JSON提取器。

        以博客列表页为例子:

JSON操作符参考
OperatorDescription
$表示根元素
@当前元素
*通配符。所有节点
..选择所有符合条件的节点
.<name>子元素
['<name>'(,"<name>')]括号表示子元素或子元素列表
[<number>(,<number>)]数组索引或索引列表
[start:end]数组切片操作符
[?(<expression>)]过滤器表达式。表达式必须评估为布尔值

        参考文档:https://github.com/json-path/JsonPath

(2)添加JSON配置

        我们在查看结果树里面,换成JSON Path Tester,可以测试我们的JSON表达式是否正确,如图:

        添加表达式,如图:

(3)使用刚才的配置

        在博客列表页的HTTP信息管理头中,选中从用户登录里拿到的token

(4)测试

        这是再发起登录页和列表页中的请求,发现两者的token相同。

(5)分析

        目录结构如下:

        JSON提取器和登录页、列表页同级,所以会从这两个请求中获取 data 信息,把 data 的内容放进 token 中。

        从上往下扫描,登录页扫描到data了,就提取出来,列表页就能拿到登录页返回的token了。

        那如果登录页和列表页顺序反过来呢?

        

        此时再发起请求,发现报错了,如图:发现列表页并没有拿到token

        所以顺序不能变,JSON提取器是从上往下提取的。

        我们把JSON提取器放进登录页中,目录结果如下:

        

        也不能拿到token,发现请求的是从上往下执行的

        把登录页放第一位就好了。

9、JSON断言

        接口发送请求成功,响应码为200并不能完全代表接口请求成功,我们更多需要关注接口响应数据是否符合预期。这时就可以使用JSON断言了。

(1)添加断言

        针对某个接口添加断言,如图:给登录接口进行断言

        

(2)添加JSON配置

        正则表达式查询网站:正则表达式 – 语法 | 菜鸟教程 (runoob.com)

注意

1、若不选Additionally assert value,表示添加断言值,则可用来判断字段是否存在。

2、选择Additionally assert value,则必须添加 Expected Value 期望的断言值。

3、若不选 Match as regular expression 正则匹配,则 Expected Value 必须填写完整,少一个字符都会导致断言失败。

4、若选择 Match as regular expression 正则匹配,则 Expected Value 可以仅写上部分关键词,即可断言成功。

10、同步定时器

        为了达到并发的效果,需要添加同步定时器。

        没添加同步定时器前,有多个请求,只要这个请求准备好了,就发送。

        添加同步定时器后,设置一个集合点,有多个请求,这几个请求要满足这个集合点的数量,一起发送请求。

        同步定时器可以理解为过红绿灯,红灯的时候人都在等绿灯,绿灯后全部人都可以一起过马路了。

        JMeter 同步定时器的作用主要在于模拟多用户并发访问的场景,确保多个线程能够同时执行某个操作,以达到真正的并发效果。

        当多个线程同时启动时,它们可能会在不同的时间间隔内执行,这样就无法达到真正的并发效果。同步定时器的作用就是将这些线程的执行时间同步,使它们在同一时间点执行。它可以在多个线程之间制造一定的延迟,直到同时到达指定时间点,再同时执行后续的操作。

        此外,同步定时器可以理解为集合点,当线程数量达到指定值后,再一起释放,可以瞬间产生很大的压力。这样,可以更好地模拟真实的用户并发访问场景,提高测试的准确性和可靠性。

        在性能测试过程中,为了真实模拟多个用户同时进行操作,用来度量服务器的处理能力,可以使用同步定时器来设置集合点。不过,虽然通过加入集合点可以约束请求同时发送,但不能确保请求同时到达服务器,所以只能说是较真实模拟并发。

        现在模拟5个请求同时并发执行。

        执行顺序如图:

        这里同步定时器设置模拟用户数量最好是和线程组里的线程数量相同,或者线程数量是模拟用户数量的整数倍(但线程循环要设为永远,指定时间循环),这样才不会导致有剩余的请求发送不出去(因为要等到达集合点的数量,才能把这些请求一起发送出去)。

11、事务控制器

        JMeter 事务控制器的作用主要用于测试执行嵌套测试元素所花费的总时间。这相当于模拟用户进行一系列操作的测试。

        在进行页面性能测试或API性能测试时,事务控制器是一个非常重要的工具。它可以帮助测试人员更准确地评估系统性能,尤其是在涉及多个接口或操作的复杂场景中。例如,在订单提交的过程中,可能需要调用多个接口,并且某些接口可能依赖于前一个接口的结果。在这种情况下,使用事务控制器可以将这些接口统一视为一个事务进行性能测试,从而得到更接近真实场景的性能测试结果。

        若不添加事务控制器,则一个接口即一个事务。

        添加了事务控制器后,可以将多个接口统一放到一个事务控制器下座位一个事务。

        如图,把登录页和用户信息放到同一个事务中:

        发起请求,查看聚合报告

        发现原来的请求依然在,还多了个登录事务。


三、安装插件

        地址:Install :: JMeter-Plugins.org

        下载完成后把该文件放进lib/ext中,如图:然后再重启JMeter

        经过上述操作后,就能发现我们JMeter右上角多了一个蝴蝶logo,如图:

        点击蝴蝶logo,进行下述操作。

        添加以下插件:

1、下载其他监听器

        点击Apply Changes and Restart JMeter等待下载,下载完成后重启JMeter。

2、下载线程组插件

        点击Apply Changes and Restart JMeter等待下载,下载完成后重启JMeter。

        下载完成后可以看到多了许多配置,如图:

3、Stepping Thread Group

This group will start启动多少个线程,同线程组的线程数

First,wait for等待多少秒才开始压测,一般默认为0

Then start一开始有多少个线程数,一般默认为0

Next,add下一次增加多少个线程数

threads every当前运行多长时间后再次启动线程,即每一次线程启动完成之后的持续时间

using ramp-up启动线程的时间;若设置为1秒,表示每次启动线程都持续1秒

thenhold loadfor线程全部启动完之后持续运行多长时间

finally,stop/threadsevery多长时间释放多少个线程;若设置为5个和1秒,表示持续负载结束之后每1秒钟释放5个线程

        添加梯度线程组后,把这三个监听器加进去,然后测试上面添加的请求,如图:

        

        启动这个梯度线程组。下面介绍这几个监听器

4、常见监听器

 (1)Active Threads Over Time

        表示运行的线程数,可以看到,随着时间的变化,线程数随之变多,每隔3秒,增加5个,直到线程数到20停止增长,到后面每隔1秒释放5个线程,和上面我们设置的阶梯线程组一样

(2)聚合报告

        从聚合报告可以看到性能测试过程中整体的数据变化。如图:

指标说明
Samples发起的HTTP请求调用数
Average平均响应时间,单位为毫秒
Median请求调用响应时间的中间值,也就是50%请求调用的响应时间,单位为毫秒
90%Line90%请求调用的响应时间,单位为毫秒
95%Line95%请求调用的响应时间,单位为毫秒
99%Line99%请求调用的响应时间,单位为毫秒
Min请求调用的最小响应时间,单位为毫秒
Max请求调用的最大响应时间,单位为毫秒
Error%调用失败的请求占比。调用失败一般指响应断言失败或者请求调用出错
ThroughputTPS/QPS,每秒处理的事务数
KB/sec每秒网络传输的流量大小,单位为KB。这个指标是以网络传输的大小来衡量网络吞吐量

(3)Response Times Over Time

        Response Times Over Time 主要用于监听整个事务运行期间的响应时间。在测试过程中,它可以帮助测试人员观察并分析响应时间的实时平均值以及整体响应时间的走向。通过这一监听器,测试人员能够更直观地了解系统在不同时间点的响应性能,从而发现可能存在的性能问题或瓶颈。

        Response Time Over Time的图形展示中,横坐标通常代表运行时间,而纵坐标则代表响应时间(单位是毫秒)。测试人员可以根据图形中的趋势线来判断响应时间的稳定性以及是否存在大的波动。例如:如果响应时间在某个时间点突然增加,这可能意味着系统在该时间点遇到了性能问题。

(4)Transactions per Second(TPS)

       JMeter中的Transactions per Second(TPS)监听器是一个用于分析系统吞吐量的重要工具。TPS,即每秒处理的事务数,表示一个客户机向服务器发送请求后,服务器做出反应的过程。这个指标反映了系统在同一时间内处理业务的最大能力。TPS值越高,说明系统的处理能力越强。

        在使用TPS监听器时,横坐标通常代表运行时间,而纵坐标则代表TPS值。通过监听器展示的图表,可以清晰地看到TPS值随时间的变化情况。在图表中,红色通常表示通过的TPS,而绿色可能表示失败的TPS。这有助于我们快速识别系性能的变化和瓶颈。


四、测试报告

        JMeter 测试报告是一个全面而详细的文档,它提供了关于测试执行结果的详细信息,帮助用户全面评估系统的性能并进行性能优化。

        生成性能测试报告的命令:Jmeter -n -t 脚本文件 -l 日志文件 -e -o 目录

-n:无图形化运行

-t:被运行的脚步

-l:将运行信息写入日志文件,后缀为 jtl 的日志文件

-e:生成测试报告

-o:指定报告输出目录

        命令解析:先把指定的 jmx 文件执行一遍,再生成测试报告,放在当前路径first目录下(还有将运行信息写入日志文件,命名为 first.jtl)。

        运行完脚本后,查看对应的文件目录,如图:

        

        测试报告就在 index.html 文件下。

        里面的相关数据,JMeter工具里有的,这个报告里面都有。


五、性能分析

        通过三大指标来分析性能问题。

1、响应时间

        如果响应时间超过了要求,代表系统到了瓶颈。

        注意事项:分析在多少线程的情况下发送了超标。

        响应时间变化的原因:

1、系统不稳定,有时快有时慢。

2、随着并发压力变大而慢慢变慢,响应时间变高。

2、错误率(可靠性)

        高并发场景下,系统是否能够正常处理业务。

        要求:99.99%可靠,99.999%    (通常企业标准是4个9,军事标准为5个9)

        错误率高的原因:

1、接口请求错误。

2、服务器无法继续处理,达到了瓶颈(代码写的不好,内存泄露,硬件资源等)。

3、后端系统限流(系统里配置了不能超过多少并发)、熔断、降级。

(熔断:防止系统因某个服务器的故障而整体崩溃。当电商平台上用户支付时,收银台发现某个支付渠道,如微信支付失败率突增,超时严重,那么就可以临时把这个支付方式熔断掉。

    降级:主动关闭一些非核心功能,以确保核心功能的正常运行。某次腾讯视频挂了的时候,用户名称默认显示未腾讯用户,这也是一种降级方式,用兜底名称做展示。)

3、吞吐量

        吞吐量越大,性能越好;吞吐量相对稳定或者变低,可能系统达到了性能瓶颈。

        吞吐量变化规律:

波动很大:代表系统性能不稳定。

慢慢变高,在趋于稳定:和并发量相关。如果并发量小于吞吐量,慢慢增大并发量,吞吐量也会随之增加。

慢慢变低,并发量也减少了:要么性能测试要结束了,并发减少;也可能是系统变的卡顿,从而导致响应时间变慢,导致单个线程发起的并发量变少。

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

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

相关文章

防止企业数据泄露 | 信息数据电脑保护系统 | 天锐DLP数据安全

在当今这个高度信息化的时代&#xff0c;数据已跃升为企业运营不可或缺的核心战略资源&#xff0c;而面对企业内部终端上海量的数据信息&#xff0c;及时、准确地识别出重要的敏感数据是一项关键任务&#xff0c;它直接关系到企业的数据安全、合规性以及业务风险的控制。 【地址…

鸿蒙HarmonyOS NEXT系统揭秘:跨端迁移与多端协同

随着科技的飞速发展&#xff0c;万物互联的时代已经悄然来临。 在这个背景下&#xff0c;华为鸿蒙HarmonyOS NEXT系统的最新动向无疑成为了业界关注的焦点。 近日&#xff0c;关于鸿蒙操作系统将多设备协同功能细分为“跨端迁移”与“多端协同”的消息不胫而走&#xff0c;这…

基于单片机的太阳能热水器控制系统的研究-设计说明书

设计摘要&#xff1a; 本研究旨在设计和实现基于单片机的太阳能热水器控制系统。太阳能热水器是一种有效利用太阳能来加热水的设备&#xff0c;在节能和环保方面具有显著的优势。本研究通过使用单片机技术&#xff0c;将传统的太阳能热水器与智能控制相结合&#xff0c;提高了…

QT 中的信号与槽机制详解

目录 一、引言 二、信号与槽的基本概念 1.信号&#xff08;Signals&#xff09; 2.槽&#xff08;Slots&#xff09; 三、声明信号和槽 1.声明信号和槽 2.发射信号 3.连接信号和槽 四、高级特性 1.多信号连接到一个槽 2.一个信号连接到多个槽 3.断开信号和槽的连…

多融合的信息收集工具--Mitan

《网安面试指南》http://mp.weixin.qq.com/s?__bizMzkwNjY1Mzc0Nw&mid2247484339&idx1&sn356300f169de74e7a778b04bfbbbd0ab&chksmc0e47aeff793f3f9a5f7abcfa57695e8944e52bca2de2c7a3eb1aecb3c1e6b9cb6abe509d51f&scene21#wechat_redirect 《Java代码审…

北京市朝阳区自闭症寄宿学校:为孩子提供优质照顾与学习环境

北京市朝阳区自闭症寄宿学校的愿景与广州星贝育园的卓越实践 在北京市朝阳区&#xff0c;乃至全国范围内&#xff0c;自闭症儿童的教育与照护一直是社会各界关注的焦点。家长们渴望为孩子找到一所能够提供优质照顾与学习环境的学校&#xff0c;让他们在爱与专业的滋养下茁壮成…

trl中的PPO代码解析(炒冷饭版)

不说其他的解释&#xff0c;上来就看代码。建议先对PPO的整体流程有了解。 trl的版本为0.4.0&#xff0c;注&#xff1a;【新版的trl中代码更复杂&#xff0c;如果只是想读懂PPO具体怎么用trl实现的&#xff0c;0.4.0版本即可】 step1: rollout ppo_trainer.generate()函数…

从入门到精通:QT 100个关键技术关键词

Qt基础概念 Qt Framework - 一个跨平台的C图形用户界面应用程序开发框架。它不仅提供了丰富的GUI组件&#xff0c;还包括网络、数据库访问、多媒体支持等功能。 Qt Creator - Qt官方提供的集成开发环境&#xff08;IDE&#xff09;&#xff0c;集成了代码编辑器、项目管理工具、…

2024年AI技术爆发的元年,用对工具,让你副业比主业赚得多!

大家好&#xff0c;我是强哥 文字的力量不容小觑&#xff0c;或许你没有多好的文笔&#xff0c;或许你已经很久没有拿笔写字了&#xff0c;但是没关系&#xff0c;我们有工具&#xff01; AI时代的到来&#xff0c;不会用工具&#xff0c;那你可就OUT了 如果你觉得文字不能赚…

Convert excel format exception.You can try specifying the ‘excelType‘

在使用easyexcel读取文件流获取集合的时候报了这个错 在点进代码抛出异常的地方&#xff0c;发现这么一段逻辑 是通过文件流的前8个字节来判断文件的类型&#xff0c;实际上这种判断规则是无法保证准确的。然后自然的想到是不是引入的jar包版本太旧了&#xff0c;所以有这个b…

Axure大屏可视化模板:跨领域数据分析平台原型案例

随着信息技术的飞速发展&#xff0c;数据可视化已成为各行各业提升管理效率、优化决策过程的重要手段。Axure作为一款强大的原型设计工具&#xff0c;其大屏可视化模板在农业、园区、城市、企业数据可视化、医疗等多个领域得到了广泛应用。本文将通过几个具体案例&#xff0c;展…

安全测试|如何使用burpsuite+xray实现联动测试

目的&#xff1a;安全测试过程中手动分析测试与xray自动化扫描测试结合&#xff0c;这样可以从多层保障安全测试的分析&#xff0c;针对平台业务接口量大的安全测试是十分有用的&#xff0c;可以实现双向测试同时开始。 1.xray 安装和使用 1.1 下载地址&#xff1a;xray commu…

git push错误:Out of memory, malloc failed (tried toallocate 947912704 bytes)

目录 一、错误截图 二、解决办法 一、错误截图 因项目文件过大&#xff0c;http.postBuffer设置的内存不够&#xff0c;所以报错。 二、解决办法 打开cmd窗口&#xff0c;执行如下命令即可 git config --global http.postBuffer 1024000000 如图所示 执行完成以后&#…

WinCC中归档数据片段的时间和尺寸设置

1&#xff0e;归档数据片段介绍工控人加入PLC工业自动化精英社群 1.1 概述 WinCC V6.2 开始的后台数据库采用了MS SQL Server 2005 &#xff0c;所以归档方式与V5 有所不同&#xff0c;它的运行数据存放在数据片段&#xff08;segment&#xff09;当中&#xff0c;工程师可以…

Protobuf:基本概念与使用流程

Protobuf&#xff1a;基本概念与使用流程 基本概念Linux 安装使用流程.proto文件编译使用 运行机制 基本概念 在进行网络编程时&#xff0c;经常需要进行数据传输&#xff0c;只有双方主机都保证数据格式的一致性&#xff0c;才能保证数据被正常解析。这个过程称为序列化与反序…

召回04 离散特征的处理

推荐系统会将一个id映射成一个向量 Qne-Hot编码 Embedding(嵌入)&#xff1a; 把每个类别映射成一个低维的稠密向量

Drive.js 的一些 Api 使用记录

文章目录 2024 年 drive.js 的基础使用想在下一步的时候处理些逻辑呢&#xff1f;(同步)Element 的各种选择器 2024 年 drive.js 的基础使用 安装就跳过了 npm install driver.js &#xff0c;一行代码就可以搞定 官网的 Basic Usage 基础使用的截图如下&#xff1a; 想在下…

C++番外篇——对于继承中子类与父类对象同时定义其析构顺序的探究

思考这样一串代码的运行结果&#xff1a; #include <iostream> using namespace std; class Person { public:~Person() { cout << "~Person()" << endl; } }; class Student:public Person { public:~Student() { cout << "~Student(…

线程池工作原理?

线程池的工作原理&#xff1a; 当任务过来时&#xff0c;如果线程池中的线程数小于核心线程数&#xff0c;就创建线程。&#xff08;默认情况下&#xff0c;线程池不会预先创建线程&#xff0c;但可以配置&#xff09;当核心线程数满了以后&#xff0c;提交过来的任务会放到阻塞…

Axure9破解

1.下载安装包 通过百度网盘分享的文件&#xff1a;Axure RP 9.zip 链接&#xff1a;https://pan.baidu.com/s/1Lcu-gg4qF8tTkOlt7bC2ww?pwdwmqq 提取码&#xff1a;wmqq 2.设置登录以及破解码 位置&#xff1a;帮助-管理授权-添加key Licensee&#xff1a;123456 Key&#…