Jmeter使用介绍
- Jmeter安装启动
1.1 Jdk安装和环境变量配置
1.2 启动jmeter.bat或者直接运行安装目录bin下面的ApacheJMeter.jar
1.3 一个最简单的jmeter请求:添加一个线程组,一个http请求,一个查看结果树查看结果。填好http请求相关参数,直接运行就可查看结果。
- Jmeter基础元件
添加线程组后,右击线程组,可以看到jmeter的八大基础元件,如下所示:
- 控制器使用
3.1 if控制器
判断子取样器是否执行,${test1}==100 && ${test1}==99
3.2 循环控制器
控制其下的子节点运行次数,可以指定运行次数,也可以勾选永远,持续执行。
3.3 吞吐量控制器
控制其下子节点执行的次数或者百分比
3.4 仅一次控制器
线程组执行期间,该控制器的子节点取样器只运行一次。例如在登陆时,如果线程组循环时不清除cookie,那么把登陆请求放到该控制器下,除了线程启动第一次循环时会执行该请求,后续的循环不会再执行。
- Samper
4.1 http请求
常规模式的http请求,包括请求域名,方法,请求体参数,信息头字符格式等。
图中post请求的可以通过parameters或者body data来传值。
Parameter:参数可以直接写在url后面,如http://xxxx.xxxx/test?test = 123&test1 = 123, 也可以在parameter里面的表格中填写
Body data:请求附带请求体,请求体的格式需要在配置元件中的http信息头管理器中指定,如添加:Content-Type:application/json。当添加了这个信息头后,body,data里的参数就需要填写josn格式。
4.2 java请求
实际上是对jar包进行测试,具体步骤:
1) 将jmeter的libext下的ApacheJMeter_core.jar和 ApacheJMeter_java.jar两个jar包导入目标工程的扩展类库中
2) 创建一个类Test继承 JavaSamplerClient,复写getDefaultParameters和runTest方法
getDefaultParameters:定义jmeter界面可以传入的参数
runTest:目标测试代码,需要测试的功能或者调用全部写在这里
public class Test extends AbstractJavaSamplerClient{
public Arguments getDefaultParameters() {
Arguments args = new Arguments();
args.addArgument("userName", "test ");
args.addArgument("password", "testing");
return args;
}
@Override
public void setupTest(JavaSamplerContext context) {
}
@Override
/**
* 性能测试时的线程运行体,执行的业务方法放在这里。
*/
public SampleResult runTest(JavaSamplerContext context) {
// 创建SampleResult对象,用于记录执行结果的状态,并返回
SampleResult sampleResult = new SampleResult();
// 获取JMeter中输入的用户参数
String userName = context.getParameter("userName");
String password = context.getParameter("password");
// 开始
sampleResult.sampleStart();
//此处是要执行的目标代码
// 暂停
// sampleResult.samplePause();
// 重启
// sampleResult.sampleResume();
// 结束
sampleResult.sampleEnd();
sampleResult.setSuccessful(accountResult.isSuccess());
// 返回
return sampleResult;
}
}
3) 导出工程jar包到jmeter目录libext下,重启jmeter可以选择刚才导入的jar包,以及自己写的对应的方法,写入希望传入的参数就可以正常进行测试了:
4.3 ftp请求
主要提供文件的上传和下载功能
服务器名称或ip:远程服务器的域名或者ip
Remote File:需要上传到服务器或者从服务器下载到本地的文件路径和文件名
Local File: 本地需要上传到服务器或者从服务器下载到本地文件路径和文件名
Local File Contents: 选择get下载,put上传
4.4 jdbc request
jdbc主要提供对数据库的增删改查操作,需要配合配置元件里的JDBC Connection Configuration使用
配置好链接信息,添加jdbc request,Variable Name里填写上面在配置里填写变量名,query type里可以选select,update等不同的选项来支持不同的sql语句
如果语句太多,也可以使用下面的parameter values和parameter types来参数化,
parameter values:参数值
parameter types:参数类型
Result variable name:保存查询结果,线程组执行过程中可以随时通过vars.getObject(“result name”)去读取这个查询结果。
- Beanshell
常用的内置变量:
log: 写入log相关信息,log.info(“xxxxxxx”);
vars: 操作脚本中的变量,vars.get(String key)获取指定变量,vars.put(String key,String value), 保存修改变量值。
Prev: 调用SampleResult类相关方法:
prev.getContentType():获取完整的content-type信息
prev. getResponseDataAsString(). 获取前置请求的返回并且转化成字符串
5.1 BeanShell PreProcessor
前置处理器,在实际的请求发出前运行,可以预先设定一些参数的值或者对传入的参数做处理,请求时使用beanshell处理过的数值。
上图在编辑模块通过代码获取当前的unix时间戳,使用vars.put(“time”,time)设定变量,在之后即将运行的请求或者相关配置原件中可以通过${time}来动态获取即时的时间戳信息。
5.2 BeanShell PostProcessor
后置处理器,和前置相似。在请求发送后,对相应做处理。
除了对响应做处理,也可以读取脚本配置的变量来重新赋值或者跳出while等循环或者逻辑控制器。
- 配置元件
6.1 csv data set config:
FileName: csv文件目录,如果和脚本路径相同,只需要填文件名
File Encoding: 默认为ANSI,有中文的时候可以填utf-8
Varible Names: 定义文本文件中的参数名,参数之间逗号分隔.定义后可在脚本在以Shell变量的同样的方式引用
Delimiter(use “ ” for tab):一般情况下,分隔符为英文逗号
Allow Quoated data: 双引号相关
Recycle on EOF: 设置为True后,允许循环取值
Stop Thread on EOF: 当Recycle on EOF为false并且Stop Thread on EOF为true,则读完csv文件中的记录后,停止运行
Sharing Mode: 设置是否线程共享
6.2 http信息头管理器
主要支持一些复杂的信息头,左边填写名称,右边填写对应的值,值域里面支持变量动态获取
6.3 http cookie管理器
6.4 计数器
计数器可以设置一个初始值,每次递增的值,以及增长上限。
启动:初始值
递增:指定每次数值增加多少
最大值:递增的上限值
引用名称:在其他地方通过此处的名称来引用计数器,上图名称填的是test,如果在其他地方想要引用这个计数器可以通过${test}来获取值。
与每用户独立的跟踪计数器:不勾选的话,所有线程共享一个计数器,否则每个线程都独自维护一个计数器。
6.5 用户自定义变量
该配置元件可以事先定义一些变量。
如上所示,填写变量名称和变量值,使用时也时通过${test1}来引用。
6.6 Random Variable
随机变量:按照一定的规则随机生成的变量。
Variable name: 变量名称,可以通过${name}来引用。
Output format:输出格式,生成的变量值会按照该格式来组合成最终的值。上图填写的时139aa,那最终的输出时139aaxxxxxxxxxx。如果为空,则生成的变量就是最终值。
Minimum value:随机值的下限。
Maximum value:随机值的上限。
Per Thread(User): false时,所有线程共享变量。true,每个线程单独维护一个变量。
- Jmeter录制
Jmeter脚本除了在UI界面上编写或者直接编写xml文件之外,还可以通过一些工具去生成,下面介绍一个浏览器插件blazemeter录制脚本的流程。
在chrome的扩展程序里搜索并安装blazemeter这个插件,安装好后在chrome的右上角会出现启动按钮
点击启动程序,出现如下界面:
使用blazemeter录制一个jmeter脚本分一下步骤:
1) 启动程序后在最上方的输入框为脚本定义一个名称
2) 下方一排有6个按钮,从左到右依次为,开始录制,停止录制,中止录制,编写录制脚本,导出为.jmx脚本,重置所有选项。
3) 点击开始录制按钮后,这时可以在浏览器上做访问操作,工具图标上会记录操作浏览器的动作次数
4) 浏览器访问结束,点击停止录制。
5) 如果需要编辑可以点击编写录制修改相关参数,最后点击导出为可以被jmeter识别的.jmx文件,直接用jmeter打开,运行调试。
- 监听器
Jmeter监听器元件里提供了许多结果检测功能:
8.1 Jmeter自带监听器:
1) 查看结果树:可以详细的查看请求的参数,返回等功能,大量压测的话建议勾选上只查看错误请求的功能,以免界面死掉。
2) 聚合报告:对请求数,响应时间,吞吐量,数据流量做汇总。比较常用的功能
Sample:请求总数
Average:平均响应时间
Median:一半的请求响应时间小于该时间
90% Line : 90%的请求响应时间小于该时间
Min:最小响应时间
Max:最大响应时间
Error %:出错请求占请求总数的百分比
Throughput:吞吐量,服务器每秒处理的请求数
KB/sec:每秒从服务器接收的数据量
8.2 Jmeter插件
8.2.1 jmeter自带的绘图结果不怎么好看,并且jmeter本身并不能监听服务器的内存,cpu等硬件指标,所以利用JMeterPlugins可以辅助生成一些简单明了的图形结果。下面时操作步骤:
1) 下载JMeterPlugins相关jar包放到jmeter安装路径下的libext下面,重启jemter
2) 为线程组添加监听器,如果jar包生效,就发现菜单中多了一些jp@gc开头的新的监听器。
3) 新的监听器监听服务器需要部署agent到目标机器上,下载ServerAgent到目标服务器上,运行bat启动文件,如下图所示就启动成功了。此时运行压测脚本就可以看到监听器开始工作。
4) 常用监听器介绍:
Transactions per Second:每秒处理的事物数
Hits per Second:每秒点击率
PerfMon Metrics Collector:性能表现指标收集,该图表需要手动添加目标服务器的ip和端口(对应之前启动agent的端口),选择需要收集的指标,cpu,io,内存等。该监听器中,所有可监听的机器ip和想要的性能指标都可以通过在监听器界面上通过下拉框来选择(红线部分所示)。
Active Threads Over Time:活动用户数量,脚本执行期间,正在运行的线程数。
8.2.2 除了通过jmeter去监听指标外,也可以通过nmon等工具直接在服务器上收集数据。
- 分布式部署测试
由于单台机器所能开启的线程数受机器本身的硬件相关配置限制,当有高并发的需求时可以开启分布式部署,将压力分布到到多执行节点上,一台master server负责收集各个节点的运行结果并进行汇总。
下面是分布式部署流程:
9.1 节点机器配置:
安装jmeter并且配置环境变量,JMETER_HOME=jmeter安装路径。
打开jmeter bin目录下的jmeter.properties文件,修改如下参数值:
server.rmi.localport=1099
server_port=1099
命令行起启动bin目录下jmeter-server.bat脚本,效果如下所示:
后续在server上远程启动该节点的信息都会显示在此处。
9.2 Server配置:
打开jmeter bin目录下的jmeter.properties文件,修改其中的值,
remote_hosts=172.17.3.11:1099(对应各个节点机器的ip和端口配置)
9.3 在server上打开jmeter客户端,选择远程启动的方式,
此时可以看到之前配置的远程服务器已经在可选的列表中,可以有选择的启动某几台远程服务器,或者全部启动,此时在主控server的jmeter界面上可以看到所以远程服务器的运行情况汇总。
10. 线程组
线程属性配置
线程数:用来发送请求的线程数
Ramp-Up Period(in seconds): 指定的线程数在多少时间内完成启动,如果线程组是多次循环的,该参数只对首次线程启动的时候起作用,第二次循环开始线程运行不在受此参数影响。
循环次数:勾选永远会一直跑,填写次数用来设定单个线程的循环次数
调度器:可以让脚本在一个指定的时间段内运行
11.Jmeter和jenkins集成
11.1 Jmeter命令行运行
在jenkins中运行jmeter脚本需要用到jmeter的nonGUI模式,相关参数如下:
-n 非 GUI 模式 -> 在非 GUI 模式下运行 JMeter
-t 测试文件 -> 要运行的 JMeter 测试脚本文件
-l 日志文件 -> 记录结果的文件
-r 远程执行 -> 启动远程服务
-H 代理主机 -> 设置 JMeter 使用的代理主机
-P 代理端口 -> 设置 JMeter 使用的代理主机的端口号
使用示例: jmeter -n -t testplan.jmx -l test.jtl。生成的jtl文件可以在jmeter的聚合报告或者查看结果书界面直接打开查看,如下所示。
11.2 Jmeter,jenkens,ant持续集成。
写好的jmeter脚本可以结合ant,配置到Jenkins持续集成。基本思路是Jenkins构建后执行ant命令,通过ant去调用jmeter脚本,而后把生成的jtl报告转化成可视化的html报告输出:
1) 下载ant:http://ant.apache.org/bindownload.cgi,解压到本地
2) 将jmeter extras目录下的ant-jmeter-1.1.1.jar文件复制到ant的lib目录下
3) 修改jmeter bin目录下的jmeter.properties文件选项的值:
上图中值原先都是被注释的,使用时去掉前面的注释符号“
第一条红线处,反注释后修改其值为xml,意思时输出文件为xml。
下面一部分是要report中想要保存的结果选项,反注释后修改false为true。
4) 复制jmeter extras目录下的build.xml,collapse.png,expand.png,jmeter-results-detail-report.xsl,jmeter-results-report.xsl文件到jmeter bin目录下。
5) 修改build.xml值如下图所示,如果没有就新增一条:
6) 配置ant环境变量:
ANT_HOME = ant安装路径;
CLASSPATH = %ANT_HOME%lib;
PATH = %ANT_HOME%in;
7) 打开一个cmd命令,切换到jmeter bin下面运行命令:ant,出现如下界面则运行成功:
8) 在Jenkins界面新建 一个项目或者打开一个已经存在的项目,打开配置界面
9) 点击增加构建步骤如下图所示:
在出来的界面中填写ant执行命令:
保存项目,开始构建,成功后可以查看HTML报告。
在Jenkins的项目配置里,选择增加构建后操作步骤:
在下拉列表中也可以选择一些其他控件对生成的报告作解析并且输出到Jenkins界面上。