常识4-【jmeter压测实战总结】

1,171 阅读9分钟

一.创建测试用例

Jmeter主界面:

图片

1.添加线程组

测试计划(右键->添加->Threads(Users)->线程组),修改线程组名称为“登录”,可添加多个线程组,设置线程组;Ramp-Up Period(in seconds)间隔多长时间执行;循环次数:总请求书=线程数*循环次数;勾选调用器设置持续时间

图片

图片

2、添加http cookie管理器

图片

3.设置http请求默认值

http请求默认值可以设置请求的服务器,相同环境的http请求,可将http默认请求放在测试计划下面线程组上面,否则添加对应的子路径即可

图片

图片

4.设置http请求

填写http请求的路径,在BodyData中添加需要请求的参数,可以是Json格式,或在Parameters中添加表单格式,BodyData和Parameters不可同时添加

图片

5.添加用户定义的变量

可添加在测试计划下面,作为全局变量,登录成功后获取的token可放在用户定义的变量中,在其他线程组的请求http信息头管理器中添加变量,即可供跨线程组使用

image.png

图片

6.添加http信息头管理器

添加信息头,添加需要的头部信息 图片图片

7.添加json断言

JSON断言可以对服务器返回的JSON文档进行验证。JSON断言有两种使用模式:
1.根据JSONPath能否在JSON文档中找到路径;
2.根据JSONPath提取值并对值进行验证。
若文档格式为非JSON则断言失败;若找不到路径断言失败;若提取值与预期值不一致断言失败。
Additionally assert value:添加验证的值,只有勾选了此复选框,才可以在Expected Value中设置期望的值。
Match as regular expression:匹配正则表达式,在期望的值中填写正则表达式,如果不勾选此项,在Expected Value中设置了正则表达式,则不进行匹配
Expect null:期望值为null,如果期望的值为null,可以勾选此项。
Invert assertion(如果匹配的值存在,则断言失败,不匹配,则断言成功)。

图片

图片

8.添加察看结果树

**图片

9.添加聚合报告

图片

二.开始测试

1.开始测试

登录成功后,获取到token,对查询接口进行接口调试,设置线程数为1,调试通过后,开始执行查询接口的压力测试,本次压力测试线程数分别测试200,300,350,400,450

图片

图片

先设置线程数200,Ramp-Up Period(in seconds)设置为0,勾选永远、调度器,持续时间60s,保存,开始执行

图片

2.查看结果树过程及结果

图片

3.查看聚合报告
聚合报告中各名词说明:
Samples:一共发出的请求数;
Average:平均响应时间;
Median:统计意义上的响应时间中值;
90% line:所有线程中90%的线程响应时间都小于xx的值;
Min:响应最小时间;
Max:响应最大时间;
Error: 测试出现的错误请求数量百分比。若出现错误就要看服务端的日志,配合开发查找定位原因;
Throughput:简称tps,吞吐量,默认情况下表示每秒处理的请求数,也就是指服务器处理能力,tps越高说明服务器处理能力越好

线程数200:

图片

线程数300

图片

线程数350:

图片

线程数400:

图片

线程数450

图片

本次压力测试使用单台压力机测试,由于压力机性能瓶颈和服务器不稳定、可能被其他进程占用等原因,持续加压到500时,jmeter请求中断。作为学习研究,本次压力测试避免额外占用人力物力,所以终止加压测试。

三.测试结果分析

1、有错误率同开发确认,确定是否允许错误的发生或者错误率允许在多大的范围内;
2、Throughput吞吐量每秒请求的数大于并发数,则可以慢慢的往上面增加;若在压测的机器性能很好的情况下,出现吞吐量小于并发数,说明并发数不能再增加了,可以慢慢的往下减,找到最佳的并发数;
3、压测结束,登陆相应的web服务器查看CPU等性能指标,进行数据的分析;
4、最大的tps:不断的增加并发数,加到tps达到一定值开始出现下降,那么那个值就是最大的tps。
5、最大的并发数:最大的并发数和最大的tps是不同的概率,一般不断增加并发数,达到一个值后,服务器出现请求超时,则可认为该值为最大的并发数。
6、压测过程出现性能瓶颈,若压力机任务管理器查看到的cpu、网络和cpu都正常,未达到90%以上,则可以说明服务器有问题,压力机没有问题。
7、影响性能考虑点包括:数据库、应用程序、中间件(tomact、Nginx)、网络和操作系统等方面。

本次压力测试结果分析:当并发数增加到450时,90%的请求响应时间最大值接近于要求的3s以内的性能指标,cpu及内存达到瓶颈,tps在并发数350时达到最大值之后开始下降,可以判断该接口支持的最大并发数未450。

四.问题及解决方法

