本文是在下关于jmeter的一些基础使用、问题解决的总结
我以一介小白之身接触jmeter,过程甜蜜又痛苦,犹记当初到处找解决方法时的几颗上火痘,非常感谢无私分享的网友萌。当时领导也要求过写个文档分享,正好最近有时间,就整理整理也发到这里啦。内容不咋高深,但相信能对和我一样的小白有些帮助~ 诸位有意见建议欢迎指出,感谢~
以上-20200813
20200824–才发现图片这么糊,我精心截得图还写了字怎么可以辣么糊!!!重新上传撒,不过这次也是之前写的文档里的图,应该也不算特别清晰。但俺目前没时间重新写脚本截一遍图,先凑活下撒~
Jmeter是一款使用Java开发的,开源免费的测试工具,主要用来做性能测试。
官网下载地址:http://jmeter.apache.org/download_jmeter.cgi。选择binary版本即可。
下载完成后解压到你希望的位置。
注:jmeter需有Java环境支持,不同版本对Java版本的要求不同,记得选择对应版本。
“计算机”图标右键选择“属性”->点击高级系统设置->高级->环境变量->系统变量
1) 创建JMETER_HOME,值是JMeter的解压路径,如中括号内容:
【D:\apache-jmeter-4.0】;
2) 如果没有classpath则新建,在classpath 变量添加以下中括号内容:
【%JMETER_HOME%\lib\ext\ApacheJMeter_core.jar;%JMETER_HOME%\lib\jorphan.jar;%JMETER_HOME%\lib/logkit-2.0.jar;】
进入解压目录的bin文件下,双击jmeter.bat,启动JMeter。可将jmeter.bat发送到桌面快捷方式,方便打开。
使用时不要关闭命令窗口。
Jmeter自带多语言支持:
1.3 插件安装
下载plugins-manager.jar,官方下载地址:https://jmeter-plugins.org/downloads/all/
完成后将jar包放在jmeter安装目录下的\lib\ext文件夹中,启动jmeter,plugins manager出现在选项下。
点击选项下的plugins manager,即可下载插件,插件安装好后jmeter会自动重启。
建议至少安装以下三项:
在1.3中我们下载了PerfMon插件:它可以监控服务器硬件,如CPU,内存,硬盘读写速度等,但想使用这个插件,我们还需要下载ServerAgent,解压放到你想监控的服务器上,也可以监控一下测试用的计算机。
已Windows为例,双击startAgent.bat运行,默认使用4444端口,使用过程中不要关闭窗口。Linux下运行startAgent.sh。PerfMon详细使用请看2.10.4 PerfMon。
注:ServerAgent也需要Java环境支持。
添加一个结果树,方便查看请求的发送数据和响应数据,:
点击运行,在结果树里可以看到请求数据和响应数据。
导航栏常用功能:
线程数可以理解为虚拟用户数量
勾选调度器后,可以设置压力测试持续时间等参数,通过设置启动时间和结束时间在指定时间进行压力测试。
一个线程组可能有很多个请求,我们需要给每个请求配置协议、服务器IP、端口号等等,如果这些请求都是向同一台服务器发送请求的呢?我们可以将这些共同的、重复的内容放在“HTTP请求默认值”中,线程组内的请求就不用每次都配置这些了。只需要写不同的部分就好了。
添加HTTP请求默认值:
配置HTTP请求默认值和HTTP请求
并发测试时,我们需要模拟多用户登录,这样就不能再把HTTP请求-登录下的参数写成固定值了。可以通过设置CSV数据文件设置读取文件数据作为参数,运行多少线程就读取多少组数据。
如果我们想在请求的响应数据中提取某个值,在对应请求下添加json提取器:
之后使用:${token};
如果要提取多个值,各项配置内容以分号间隔。
请求中有一些信息需要写在HTTP信息头中,比如content-type、比如2.5.1中提取的token。
添加:
在2.5.2中,我们提取了一组ID值IdDatas。我需要它们当中的每一个都作为参数调用同一个接口,这个时候ForEach控制器可以实现这个需求。
这个例子的结果是,从IdDatas中取第一个到第十个数据,每次循环下用“${ids}”获取当次的值。通常我们会在ForEach控制器下添加请求调用他们,例:
如果我们希望某个请求发送多次,可以用循环控制器实现。
设置次数为5,循环控制器下的内容会执行5次,然后进行下一步。
定时器的作用域
1. 定时器是在每个sampler(取样器)之前执行的,而不是之后(无论定时器位置在sampler之前还是下面);
2. 当执行一个sampler之前时,所有当前作用域内的定时器都会被执行;
3. 如果希望定时器仅应用于其中一个sampler,则把定时器作为子节点加入;
4. 如果希望在sampler执行完之后再等待,则可以使用Test Action;
下面先介绍两个最常用的定时器。
设置等待时间,作用在请求调用前。
固定定时器的延时不会计入单个sampler的响应时间,但会计入事务控制器的时间。
注意时间是以毫秒为单位的。
在请求前设一个集合点,阻塞线程,直到指定的线程数量到达后,再一起释放,可以产生较大压力。如果设置了超时时间,则等待超时时间后没能等到下一个请求就发送已经到达的请求。
以下图为例,模拟用户500,当有500个请求到达时释放请求。设置了超时时间3s,那么当3s下一个请求也未到达,即使到达请求数不到500也释放。
和高斯随机定时器的作用差异不大,区别在于延时时间在指定范围内且每个时间的取值概率相同,每个时间间隔都有相同的概率发生,总的延迟时间就是随机值和偏移值之和。
帮助我们统计、查看、分析结果。
可以选择将结果保存到文件中,具体保存哪些项、保存方式可以在配置中配置。
jmeter中常用的监听器之一,通过它可以看到单次请求的发送信息和响应信息。
汇总所有请求,可以看到请求的开始时间、线程序号、第几次循环、响应时间、请求状态、发送和响应的字节数、等待时长等内容。
jmeter中常用的监听器之一,统计每个sample请求的次数、异常率、吞吐量、接受和发送速率等内容。
我们可以将结果保存到文件中,具体保存哪些项、保存方式可以在配置中配置。
监控服务器的性能,环境和插件配置参见1.3、1.4。
简单说一下常用的资源类型的指标项:
可以配置监听项的监听内容和显示方式。按自身需求选择。建议速率相关的设成MB显示,视觉上比较友好。
每秒完成的事务数。X轴为测试运行时间,Y轴为数量。不同的请求(成功和异常分别显示)用不同的颜色显示折线。
显示响应时间的分布,X轴为测试运行时间,Y轴为响应时间。不同的请求有不同的颜色显示折线。
函数助手提供了很多方法,方便我们以后参数化的调用。
以一个较常用的函数,__Random为例:
随机函数返回位于给定最小值和最大值之间的随机数。存储结果的变量名设置了,就可用这个做变量名调用。
我们需要1-10之间的随机数做参数,调用的时候用生成的函数字符串【${__Random(1,10,test)}】即可。
更多更全面的使用可参看官方文档:https://jmeter.apache.org/usermanual/functions.html
使用GUI界面进行测试会占用大量内存,可以用无界面压测
在GUI界面设置并发数、测试时间等,添加各元件,保存测试计划,并关闭软件;
使用非GUI界面,用指令启动压力测试;
如:D:\Program Files\apache-jmeter-3.1\bin>jmeter -n -t testplan.jmx -l listener.jtl
打开jmeter.bat,在聚合报告元件中载入“listener.jtl”,查看聚合报告;
在监视器中中载入“listener.jtl”,查看数据。
在HTTP请求下有个文件上传。不影响参数或消息体数据。
点击浏览按钮,选择一张需要上传的图片,地址将会自动记录到文件名称栏目;
填写参数名称,根据实际需求填写;
MIME类型为multipart/form-data。
我遇到的问题是:接口200返回的数据有两种一个是成功或失败,也有可能是因服务异常导致失败。我需要统计因服务异常导致的失败,而这次不能只凭Response code判断。所以我想导出请求返回数据中的信息:message。
我本次用的方法是先用json提取器将每个请求的该数据提取出来,再用BeanShell 后置处理程序将其导出到文件。
至于网上其他方法,尝试了没有成功。因任务较急未继续试,后续可能会尝试。
1) 用json提取器提取返回信息中的message。
返回信息的结构是
{
“result”: false,
“message”: “失败,请重试”,
“timestamp”: “xxxxxxxxxxxxxx”
}
2) 用BeanShell 后置处理程序将提取的${msg}导出到文件。
// 脚本
FileWriter fstream = new FileWriter("C:\\Users\\xxxx\\Desktop\\msg.csv",true);
BufferedWriter out = new BufferedWriter(fstream);
out.write(vars.get("msg")+ "\n");
out.close();
fstream.close();