性能测试工具之jmeter

性能测试工具之Jmeter

一、jmeter介绍

1、Jmeter是apache组织开发的开源项目,设计之初是用于做性能测试的,同事它在实现对各种接口的调用方面做的比较成熟,因此常被用做接口功能测试和性能测试。
它能够很好的支持各种常见接口,如HTTP(s)、webservice、JDBC、JAVA、FTP等,并以多种形式展现测试结果。
2、开源免费,轻量级免安装,支持插件很多,功能也日趋完善,报表分析功能较弱。

二、jmeter安装及环境配置

1、安装jdk
Jmeter是依赖java环境的,所以要先安装jdk。
需要注意的是jmeter3.0以上的版本都需要jdk7以上才能支持,其他没啥特别的。
安装jdk并配置好环境变量。
2、安装jmeter
其实jmeter是免安装的,只需要下载解压即可。
安装包直接去jmeter官网下载即可,建议选择3.0或以上版本。下载后解压到非C盘的非中文目录即可。
3、配置jmeter环境变量
JMETER_HOME=D:\apache-jmeter-3.3\apache-jmeter-3.3
CLASSPATH=%JMETER_HOME%\lib\ext\ApacheJMeter_core.jar; %JMETER_HOME%\lib\jorphan.jar;
4、启动jmeter
双击jmeter bin目录下的jmeter.bat,稍等一会儿能够正常打开如下界面,说明安装成功。
在这里插入图片描述
Dos窗口不可关闭,否则jmeter界面也就关闭了。
在这里插入图片描述
注意事项:
从上面命令行可以看到:Don`t use GUI mode for load testing!,only for Test creation and Test debugging.For load testing,use CLI Mode(was NON GUI):
大致意思是:不要使用GUI模式进行负载测试!,仅用于测试创建和测试调试。对于负载测试请使用CLI模式(非GUI):

三、jmeter常见报错及解决方法

1、错误一
Response code: Non HTTP response code: java.net.SocketTimeoutException
Response message: Non HTTP response message: connect timed out
查看Load time的时间要大于request设置的connect time out时间,所以抛出该异常。可能是由于服务端有较多请求正在处理(且处理时间较长),导致JMeter不能连接上服务器而产生的。
2、错误二
Java.NET.BindException: Address already in use: connect
原因:短时间内new socket操作很多,而socket.close()操作并不能立即释放绑定的端口,而是把端口设置为TIMEWAIT 状态,过段时间(默认240s)才释放,(用netstat -na可以看到),最后系统资源耗尽(windows上是耗尽了pool of ephemeral ports ,这段区间在1024-5000之间)
解决方法:在运行JMeter agent的机器上,添加注册表条目HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters
MaxUserPort 65334
TcpTimedWaitDelay 30
3、错误三
java.lang.OutOfMemoryError: Java heap space(jmeter内存溢出)
原因:观察运行jmeter机器的内存,占用较高,超过了jmeter设置的内存上限。
解决方案:修改jmeter配置文件,调整内存可用的范围
修改/bin/jmeter.bat文件:找到这2行
set HEAP=-Xms256m -Xmx256m
set NEW=-XX:NewSize=128m -XX:MaxNewSize=128m
改为:
set HEAP=-Xms1024m –Xmx2048m(最大值不能超过系统内存的1/2)
set NEW=-XX:NewSize=128m -XX:MaxNewSize=512m
4、错误四
Response code: Non HTTP response code: java.net.SocketTimeoutException
Response message: Non HTTP response message: Read timed out
发生该错误时,jmeter已经连接上服务器,查看load time没有超过设定的request timeout时间,错误可能的原因是,服务器那边未处理该线程的请求,或者为保证服务能力,断掉了连接。
为了验证该猜想,持续大于半小时向服务器发送该并发数量的请求,一段时间后,request收到503的response,证明猜想。
5、错误五
Failed to initialise remote engine java.rmi.ConnectException: Connection refused to host:
原因:分布式测试时,server和agent之间的连接有问题。单个机器排查后,发现是某个agent机器安装了多个网卡,rmi远程的时候找的是虚拟机的网卡,导致连接失败。
解决方案:禁掉不使用的虚拟机网卡,测试之后再恢复。
jmeter脚本运行的过程中,服务器性能参数没有明显变化(CPU,内存,I/O),但request的响应时间很长。
原因:观察jmeter agent机器网络使用情况,网络使用持续达到带宽的限制峰值。request 发送的过程中pending在网络中,实际并发的request并没有同一时间到达服务器,所以服务器没有明显变化。
解决方案:提高jmeter agent机器网络带宽。
6、错误六
Connection timed out: connect
java.net.ConnectException: Connection timed out: connect
原因分析:
可能是因为端口号耗尽,一般一台服务器的端口号最多是65535个,建议使用该命令分别查看下压测机与服务器的端口使用情况,netstat -nat|grep -i 8080|wc -l,如果这个个数在6w左右,那可能就是端口号用尽,同时查看下大多数的端口状态,应该都是time_wait状态
解决方案:
如果是压测机,端口号用尽,那就增加压测机,使用jmeter分布式压测(jmeter默认开启keep_alive的)
如果数服务器,端口号用尽,最大的可能是服务器端开了短链接,把短链接配置变成长连接即可
因为如果服务器端是短链接,当jmeter每发起一个请求就会建立一次tcp三次握手,传输完数据后,连接其实没有关,连接状态是time_wait,下个请求来了,会重新开启一个新的端口,建立tcp三次握手,传输数据…,这样随着请求的越来越多,端口就会变得越来越少,所以端口很快耗尽,而且大多数端口都处于time_wait状态,如果服务器端也支持长连接,那么下次请求来了,就会在上次请求的通道上继续传输,端口使用率大大的降低,就有效的避免了端口耗尽问题。
原因:Jmeter默认禁掉了运行过程中每个request的具体response信息收集,只保留了status。
解决方法:修改jmeter.properties文件中Results file configuration。把所有和response相关False的项改为True。运行后将输出保存.jtl文件中。添加tree监听器,过滤只显示error request,可以查看到request和response的具体信息,从而判断出错原因。
tree report中显示socket time out相关的错误,如何判断是jmeter工具的原因,还是服务器的原因。

四、jmeter使用实例

1、在windows和Linux环境下压测的区别:暂无
2、在Windows的dos窗口下进行压测
命令介绍:
在这里插入图片描述
参数介绍:
在这里插入图片描述
具体含义:
在这里插入图片描述
例如:jmeter -n -t test1.jmx -l logfile1.jtl -H 192.168.1.1 -P 8080

3、执行出的压测结果如何查看
①、打开Jmeter GUI界面
②、在测试计划下,添加对应的测试报告元件,此处演示,增加了:聚合报告、查看结果树、Summary Report测试报告
③、在所有数据写入一个文件,浏览中选择对应的日志文件
④、下面就会有对应的表格展示,具体见下图
在这里插入图片描述
4、在Linux环境下进行压测
Ⅰ.在Linux下安装jmeter:
①.将jmeter的压缩包上传到Linux下的/software目录下;
②…进入Linux下的/software目录,解压jmeter的压缩文件;
Ⅱ.将本地调试好的jmx文件上传至/software/jmeter/bin目录下:
Ⅲ.进入Linux下的//software/jmeter/bin目录下:
①.在命令行输入:
jmeter -n -t search.jmx -r -l search.jtl -e -o /tmp/apache-jmeter-5.1.1/resultReport:
大致意思是:执行search.jmx文件,生成search.jtl文件,再将search.jtl文件转换成报告;
②.执行完成之后,在命令行输入:tar zcvf resultReport.tar.gz ./resultReport:将报告打成压缩包,再下载到本地即可查看输出的报告;

五、jmeter工具使用

1、创建线程组
在TestPlan下创建线程组,右击TestPlan->线程(用户)->线程组
在这里插入图片描述
2、线程组介绍
在这里插入图片描述
Ⅰ.名称:线程组自定义名称;
Ⅱ.注释:添加的一些备注说明信息,设置后,在目录树中鼠标悬停会显示配置的注释信息;
Ⅲ.在取样器错误后要执行的动作
①.继续:即取样器执行错误后,仍然继续执行后续的操作,直到整个线程完成;(默认)
②.Start Next Thread Loop:即取样器执行错误后,终止当前循环,进入下一个循环;
③.停止线程:即取样器执行错误后,停止当前线程;
④.停止测试:即取样器执行错误后,等待当前执行的采样器结束后停止执行测试;
⑤.stop test now:即取样器执行错误后,出现错误立刻终止测试;
Ⅳ.线程属性
①.线程数:即模拟的用户个数;
②.Ramp-Up Period(in seconds):设置多少秒内完成所有的线程创建;----该时间的设置需要根据项目需要去判断。如:线程数设置为10,时间设置为2—表示:两秒内启动10个线程,平均每秒启动5个线程;
③.循环次数:即线程执行的次数,1表示循环1次后停止;如果勾选永远,即线程会一直执行,如果配置了调度器,会受调度器配置影响。
④.Delay Thread creation until need:勾选代表线程将在需要的时候才构建;不勾选,代表线程组在开始的时候就被创建,需要时执行。
Ⅴ.调度器
只有在调度器勾选后,才可以进行配置;也只有勾选调度器后,配置的值才能生效;
①.持续时间:即线程的执行时间是多少秒,在达到时间后,将停止执行;
②.启动延迟:即手动开始运行线程后,jmeter自动延迟设置的时间才开始执行测试;----注意:在勾选循环次数为永远,设置了持续时间时,会在持续时间达到后,停止测试;循环次数设置为非永远时,设置的调度时间无效,会在执行完循环次数后,停止测试。
3、配置元件
Ⅰ.在我们刚刚创建的线程组上右键 【添加】–>【配置元件】–>【HTTP请求默认值】。
在这里插入图片描述
Ⅱ.配置我们需要进行测试的程序协议、地址和端口
在这里插入图片描述
当所有的接口测试的访问域名和端口都一样时,可以使用该元件,一旦服务器地址变更,只需要修改请求默认值即可。
Ⅲ.构造HTTP请求
在“线程组”右键 【添加-】->【samlper】–>【HTTP 请求】设置我们需要测试的API的请求路径和数据。我这里是用的json
在这里插入图片描述
Ⅳ.在我们刚刚创建的线程组上右键 【添加】–>【配置元件】–>【HTTP信息头管理器】。
因为我要传输的数据为json,所以设置一个 Content-Type:application/json
在这里插入图片描述
Ⅴ.在我们刚刚创建的线程组上右键 【添加】–>【断言】–>【响应断言】。
根据响应的数据来判断请求是否正常。我在这里只判断的响应代码是否为200。还可以配置错误信息
在这里插入图片描述
Ⅵ.添加察看结果树
在我们刚刚创建的线程组上右键 【添加】–>【监听器】–>【察看结果树】。
在这里插入图片描述
直接添加,然后点击运行按钮就可以看到结果了。
在这里插入图片描述
Ⅶ.添加Summary Report
在我们刚刚创建的线程组上右键 【添加】–>【监听器】–>【Summary Report】。
直接添加,然后点击运行按钮就可以看到结果了。
在这里插入图片描述
Ⅷ.测试计划创建完成
记得点保存。
Ⅸ.执行测试计划
前面我们说过,执行测试计划不能用GUI,需要用命令行来执行。
在这里插入图片描述
我这里执行的命令为:
jmeter -n -t testplan/order.jmx -l testplan/result/result.txt -e -o testplan/webreport
说明:
testplan/RedisLock.jmx 为测试计划文件路径
testplan/result/result.txt 为测试结果文件路径
testplan/webreport 为web报告保存路径。
Web报告如下:
在这里插入图片描述
Ⅹ.写在最后
线程数量和循环次数将会影响最终的测试报告,请大家多多测试。
4、脚本参数化
Ⅰ.在测试的过程中要用到参数化,比如说openId、crm_id等,此时需要添加一个csv数据文件设置即:CSV Data Set Config
在这里插入图片描述
Ⅱ.配置CSV Data Set Config
在这里插入图片描述
①.Filename: 指保存信息的文件目录,可以相对或者绝对路径。否则会在jmeter日志文件(jmeter.log目录位置)中提示:系统找不到指定文件,运行脚本后,登录失败。
②.File encoding: 保持默认。默认为ANSI
③.Variable Names: 给csv文件中各列起个名字(有多列时,用英文逗号隔开列名)便于后面引用
④.Delimiter:与 .csv文件的分隔符保持一致。如文件中使用的是逗号分隔,则填写逗号;如使用的是TAB,则填写\t;
⑤.Allow quoted data? :是否允许引用数据,—这个目前还未弄明白,设置成True或者False都能正常引用数据。
⑥.Recycle on EOF?:到了文件尾是否循环,True—继续从文件第一行开始读取,False—不再循环
⑦.Stop thread on EOF? :到了文件尾是否停止线程,True—停止,False—不停止,注:当Recycle on EOF设置为True时,此项设置无效。
⑧.Sharing mode:共享模式,All threads –所有线程,Current thread group—当前线程组,Current thread—当前线程。
² All threads:计划中所有线程,假如说有线程1到线程n (n>1),线程1取了一次值后,线程2取值时,取到的是csv文件中的下一行,即与线程1取的不是同一行。
² Current thread group:当前线程组,假设有线程组A、线程组B,A组内有线程A1到线程An,线程组B内有线程B1到线程Bn。取之情况是:线程A1取到了第1行,线程A2取第2行,现在B1取第1行,线程B2取第2行。
² Current thread:当前线程。假设测试计划内有线程1到线程n (n>1),则线程1取了第1行,线程2也取第1行。
Ⅲ.引用csv文件中的数据
在这里插入图片描述
①.找到需要传递参数的HTTP请求
②.将具体值改为变量引用,引用变量:${变量名}
Ⅳ.在察看结果树中,察看变量引用的具体值
在这里插入图片描述

5、json提取器
Ⅰ.在星妈优选的业务当中接口与接口之间存在依赖。所以需要将上一个接口的参数提取出来传给下一个参数这时用到了json提取器
在这里插入图片描述
Ⅱ.jmeter在察看结果树中点Text下拉框,选择JSON Path Tester
在这里插入图片描述
Ⅲ.比如要提取cart_token,$.cart_token提取cart_token
在这里插入图片描述

Ⅳ.提取出来的cart_token作为下一个接口的入参,${cart_token}
在这里插入图片描述

6、正则提取器
Ⅰ.正在表达式提取器介绍
①.Apply to:应用范围
②.要检查的响应字段:样本数据源。
③.引用名称:其他地方引用时的变量名称,我这里写的phone,可自定义设置,引用方法:KaTeX parse error: Undefined control sequence: \d at position 92: …t"相当于LR右边界。而括号里\̲d̲+为正则表达式,用来匹配所需要…$对应正则表达式提取器类型。-1全部,0 随机,1第一个2第二个,以此类推,若只有一个正则一般就填写 1 1 1
⑥.匹配数字:正则表达式匹配数据的所有结果可以看做一个数组,匹配数字即可看做是数组的第几个元素。-1表示全部,0随机,1第一个,2第二个,以此类推。若只要获取到匹配的第一个值,则填写1
⑦.缺省值:匹配失败时的默认值。可以不写。若需用于后续逻辑判断,可简单写为 ERROR。
实例:在order接口提取出order_id
在这里插入图片描述
作为pay_payment的入参
在这里插入图片描述
附正则表达式说明:
在这里插入图片描述在这里插入图片描述
通俗点来讲正则表达式就是用来匹配字符串的公式。比如正则表达式中\d+ 是来匹配1个或更多连续的数字。更多可自行百度了解。

六、聚合报告

Ⅰ.聚合报告中有samples、averages、median、90%line、95%line、99%line、min、max、
error%、throughput、receivered KB/sec、sent KB/sec
在这里插入图片描述
1、Label
每个请求的名称,比如HTTP请求等
2、#Sample
发给服务器的请求数量
3、Average
单个请求的平均响应时间
4、Median
50%请求的响应时间
5、90%Line
90%请求响应时间
6、95%Line
95%请求响应时间
7、99%Line
99%请求的响应时间
8、Min
最小的响应时间
9、Max
最大的响应时间
10、Error%
错误率=错误的请求的数量/请求的总数
11、Throughput
吞吐量即表示每秒完成的请求数
12、Received KB/sec
每秒从服务器端接收到的数据量
13、Sent KB/sec
每秒从客户端发送的请求的数量

七、JMeter插件之jp@gc - PerfMon Metrics Collector

1、打开jp@gc - PerfMon Metrics Collector插件,如图
在这里插入图片描述
2、输入服务器地址,端口为4444,如遇到端口冲突,可使用vim命令修改端口(端口随意,只要不冲突就行),如图
在这里插入图片描述
注意:测试服务器性能时,要在服务器上放一个插件ServerAgent-2.2.3(放在服务器的任一位置,启动监测程序后运行JMeter),Linux系统运行startAgent.sh,,windows系统运行startAgent.bat
在这里插入图片描述
3、如果没有启动服务器监测ServerAgent会报错,如图
在这里插入图片描述
4、如果在使用过程中出现了这个错误
java.lang.NoSuchMethodError: org.apache.jmeter.samplers.SampleSaveConfiguration.setFormatter(Ljava/text/DateFormat;),此问题是因为所用JMeter版本过高不支持jp@gc - PerfMon Metrics Collector插件导致,可下载低版本的JMeter,比如JMeter 3.1。
在这里插入图片描述
5、指标说明
在这里插入图片描述

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小志老师

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值