Jmeter压力测试教程

Jmeter5.1.1

目录:

一、背景介绍

二、简介与安装、本地调优

三、JMeter使用

四、jmeter监控服务器CPU、内存、i/o的资源 ,jmeter监控服务器资源插件

五、常数吞吐量定时器

六、固定定时器

 七 循环控制器

八、断言

 九、同步定时器

十、测试脚本录制

十一、使用命令行压测

十二、无界面压测时,查看业务服务器的性能

 

下载地址:https://archive.apache.org/dist/jmeter/binaries/

介绍

一、背景简介

我们公司开发的交互式应用系统,老板要求测试系统,需要分析系统最大负载,以及在大并发下服务器的整体性能,发现系统中的瓶颈问题。文档简单介绍一款JMeter压力测试工具。

二、简介与安装、本地调优

2.1 JMeter简介

Apache JMeter是Apache组织开发的基于Java的压力测试工具。用于对软件做压力测试,它最初被设计用于Web应用测试但后来扩展到其他测试领域。 它可以用于测试静态和动态资源例如静态文件、Java 小服务程序、CGI 脚本、Java 对象、数据库, FTP 服务器,等等。JMeter 可以用于对服务器、网络或对象模拟巨大的负载,来自不同压力类别下测试它们的强度和分析整体性能。

2.2 JMeter安装

1)JMeter是使用JAVA写的,所以使用JMeter之前,先安装JAVA环境。Jmeter5.1.1需要安装java8。

2)JMeter可以从Apache官网下载:

https://archive.apache.org/dist/jmeter/binaries/

下载后解压即可使用。

默认Jmeter中的菜单、子菜单的文字为英文的,所以需要在解压目录下的bin/下修改jmeter.properties中的参数:

将这一行的注释去掉后,将en修改为zh_CN

language=zh_CN

 

Windows下,双击bin目录下的jmeter.bat即可用图形化界面操作配置测试任务。

 2.3本地windows测试电脑调优

  windows系统默认不能使用所有的本地端口(端口总共有从1-65535,但是系统默认只会使用一部分),所以在大并发压测的时候会出现连接被reset的报错,这是因为本地端口不够用导致的,调优参数如下:

 输入:win+r ,输入:regedit,进入注册表,进入:计算机\HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters,这个路径。

添加:MaxUserPort:65535

          TcpTimedWaitDelay:30

类型是:REG_DWORD,添加时选择十进制。

 

三、JMeter使用

下面结合某次测试介绍JMeter的简单使用。

1、添加测试计划

添加线程组。一个线程组包含多个http请求服务,网站的一次访问基本上都会发送多个http,每一个http请求就是一个资源的访问。

 

 2、设置线程数(线程数可以认为是并发用户数)

修改线程组的名字,修改并发线程数,然后按 ctrl +s 保存测试计划

 上述配置的含义:在1秒内,启动10个线程,循环1次进行压力测试。

关于Ramp-up period的说明:

(1)决定多长时间启动所有线程。如果使用50个线程,ramp-up period是10秒,那么JMeter用10秒使所有50个线程启动并运行。每个线程会在上一个线程启动后0.2秒(10/50)启动。Ramp-up需要要充足长以避免在启动测试时有一个太大的工作负载,并且要充足小以至于最后一个线程在第一个完成前启动。 一般设置ramp-up=线程数启动,并上下调整到所需的。

(2)用于告知JMeter 要在多长时间内建立全部的线程。默认值是0。如果未指定ramp-up period ,也就是说ramp-up period 为零, JMeter 将立即建立所有线程。假设ramp-up period 设置成T 秒, 全部线程数设置成N个, JMeter 将每隔T/N秒建立一个线程。

(3)Ramp-Up Period(in-seconds)代表隔多长时间执行,0代表同时并发.

可以选择永远循环,如下图:

也可以设置压力测试的时间。比如:10个线程并发访问,持续2分钟。这个的意思是说,在120S之内,最大活跃线程数一直保持为10个。

注意:配置持续时间来测试,需要勾选循环次数为永远,不然调度器会不生效。

3、设置测试接口

本样例的测试接口是:用http协议访问官网测试。右击线程组,选择“添加”、“取样器、“http请求”

设置http请求的协议、服务器地址、端口、请求方式、请求路径。

 4、一般需要查看调用结果,则需添加“察看结果树”

