jmeter 能报告 压力测试并输出HTML报告
一、jmeter报告里的内存怎么转为百分比
1.多线程方式,比如a采样器用20个线程,b线程用60个线程,这样比例即为1:3
但是这样会产生一个问题,若按照时间维度执行,均执行10min,a采样器与b采样器的response时间不一样,那么在这段时间内a与b的请求数无法做到1:3
2.jmeter自带一个计算函数,使用该函数则可达到效果。
简述一下该控制器的功能,这个控制器为每个请求计数,相当于给了他一个编号。
当参数为true时,每个用户有自己的计数器,比如10个线程组,100个loop,这是计数器的值为1-100.
当选择false,全局计算器,10个线程组,100个loop,计数器值为1-10000
那么想使用1:3的比例时,则使用一个if控制器。
条件分别为${__counter(true,)}%4==0与${__counter(true,)}%4!=0
详见
3.使用JSR223 Sampler+Groovy
在控制器中加入下面代码
12345678910111213141516171819int[] values=(int[])vars.getObject("RANDOM_VALUES");if(values==null){values= [0,1,2,3,2,3,1,3,2,3] as int[];vars.putObject("RANDOM_VALUES",values);}// Increment that will be used in SwitchController value will be between 0 and 2// because there are 3 TCsInteger increment=(Integer)vars.getObject("INCREMENT");if(increment==null){increment= Integer.valueOf(0);} else{increment= Integer.valueOf((increment.intValue()+1)%values.length);}String value= Integer.toString(values[increment.intValue()]);vars.put("SWITCH_VALUE", value);vars.putObject("INCREMENT", increment);SampleResult.setResponseData("SWITCH_VALUE from inside:"+value, null);return"SWITCH_VALUE:"+value;相当于每次都在给RANDOM_VALUES数组遍历,依次取里面的值,然后用if控制器判断,达到实现百分比的效果。
详见:
针对上面三种方式进行比较:
方案一不用说,有时候达不到百分比分发请求的效果,为下策。
方案三经过试验,有一个很大的缺点,采用的是采样器,消耗就较大。尤其是遇到更加复杂的场景,比如有a,b两个场景,需要用一个JSR223采样器,a场景下面又有一个复合场景,需要按照比例分发请求(这种情况蛮常见的),这时又需要加一个采样器。这样的话,就显得太麻烦,如果用本地的jmeter,不用分布式,可能都会因为开销太大导致压力上不去。
方案二:采用jmeter本身自带的计算器,倒不失为一个好的方法。但是针对一些复杂的场景,这个计算式有点难写,
比如:3:2这个比例,我看到网上的实现都是${__counter(true,)}%2==1||${__counter(true,)}%3==0,
这种计算方式就比较复杂了,那有没有简单一点实现方式呢?
其实是有的。
比如下面场景:
那么表达式应该怎么写呢?
上面有3的倍数,5的倍数,那么取其小公倍数15,按照15分割。
均使用If控制器,表达式分别为:
a:${__counter(false,)}%15<=5
b:${__counter(false,)}%15>5
c:${__counter(false,)}%15==1
d:${__counter(false,)}%15>1&&${__counter(false,)}%15<=5
总结规律:
按照小的公倍数分割,每个控制器取他们应占的份数。
上面的3:2的实现手段,就更容易了,一个占2/5,一个占3/5,完全不需要写那么复杂的数学表达式~~~
二、Jmeter***压力测试并输出HTML报告
在进行性能测试执行之前,需要进行场景的设计:
以什么方式启动,如何持续进行,直至测试结束
三部曲:启动---持续进行---结束
PS:一般情况下,建议限制Jmeter的的线程数在300及以内,这样能更好的发挥出jmeter的性能
测试步骤:
测试计划---线程组--HTTP请求---监听器---运行脚本---查看报告
PS:默认情况下,JMeter运行需要占用1 GB的内存,这可能还不够,取决于你的测试计划和需要运行的线程数
一个测试计划描述了一系列Jmeter运行时需要执行的步骤,可以包含一个或者多个线程组,逻辑控制器,取样发生控制,监听器,定时器,断言和配置元件。
启动JMeter,会出现一个空的测试计划,此次练习通过手写脚本来实现
(不熟悉*作的,也可以通过模板的形式创建,在菜单栏文件--Templates,下拉列表中选择Recording,点击Create,一个完整的Test Plan就生成了,当然我们可以删除不需要的内容)
作用:模拟用户个数、发送请求的频率及次数
PS:设置合理的线程数对能否达到测试目标有着决定性的影响,另外,设置合理的循环次数也很重要
此处添加3个HTTP请求
1、添加响应断言:设置响应码为200
2、查看结果树,验证请求
调试时线程数和循环次数设为1就可以了,记得调试好之后再改回去
3、禁用查看结果树,命令行执行脚本
我们在启动Jmeter时就会看到命令行的提示信息,进行负载测试时请不要使用GUI模式,也就是用命令行模式运行 JMeter测试脚本,这样可以大大缩减所需要的系统资源
备注:GUI即图形用户界面模式,只应用于创建测试脚本、调试脚本
图中也给出了命令格式: jmeter-n-t [jmx file]-l [result file]-e-o [Path to output folder],JMeter默认去当前目录寻找脚本文件,并把日志记录在当前目录,当然也可以使用绝对路径来执行
参数说明:
(1)直接生成HTML报告
PS:输出文件(-l后的文件)必须是不存在的,report文件夹为空文件夹或者不存在(-o后面的),不然无法生存报告
启动CMD窗口,输入以下命令:
jmeter-n-t C:\Users\zhangXXX\Desktop\baidu.jmx-l C:\Users\zhangXXX\Desktop\html.csv-e-o C:\Users\zhangXXX\Desktop\baidu-reports
(2)使用之前的测试结果,生成测试报告
启动CMD窗口,先生成测试结果,再生成报告,输入以下命令:
PS:-g指定已存在的测试结果文件
以上两种方法,其实终都依赖生成的测试报告。双击报告文件夹中的index.html就可以查看报告
Dashboard:
Test and Report informations:指的是测试和报告信息
APDEX(Application Performance Index):应用程序性能满意度的标准,范围在0-1之间,1表示达到所有用户均满意,越接近1满意度越高
Requests Summary:请求的通过率(OK)与失败率(KO),百分比显示
Statistics:数据分析,基本将Summary Report和Aggrerate Report的结果合并
Errors:错误情况,依据不同的错误类型,将所有错误结果展示
Charts:用图表的形式展示测试数据,让测试报告更加直观**
主要有如下特点:
(1)将测试过程中经常使用的数据,用图表的形式展示,让测试结果更加直观
(2)每个图表数据,有两种展示形式
(3)支持请求样例过滤显示
(4)支持导出PNG图片格式
Over Time Charts:
Throughput Charts:
Response Times Charts:
4、添加所需监听器,导入日志文件即可查看
在性能测试过程中,我们往往需要将测试结果保存在一个文件当中,也可以为日后的性能测试报告提供更多的素材
在Jmeter中,结果都存放在.jtl文件中,格式有很多种,可以根据需要进行更爱,选择某个监听器,在 configure页面进行相应配置,让我们来查看下保存后的文件有哪些内容:
接下来添加一个聚合报告,然后导入日志文件,查看结果,还可以添加其他的监听器,*作方法一样
PS:如果测试计划中增加了监听器(生成概要结果),在执行命令时就可以看到每个线程的执行情况
PS:设置好线程数、循环次数、**点、事务、断言、关联等等后即可执行压力测试
原理和LR的agent差不多,因为jmeter由Java开发,耗内存、cpu,所以需要采用分布式
步骤:
1、关闭防火墙
2、在所要运行jmeter并作为负载生成器的机器上安装jmeter(确保在所有系统中使用了相同版本号的Jmeter和jdk)
PS:目标服务器需要在相同网段,确保Jmeter可以访问目标服务器
3、确定其中一台机器作为主controller,其他的机器作为agent,然后运行所有agent机器上的jmeter-server文件
4、在controller机器的jmeter中**n目录下,找到jmeter.properties文件,添加节点IP,修改localhost为压力机IP
5、启动conttoller机子上的jmeter应用,选择菜单【运行】---远程启动来分别启动agent,也可以直接选择【远程全部启动】来将所有个agent启动
在性能测试过程中,我们通常需要将测试结果保存在一个文件当中,既可以保存测试结果,也可以为日后的性能测试报告提供更多的素材
Jmeter中,结果都存放在.jtl文件,一般以csv文件格式记录,只需要选择某个监听器,点击页面的configure按钮,建议勾选如下项:Save Field Name,Save Assertion Failure Message
技术点:HTTP相关设置+参数化+断言+关联+简单控制器+查看结果树
关联:通过Json控件或正则表达式获取
(1)线程组建议替换为jp@gc- Stepping Thread Group,功能比线程组多很多
(2)可以加事务控制器
(3)查看结果树替换为聚合报告或类似的报告,如果还是想看查看结果树记得勾选仅日志错误(查看结果树打印的日志比较多,会影响性能)
(4)造数据
总结:
一个子系统建议放在同一个“测试计划”中,流程测试可以通过“线程组”来区分,这样也便于设定不同的测试数据个数。
比较独立的接口,可以统一放在一个线程组内,顺序完成测试。
流程性接口的测试:如果要测试的接口可以组成一个流程,只需要顺序添加多个“HTTP请求”的Sampler,各请求之间可以提取需要在上下文传递的数据作为参数,以保证流程中数据的一致性
三、jmeter之聚合报告
Label:http请求的名字
#Samples:总http请求的次数。比如线程数5,循环次数2,总请求就是5*2=10。
Average:单个request的平均响应时间。当响应时间曲线平缓,无波动,使用平均时间更准确。当响应时间曲线波动大,忽高忽低,建议使用90%Line时间更为准确。
90%Line:百分之90的响应时间,请求中百分之90的响应时间低于这个数,就叫90%Line。
99%Line:百分之99的响应时间,请求中百分之99的响应时间低于这个数,就叫99%Line。
Median:中位数时间相当于50%Line。
Min:总请求中的小响应时间。
Max:总请求中的大响应时间。
Error%:总请求的中的错误率。错误率=失败请求/总请求
Throughput:请求时间中的总吐吞量
Received KB/sec:每秒处理的服务器的请求数。相当于loadrunner的LoadRunner的Transaction per Second数
sent KB/sec:每秒发送到服务器的请求数
jmeter聚合报告可搭配Response Codes per Second和Hits per Second分析服务器的性能和瓶颈
小白