1、当有多个接口请求存在参数调用时,如何实现关联?
答:比如登录接口和保存、查询接口,保存和查询接口都需要登录接口返回的token等登录信息,除了上述创建测试用例过程中用到的将token放在用户定义的中,还可以使用正则表达式和json path extractor
(1) 正则表达式提取器

图片

():括起来的部分就是要提取的。
.:匹配除换行外的任何字符串。
+:代表+号前面的字符必须至少出现一次(一次或多次)。
?:代表?前面的字符最多可以出现一次,在找到第一个匹配项后停止(0次或1次)。
:代表号前面的字符可以不出现,也可以出现一次或者多次(0次、1次或者多次)
(. ):贪婪模式,匹配尽可能多的字符
(.
?)或(.+?):匹配尽可能少的字符,一旦匹配到第一个就不往下走了
模板:若想提取多个值的话,比如是a和b这两个值,则可以写成:1 112 22
(2)json path extractor
jmeter通过安装json path extractor插件来处理json串,提取json串中的字段值。
2、jmeter压测时跑了一会儿后,出现界面请求一直无法结束,像卡死一样?
答:在http请求中添加请求响应超时时间
3、内存溢出,出现提示java.lang.OutOfMemoryError: Java heap space?
答:(1)打开jmeter安装文件(可以用notepad++打开),bin目录下的jmeter.bat
(2)找到set HEAP开头的内容,根据具体需要修改堆(heap)值大小,以及NEW分配的内存值大小
这里默认值为:
set HEAP=-Xms512m -Xmx512m
set NEW=-XX:NewSize=256m -XX:MaxNewSize=256m
将其修改为:
set HEAP=-Xms512m -Xmx4096m
set NEW=-XX:NewSize=256m -XX:MaxNewSize=512m
注意:一般而言,堆的最大值不要超过物理内存的一半,否则容易导致jmeter运行变慢、卡顿甚至内存溢出(因为java本身的垃圾回收机制是动态分配内存,
调整时候其本身会占用很多内存),NEW分配的内存,不宜太大!
(3)修改完成后,关闭文件,重启jmeter既可
注意:当需要模拟的线程数较大时,就需要根据具体情况采用分布式压测的方式了,这种修改堆大小的方法只适用一部分情况,并不是万能的!
4、常用http错误代码有哪些?
答:400 无法解析此请求。
403 禁止访问:访问被拒绝。
404 找不到文件或目录。
405 用于访问该页的HTTP动作未被许可。
410 文件已删除。
500 服务器内部错误。
501 标题值指定的配置没有执行。
502 Web服务器作为网关或代理服务器时收到无效的响应
5、为什么脚本刚开始运行就有错误,其后来的脚本还可运行?
答:在Thread Group中有相关设置,如果选择了continue,即使前面的脚本出现错误,整个thread仍会运行直到结束。选择Stop Thread会结束当前thread;选择Stop Test则会结束全部的thread。推荐选项是Stop Thread。
6、请求提示no cookies
答:在线程组下面添加http cookie管理器
7、压测的线程数过多时,或者线程没有被及时释放,会导致系统开放的TCP/IP连接端口已达到最大限制,jmeter会直接报错。
报错信息:java.net.BindException:Address already in use.
答:(1)打开注册表:在cmd(win+R)中输入regedit,打开注册表
(2)设置系统参数:最大端口连接数。
①找到系统参数设置项:
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters
②右击parameters,添加一个新的DWORD,参数名为MaxUserPort;
③双击MaxMaxUserPort,输入数值为65534,基数选择十进制;
④重启电脑!重启电脑!重启电脑!
8、大量请求出现连接失败,或者压测的错误率异常高
答:线程数已达到瓶颈
(1)循环创建线程时,勾选keep-alive,可以复用线程。
(2)扩大被测程序的线程池大小。(程序出现瓶颈时)
9、显示乱码问题
设置HTTP请求,参数中的值显示为中文,但系统接受数据时,中文显示为乱码;在“察看结果树”中,查看HTTP请求,请求参数中的中文数据显示乱码。
答:在HTTP请求页面,Content encoding设置为utf-8即可
10、在登录校验成功后,后续动作都为成功
答:进行重定向时,cookie被重置,http请求中,修改默认的“自动重定向”为“跟随重定向”
11、jsonpath语法元素
XPATH JSONPATH Description
/ $ 根对象/元素
. @ 当前对象/元素
/ .or[] 自操作符
… n/a Json path不支持父操作符
// … 递归下降

  • \

    • 通配符,代表所有对象/元素
      @ n/a Json path不支持属性访问
      [] [] 下标运算,通过数组元素的下标访问数组元素
      | [,] Union操作符,使用间隔的名称或数组下标生成子集
      n/a [start🔚step] 数组切片
      [] ?() 使用过滤表达式
      n/a () 脚本表达式
      () n/a Json path不支持分组