5、执行测试计划

点击绿色右三角,即可执行测试计划。可能会弹框提醒是否保存测试计划,选择“是”,则需要选择保存路径,选择“否”,则直接执行测试计划。如果中途需停止测试,点击“stop”即可。

调用结束后,可以通过设置的“察看结果树”,“响应数据”看到接口返回结果.。例如:本样例接口,如果调用成功则返回“ok”

 6. 查看发出的请求和响应的数据:

 

7、查看测试的统计报告:统计失败率、吞吐量、调用次数等

可以通过添加“聚合报告”实现

添加后,执行测试,产生的节后如下:

样本10,是因为我之前设置的线程数。

 

1)Label - 请求对应的name属性值。

Samples - 具有相同标号的样本数,总的发出请求数。
3)Average - 请求的平均响应时间。

4)Median - 50%的样本都没有超过这个时间。这个值是指把所有数据按由小到大将其排列,就是排列在第50%的值。

5)90% Line - 90%的样本都没有超过这个时间。这个值是指把所有数据按由小到大将其排列,就是排列在第90%的值。

6)95% Line - 95%的样本都没有超过这个时间。这个值是指把所有数据按由小到大将其排列,就是排列在第95%的值。

7)99% Line - 99%的样本都没有超过这个时间。这个值是指把所有数据按由小到大将其排列,就是排列在第99%的值。

8)Min - 最小响应时间。

9)Max - 最大响应时间。

10)Error % - 本次测试中,有错误请求的百分比。

11)Throughput - 吞吐量是以每秒/分钟/小时的请求量来度量的。这里表示每秒完成的请求数。

12)Received KB/sec - 收到的千字节每秒的吞吐量测试。

13)Sent KB/sec - 发送的千字节每秒的吞吐量测试。

8、读取csv文件

本测试样例,需要多线程读取多个用户的账密来模拟真实用户的登录。实现方式:按行将所有模拟的账密的路径放在csv文件中,用JMeter去读取。

有的时候要测试系统的登录并发,那就需要模拟成百上千的用户登录。那就需要先给应用系统添加很多账号。然后将账号和密码保存到CSV文件中,如下图:是我的批量登录用户、密码的文件。

csv文件的每一行的账密使用,号分隔。

 

 

 

 

 

1)文件名: CSV文件路径。

2)文件编码: CSV文件编码,可选UTF8。默认为ANSI

3)变量名称: 给csv文件中各列起个名字(有多列时,用英文逗号隔开列名)便于后面引用

4)分隔符:与 .csv文件的分隔符保持一致。如文件中使用的是逗号分隔,则填写逗号;如使用的是TAB,则填写\t;

5)是否允许带引号:不知道,一般选False。

6)遇到文件结束符再次循环:到了文件尾是否循环,True—继续从文件第一行开始读取,False—不再循环

7)遇到文件结束符停止线程 :到了文件尾是否停止线程,True—停止,False—不停止,注:当Recycle on EOF设置为True时,此项设置无效。

8)线程共享模式:共享模式,All threads –所有线程,Current thread group—当前线程组,Current thread—当前线程。

如下图:参数中的值是使用${password}和${username}取的CSV中的每一行的变量名称,也就是上一步的第三行的username,password。

 

 

可以看到,调用接口后的响应数据是一个json字符串。一个登录请求会调用多个接口,所以当登录接口返回数据后,这些数据会在后面的接口调用中作为参数再次传递给服务器端,也就是说后面还会用到这个json中的数据。所以在这个接口请求中添加JSON提取器。把accss_token 和 redresh_token作为变量,让后面的接口使用。

 

 添加json内容的提取器

 

 

 

使用$.access_token来获取接口响应的json数据中access_token,并赋值给变量access_token,这样在后面的其他接口都可以使用${access_token}来获取这个接口返回的json数据中的access_token了。

 

 同样,使用$.refresh_token来获取refresh并赋值给refresh变量

 

 

在后面的接口中使用${}获取上边json提取器获取的变量。如下图:

 

 重新运行压测,查看如下图的接口的请求结果,可以看到,已经将${access_token}解析成了真实的数据,如下图:

 

 

总结:

1.可以使用导入CSV文件来模拟大量用户。

2.给CSV文件使用多个变量接收每一行的多个值。

