1. 安装
官方网站:http://jmeter.apache.org/
2. 快速入门
2.1 使用模板,通过"文件->Templates"即可使用Jmeter默认的模板进行生成计划
测试计划测试计划 : Jmeter测试脚本的根节点
- 用户定义的变量 : 可在此设置用户全局变量
- 独立运行每个线程组 , 若计划中有多个线程组,设置此项可以生效, 不设置时每个线程组同时运行
- Run teardown Thread Groups after shutdown of main threads , 关闭主线程后运行teardown 程序来正常关闭线程组
- 函数测试模式, 在调试脚本的过程中,我们可能需要获取服务器返回的详情信息,就可以选择此项,会记录较多的数据,但会影响测试效率, 所以执行性能测试时请关闭此项
- Add directory or jar to classpath , 把测试需要依赖的jar包或包所有的目录加入类路径. 但建议大家把依赖包加入%JMETER_HOME%\lib目录下.
测试计划Templates 中,默认生成三个配置元件.
分别是:用户定义的变量, HTTP请求默认值, HTTP Cookie管理器.
它们作用于全局
IE访问Web页面时会记录Cookie信息,Jmeter通过加入HTTP Cookie Manager来自动记录Cookie信息, 属性选择默认即可
2.2 测试计划四要素:
- 脚本中测试计划只能有1个
- 测试计划中至少有一个线程组
- 至少要有一个取样器
- 至少要有一个监听器
2.3 添加线程组
通过"添加->Threads->线程组" 进行添加线程组
image.png设置线程数属性,一线程即代表一用户,通过设置线程数即可模拟大量用户负载的情况
循环次数即单个线程循环执行的次数
线程属性设置
2.4 为线程组添加逻辑控制器
添加逻辑控制器控制器分多种:事务控制器,如果控制器,循环控制器,简单控制器,随机控制器等.可根据需求进行组合应用.
2.5 为控制器添加cookie管理器和用户参数,方便后续的控制器进行调用
Cookie管理器该控制器内的请求会共用该Cookie
用户参数该控制器内所有请求,都可通过${参数名}的方式调用这些参数
2.6 为控制器添加一个取样器(Http 请求)
Http 请求取样器也有多种,基础涵盖我们常见的各种协议,如Http,FTP,JAVA,JMS,LDAP,MAIL,MongoDB,SMTP,SOAP,TCP,Junit,还支持BeanShell脚本.我们这里使用最常用的HTTP 请求即可
2.7 编辑取样器(Http 请求)
编辑取样器在该请求内,调用了全局用户自定义参数${web_ip},和web_port
HTTP请求
- web服务器 : 指定Http 请求的主机地址, 不需要加上"http://" , Jmeter自动会加上, 普通 web服务器端口号默认是80, 邮箱端口一般是443
- Timeouts : 指定超时时间 , 单位是毫秒.Connect指定连接超时时间, Resopnse 指定响应超时时间.
- Content encoding : 默认iso8859
- 路径 : 除去主机地址部分的访问链接
- 跟随重定向 :
2.8 添加配置元件(请求信息头管理器)
添加Header管理器为对应的请求添加Header信息
HTTP信息头管理器管理Header信息, 如User-Agent, Content-Type , Accept , Referer, Cookie等
2.9 添加集合点,模拟多个请求同一时刻发送的场景
选择定时器 同步定时器定时器有多个种类:同步定时器,固定定时器,随机定时器等,可根据业务需求进行选择.我们在这里使用Synchronizing Timer同步定时器
2.10 使用关联
在第一个Http Requst 中新建一个后置处理器(正则表达式提取器),在Response的值提取到变量中,提供给别的Http Request 使用.
后置处理器列表 正则表达式提取器通过正则提取出来的值,赋值给了变量名为itemDealMoney
新建第二个Http 请求,请在参数中调用${itemDealMoney} 中的数据即可
image.png2.11 添加断言
选择HTTP 请求, 右键 添加-> 断言-> 响应断言.
在断言中添加 要测试的模式
添加断言响应
- Apply to 应用范围
- Main sample and sub-samples : 匹配范围包括当前父取样器并覆盖至子取样器
- Main sample only : 匹配范围是当前父取样器
- Sub-samples only : 仅匹配子取样器
- Jmeter Variable : 支持对Jmeter变量值进行匹配
- 要测试的响应字段
- 响应文本 : 响应服务器返回的文本内容,HTTP排除Header部分
- Document(text) : 对文档内容进行匹配
- URL样本 : 匹配URL链接
- 响应代码 : 匹配响应代码,如200
- 响应信息 : 匹配响应信息, 如处理成功返回"OK"字样
- Response Headers : 匹配响应中的头信息
- Ignore Status : 一个请求有多个响应断言 , 其中一个响应断言选中此项,当第一个响应断言失败时可以忽略此响应结果,继续进行下一个断言,若下一断言成功,则还是可以判断事务成功.
- 模式匹配规则
- 包含 : 响应内容包括要匹配的内容,即代表响应成功
- 匹配 : 响应内容要完全匹配需要匹配的内容,即代表响应成功,大小写不敏感,支持正则
- Equals : 响应内容要完全匹配需要匹配的内容才代表响应成功,大小写敏感,需要匹配内容是字符串非正则
- Substring : 响应内容包含需要匹配的内容才代表响应成功,大小写敏感,需要匹配内容是字符串非正则
- 否 : 选择Equals 与Substring 的是字符串,大小写敏感,有时会响应rwmt,hx时可选择此项,会降低匹配级别,类似降到"包括","匹配"的级别,这样就可以响应成功.
- 要测试的模式 :
- 填入你需要匹配的字符串或正则表达式,注意要与模式匹配规则搭配好.
2.12 添加"断言结果" 查看 "断言" 执行的结果.
选中线程组右键 添加 -> 监听器-> 断言结果
断言结果 image.png
2.13 添加监听器(View Results Tree)查看运行结果
image.png2.14 运行测试
运行测试脚本就全部写好了, 运行下,看下最终结果
聚合报告
- Label : 请求别名
- Sample : 执行多少次取样
- Average : 平均响应时间,单位毫秒
- Median : 响应时间中间值
- 90% Line : 90%事务响应时间范围
- Min : 最小响应时间
- Max : 最大响应时间
- Error% : 出错率
- Throughput : 吞吐量,可理解为TPS
- KB/sec : 数据传输量,单位KS
通过Debug Sampler可以查看到脚本执行中,所以变量的值
3. Jmeter运行原理
Jmeter运行原理控制机 : 运用多台Jmeter负载机进行性能测试时,被选中为管理机的那台机器即是控制机
负载机 : 向被测试应用服务器发起负载的机器
控制机发送指令启动线程->负载机运行脚本,回传状态(包括测试结果)->控制机收集结果并显示.
JMeter是以线程的方式运行的,通过线程组来驱动多线程运行测试脚本,对被测服务器发起负载,每一个负载机上都可以运行多个线程组。并且Jmeter不仅可以在GUI方式完成,还可以使用命令行,命令行的运行方式对于负载机的资源消耗会更新.
3.2 Jmeter元件运行顺序
(1) 配置元件
(2) 前置处理器
(3) 定时器
(4) 取样器
(5) 后置处理器
(6) 断言
(7) 监听器
脚本执行顺序容易引起混乱,所以在开发脚本过程中,可按照层级先后顺序来添加你的元件.
4. 基本功能介绍
4.1 Jmeter 函数助手
函数助手菜单 Random函数举例- Name of variable in which to store the result (optional) : 如果填了,则运行脚本后可以在Debug Sampler看到这个变量的值
5. Jmeter 配置代理进行录制
5.1 在浏览器配置代理
在浏览器配置代理5.2 在Jmeter中配置代理
Jmeter中配置代理 HTTP代理服务器- 目标控制器 : 决定将来录制的脚本放在哪个目录
- 分组 : 录制脚本时将会增加很多个节点, 通过它可以给这些节点分个组, 即可把一个URL看成一个组.
点击启动, 然后在浏览器中浏览WEB页面,即可录制下这些HTTP请求.
6. Jmeter参数化
添加配置元件 CSV Data Set Config元件- Filename : 引用文件地址
- File encoding : 读取参数文件的编码格式
- Variable Names : 定义的参数名称
- Delimiter : 用来分隔参数文件的分隔符
- Allow quoted data? : 如果选择True, 则可允许拆分完成的参数里有分隔符出现
- Recycle on EOF : 如果选择True, 则参数文件循环遍历,False参数文件遍历完成后不循环.
- Stop thread on EOF : 和Recycle on EOF的False选择复用;True停止测试,False不停止测试
- Sharing mode : 参数的三种共享模式, All threads , Current thread group , Current thread.
7. 非GUI运行测试
#方式1
java -jar %JMETER_HOME%\bin\ApacheJMETER.jar -n -t %JMETER_HOME%\script\Jforum4-1-01.jmx -r -l result.jtl
#方式2
%JMETER_HOME%\bin\jmeter -n -t %JMETER_HOME%\script\Jforum4-1-01.jmx -l %JMETER_HOME%\result\results.jtl
把jtl文件转成测试报告
#第一种:在测试过程中将jtl转成测试报告(在jmeter的bin目录下执行)
./jmeter -n -t xxx.jmx -r -l xxx.jtl -e -o /home/tester/apache-jmeter-3.0/resultReport
-n : 非GUI 模式执行JMeter
-t : 指定运行的测试脚本地址与名称,可是相对路径或绝对路径
-r : 远程将所有agent启动用在分布式测试场景下,不是分布式测试只是单点就不需要-r
-l : 指定生成测试结果的保存文件, jtl 文件格式
-e : 测试结束后,生成测试报告
-o : 指定测试报告的存放位置
-o 指定的文件及文件夹,必须不存在 ,否则执行会失败,对应上面的命令就是resultReport文件夹必须不存在否则报错
#第二种:使用之前的测试结果,生成测试报告
./jmeter -g xxx.jtl -e -o /home/tester/apache-jmeter-3.0/resultReport
性能参数配置
#打开 %JEMETER_HOME%\bin\jmeter.bat
rem including some tuning recommendations
set HEAP=-Xms512m -Xmx1024m #设置JVM初始堆大小和最大堆大小
set NEW=-XX:NewSize=128m -XX:MaxNewSize=512m #设置青年代大小
set SURVIVOR=-XX:SurvivorRatio=8 -XX:TargetSurvivorRatio=50%
set TENURING=-XX:MaxTenuringThreshold=2
使用Ant建立构建文件
<?xml version="1.0" encoding="UTF-8"?>
<project name="ant-jmeter-test" default="run" basedir=".">
<tstamp>
<format property="time" pattern="yyyyMMddhhmm" />
</tstamp>
<!-- 需要改成自己本地的 Jmeter 目录-->
<property name="jmeter.home" value="/usr/local/jmeter" />
<!-- jmeter生成jtl格式的结果报告的路径-->
<property name="jmeter.result.jtl.dir" value="/home/htdocs/t8891/report/jtl" />
<!-- jmeter生成html格式的结果报告的路径-->
<property name="jmeter.result.html.dir" value="/home/htdocs/t8891/report/html" />
<!-- 生成的报告的前缀-->
<property name="ReportName" value="TestReport" />
<property name="jmeter.result.jtlName" value="${jmeter.result.jtl.dir}/${ReportName}.jtl" />
<property name="jmeter.result.htmlName" value="${jmeter.result.html.dir}/${ReportName}.html" />
<target name="run">
<antcall target="test" />
<antcall target="report" />
</target>
<target name="test">
<taskdef name="jmeter" classname="org.programmerplanet.ant.taskdefs.jmeter.JMeterTask" />
<jmeter jmeterhome="${jmeter.home}" resultlog="${jmeter.result.jtlName}">
<!-- 声明要运行的脚本。"*.jmx"指包含此目录下的所有jmeter脚本-->
<testplans dir="/home/htdocs/t8891" includes="App20180508.jmx" />
<property name="jmeter.save.saveservice.output_format" value="xml"/>
</jmeter>
</target>
<path id="xslt.classpath">
<fileset dir="${jmeter.home}/lib" includes="xalan*.jar"/>
<fileset dir="${jmeter.home}/lib" includes="serializer*.jar"/>
</path>
<target name="report">
<tstamp> <format property="report.datestamp" pattern="yyyy/MM/dd HH:mm" /></tstamp>
<xslt
classpathref="xslt.classpath"
force="true"
in="${jmeter.result.jtlName}"
out="${jmeter.result.htmlName}"
style="${jmeter.home}/extras/jmeter-results-report_21.xsl">
<param name="dateReport" expression="${report.datestamp}"/>
</xslt>
<!-- 因为上面生成报告的时候,不会将相关的图片也一起拷贝至目标目录,所以,需要手动拷贝 -->
<copy todir="${jmeter.result.html.dir}">
<fileset dir="${jmeter.home}/extras">
<include name="collapse.png" />
<include name="expand.png" />
</fileset>
</copy>
</target>
</project>
Ant采用XML格式来建立 构建文件,默认名为build.xml.在脚本目录,使用以下命令:
ant run
网友评论