3.每一个接口的参数中使用${变量名}来获取CSV中的列。

4.接口访问后返回的数据一般为json数据。在接口的http请求创建多个json提取器来分别获取返回值中的token信息,这样后面的接口使用这些token就可以用变量来获取使用。

 

 

四、jmeter监控服务器CPU、内存、i/o的资源 ,jmeter监控服务器资源插件

1.

使用ServerAgent-2.2.3.zip采集服务器信息,下载地址如下:

https://objects.githubusercontent.com/github-production-release-asset-2e65be/8249130/8c40039e-7c77-11e7-99e2-51166e028338?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=AKIAIWNJYAX4CSVEH53A%2F20230207%2Fus-east-1%2Fs3%2Faws4_request&X-Amz-Date=20230207T075943Z&X-Amz-Expires=300&X-Amz-Signature=bd5ababafbbf5d84df5dc100b6a1fca18a55cba4c8650da80e81b8d0587dde0c&X-Amz-SignedHeaders=host&actor_id=0&key_id=0&repo_id=8249130&response-content-disposition=attachment%3B%20filename%3DServerAgent-2.2.3.zip&response-content-type=application%2Foctet-stream

上传到被测试的服务器上,执行

sh startAgent.sh    
//默认端口为4444,也可以参数指定 –udp-port 4445 –tcp-port 4445

本地安装jmeter的windows上也需要执行,点下下图的bat文件:

 

下载:https://jmeter-plugins.org/install/Install/下载 plugs-manage.jar

部署:将下载到的plugins-manager.jar插件存放到%JMETER_HOME%/lib/ext目录下 

 

如果lib/ext目录下有plugins-manager.jar这个包,那就不用再手动的下载安装了。

 如果下载的jmeter包已经自带plugins-manager.jar,可忽略下步:

启动jmeter并安装jpgc插件

 

 

 

2.使用

添加检测器jpgc

 

 添加一行:填写服务器监听的端口4444,选择监控的哪种数据

 

 

 

再次启动压测,就可以实时看到被测服务器的CPU和内存的使用详情了

 五、常数吞吐量定时器

5.1  

虽然我们在线程组中设置了线程数,但是聚合报告中的吞吐量不等于线程数,那是因为我们配置的是120S持续请求,所以当前线程发送然后响应完成后会继续发送下一个请求,一直这样循环发送,直到120S时间到才停止,不是说1s发送一个线程。当服务器端每秒能处理的请求个数大于配置的线程数时,那么每秒的吞吐量就会大于线程数。

  如下图,比如:线程数设置的是30,但实际上吞吐量是655。

  是因为每一个请求的响应时间大约是41ms,那么一个线程在1s内可以请求25次,吞吐量等于配置的线程数30*25约等于655。

 

5.2

  如果就想限制吞吐量的值,比如每秒200TPS,那就得使用常数吞吐量定时器。

  右击,添加--定时器--常数吞吐量定时器

   目标吞吐量:配置1分钟的总的数量,除以60,就是配置每秒的吞吐量,也就是每秒为20个。

  基于计算吞吐量:选择只有此线程,那就是每一个线程每秒都请求20次,配置了多少线程,那么每秒总共就请求多少次,例如我上面的线程数为30,那每秒的tps就是600左右,如下图是572,在600左右。

 

 六、固定定时器

   模拟用户的等待操作。因为接口测试是瞬时把所有接口都串行请求,但是一般用户场景是:登录后,在首页会停留一会,然后在进行其他操作。所以使用固定定时器来模拟接口间的等待时间。

 如下图:在/master/login下添加一个固定定时器,设置延迟为5S,意思是:在之前的所有接口执行完后,等待5S,再执行当前这个接口。需要注意的是,定时器的等待是在当前接口执行之前等待的。不是执行完后等待的。这个需要搞清楚。

所以要哪个接口等待一定时间后再执行,就必须把固定定时器加到这个接口里面,

 七 循环控制器

  有的时候有这种需求:测试计划中有登录页、查看内容页、个人首页,三个接口请求,但是只想登录一次,然后循环执行查看内容页、个人首页这两个接口。创建的线程组只能将组内的所有接口循环执行。这就要用到循环控制器了。

  添加步骤:线程组--逻辑控制器--循环控制器

  然后将查看内容页、个人首页这两个接口放在循环控制器里面,如下图,用户组设置执行1次,然后循环控制器循环3次.

 

 

如果循环控制器中的接口需要获取到每次循环的次数,比如:第一次循环获取到数字1,第二次循环获取到数字2,第三次循环数字3,以此类推。可以通过以下方法获取。

1.比如将循环控制器的名字改为LC(随便命名,只要是子母串就行)。

2.然后通过${__jm__LC__idx},就是给LC前后分别加了__jm__和__idx。

3.最后通过taskno(可以是任意变量名)这个变量名获取这个数值,如下图。

需要注意的是:${__jm__LC__idx}值是从0开始的,也就是说第一次循环${__jm__LC__idx}赋给taskno的值为0,然后以此类推。

 如果想让${__jm__LC__idx}获取的第一个值为1,需要使用预处理器。

   添加步骤:要使用${__jm__LC__idx}这个变量的接口请求--前置处理器--JSR223与处理程序。

 因为预处理器是前置处理器,所以会在当前请求发出前先执行这个预处理器。

 

 注意,上面__jm__LC__idx的值已经在预处理中+1,然后赋值给了loopno,所以taskno的变量值就该使用${loopno}获取。

 八、断言

  有的时候返回了json数据,但是json数据中的值不是我们预期的,虽然没有报错,但是返回的值是无效的,这时候就需要使用断言了。

添加步骤:要断言的接口(如下是/api/sign-2这个接口)--断言--json断言

如下:使用$.ret  获取返回的json数据中ret的值,并判断是否等于0,如果等于0,那就通过,如果不等于0,那就在查看结果数中报错。

 九、同步定时器

 设置真正的并发用户数,实现在某一时刻同时访问的用户数。

 当用户组中有10个用户时,同一时刻同时请求。

十、测试脚本录制

Jmeter通过http代理服务器录制脚本:

右击测试计划--->添加--->非测试元件--->http代理服务器。

修改代理端口。

在浏览器上打开代理服务器

 

 

在线程组下新建一个录制控制器。右击线程组--->添加--->逻辑控制器--->录制控制器。

 

然后刚添加的jmeter代理服务器点击-->启动。目标控制器选择刚才上面添加的控制器。

 在浏览器访问要录制的测试网站。

 

十一、使用命令行压测

(1)生成jtl文件,在聚合报告中看

主要用下面三个参数

-n:表示无界面压测

-t:指定要使用的jmx脚本文件

-l:生成jtl测试报告

需要提前在jmeter.properties中修改下面三个参数配置:

jmeter.save.saveservice.output_format=xml
jmeter.save.saveservice.response_data=data
jmeter.save.saveservice.samplerData=true

打开cmd,进入到jmeter的目录:jmeter.bat -n -t test.jmx -l result1.jtl

然后生成的jtl文件,可以在jmeter图形界面中添加 聚合报告,在聚合报告中添加这个jtml查看

(2)直接生成报告

  -e -o :生成html的报告

需要把这个参数设置为csv:jmeter.save.saveservice.output_format=csv,才能生成html的报告

 命令:jmeter.bat -n -t test.jmx -l result1.jtl   -e -o reports

(3)分布式集群压测(控制机和压力机的jmeter和所有插件的版本需要一样)

有两个重要的参数:

-r:启动所有的远程压力机执行压测

-R:启动特定的压力机执行压测,多个压力机用逗号隔开

 命令:jmeter.bat -n -t test.jmx -l result1.jtl   -e -o reports -r #启动所有压力机

           jmeter.bat -n -t test.jmx -l result1.jtl   -e -o reports -R 192.168.0.2:1099,192.168.0.3:1099  #启动192.168.0.2和192.168.0.3这台压力机,端口为1099。 ps:server_port=1099 这个配置在jmeter.properties中改。

 

十二、无界面压测时,查看业务服务器的性能

  (1)garafana监控平台安装

 

posted @   粉色纽扣  阅读(2584)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 百万级群聊的设计实践
· 永远不要相信用户的输入:从 SQL 注入攻防看输入验证的重要性
· 全网最简单!3分钟用满血DeepSeek R1开发一款AI智能客服,零代码轻松接入微信、公众号、小程
· .NET 10 首个预览版发布,跨平台开发与性能全面提升
· 《HelloGitHub》第 107 期
点击右上角即可分享
微信分享提示