1 Test Plan
- Run Thread Groups consecutively,一次只运行一个线程
- Functional Test Model,JMeter将记录每个sample的返回结果,会影响性能,所以一般用来验证配置是否正确
2 Thread Group
每个线程将独立执行Test Plan,效果上模拟N个虚拟用户
Thread Properties:
- Number of Threads,线程数(或者并发用户数)
- Ramp-Up Period,单位秒,指启动全部线程总耗时;比如10个线程设置Ramp-Up=100,则每100/10=10s启动一个线程;线程数过多时,ramp up应足够大,避免启动负载过高,但同时过大的ramp up会导致前面的线程已执行结束,而后面的线程还未启动
- Scheduler
- Duration,控制测试总时长
- Start Delay,线程组每轮启动延时
3 Controllers
二类控制器:Samples 和 Logical Controllers
- Samples,具体的行为,比如发送http请求
- Logical Controllers,满足什么条件才触发samples事件
3-1 Samples
- FTP Request
- HTTP Request (can be used for SOAP or REST Webservice also)
- JDBC Request
- Java object request
- JMS request (Java Message Service)
- JUnit Test request
- LDAP Request (Ligthwight Directory Access Protocol)
- Mail request
- OS Process request
- TCP request
3-2 Logical Controllers
类似于编程语言中的IF、FOR、 WHILE
3-2-1 Sample Controller
无任何作用,只是用来组织结构
3-2-2 LoopController
循环控制器
通过${_jm_LC_idx}
获取循环索引,初始值为0,其中LC为controller的名称
3-2-3 Once Only Controller
容器内的sample,在每个线程内只执行一次
即使是在Loop循环中,或者配置线程执行count数,一般用于登录操作
3-2-4 Interleave Controller
在循环中依次选择该容器下的单个sample交错执行
- ignore sub-controller blocks,子控制器将被视为simple controller
- Interleave accross threads,跨线程遍历元素,而非单线程遍历
3-2-5 Random Controller
类似于Interleave Controller,只不过遍历元素时是随机抽取,而非顺序
3-2-6 Throughput Controller
控制sample的执行频率
- percent execution,按比例执行,即容器内的sample执行可能性
- total executions,指定执行次数
3-2-7 Runtime Controller
控制sample运行时长,内部会一直循环
3-2-8 IF Controller
建议勾选“Interpret condition via Variable Expression”,这样就可以使用${__jexl3()}
函数,比javascript更快
3-2-9 While Controller
条件为False时退出循环
- blank,最后的sample失败则退出循环
- LAST,controller前一个sample失败,则不进入循环;controller内最后的sample失败退出循环
- condition
4 Listeners
监听器收集JMeter运行过程中的数据信息,然后以树型,列表型,图型等方式展示
samples越多,Listeners占用的内存就越多;
4-1 Graph Results
在性能测试中一定不要使用Graph Results,因为它会消费大量的资源(内存和CPU)
- throughput 表示服务器每分钟处理的请求数,计算包括脚本中的延时以及预置处理
4-2 Aggregate Report/Aggregate Graph
- Label,sample的名称
- # Samples,相同名称sample的执行数
- Average,结果平均时间
- Median,50% sample不超过该响应时间
- 90% Line,90%不超过
- 95% Line,95%不超过
- 99% Line,99%不超过
- Min,sample执行最短时间
- Max,sample执行最长时间
- Error %,失败请求占比
- Throughput,单位时间内请求数
- Received KB/sec,每秒接收数据包大小
- Sent KB/sec,每秒发送数据包大小
4-3 Response Time Graph
以线型方式展示sample的响应时间
4-4 Mailer Visualizer
设置失败任务超过阀值自动发送邮件
4-5 Summary Report
类似于Aggregate Report,但是占用更少内存,建议使用
5 Timers
定时器,保证上下samples不连续执行,防止短时间内过多的请求压力
如果有多个Timer,将合并求和
5-1 Constant Timer
固定时长,比较好理解
5-2 Gussian Random Timer
总延时 = 高斯分布值 * (设置的Diviation + Offset)
5-3 Constant Throughput Timer
确保每分钟的sample执行数在指定值以内
结果只是近似,而且当服务处理性能有限时,实际情况可能低于设定值
5-4 Synchronizing Timer
阻塞指定数量的线程,然后同时释放
6 Assertions
校验响应结果是否符合预期
为了保证只校验指定的sample,需要将assertion添加为sample的子项
6-1 Response Assertion
- contains, matches,支持正则
- (?i) 忽略大小写
(?i)Apple pie
- (?s) 无视换行,内容看作单行
- (?is) both
- (?i) 忽略大小写
- equals, substring,文本,大小写敏感
6-2 Duration Assertion
响应时间校验
6-3 XPath Assertion
如果指定的xpath路径存在,则认为校验通过,如//title[text()='Text to match']
6-4 JSON Assertion
先校验JSON格式,再校验JSON路径,最后校验路径匹配的值是否与预期相符
如$.store.book[0].title
7 Configuration Elements
Samples的配置模板,供同级及子级sample使用,一般配置多个sample的公共属性
7-1 CSV Data Set Config
读取文件内容,并按特定分隔符切割,生成变量
默认情况上,文件只打开一次,每个线程按执行顺序读取文件每一行
- Recycle on EOF,开启后,将循环从头开始读
- Stop Thread on EOF,如果Recycle on EOF关闭,Stop on EOF开启,那么线程读到文件EOF处将停止
- Sharing mode,默认全局共享,可以设置线程独享,或者线程组共享
7-2 User Defined Varviables
定义脚本的初始化参数,无论置于何处都是最先执行
可以使用${__P()}
方法,读取properties属性
7-3 Random Variable
- Variable Name,变量名称
- Format String,随机数据格式,可以定义为USER_000,表示最少3位数据,并添加USER_前缀
- Random seed,使用相同的种子,可以保证每次随机数一致
- Per Thread,全局 or 线程独享
8 Pre-Processor Elements
前置处理器,一般用来设置Sample的参数
8-1 HTML Link Parser
从上一个response中抽取protocol, host, path, parameter names,并填充到上级sample中
8-2 User Parameters
指定单线程变量
8-3 JDBC Pre Processor
预先执行SQL语句,存储过程等
8-4 RegEx User Parameters
从前一个请求中提取正则表达式参数,一般前一个请求使用了post processor
9 Post-Processor Elements
后置处理器,一般用来提取响应结果
9-1 Regular Expression Extractor
- 每组匹配结果以
[refname]_g#
的形式存储,其中[refname]是正则表达式的引用名,#指匹配的组号,0表示整个匹配结果 - 在Template中指定
$N$
,可以选择匹配小组 - 由于一个正则表达式可能匹配多次,所以指定Match No.限制具体的匹配结果
9-2 CSS Selector Extractor
通过css选择器锁定dom元素,并返回指定attribute值
如果不指定attribute,则返回text
10 执行顺序
- Configuration elements
- Pre-Processors
- Timers
- Sampler
- Post-Processors (unless SampleResult is null)
- Assertions (unless SampleResult is null)
- Listeners (unless SampleResult is null)
11 Properties && Variables
JMeter属性定义在jmeter.properties
中,为全局型变量
Variables为本地变量,不同的线程可以一样,也可能不一样
在Test Plan和User Defind Variables中均可定义变量,且支持覆盖
12 远程执行
一个JMeter实例可以控制无数台远程服务,并汇总所有的数据
- 不需要将Test Plan复制到远程服务器上
- 每个远程服务器将完全执行Test Plan,即10个线程的任务分布给5台远程服务器,总共产生10 * 5 = 50个线程
- 如果依赖外部数据,则需要保证每台远程主机对应目录下有文件
12-1 启动方式:
- 启动远程JMeter,
$JMETER_HOME/bin/jmeter-server.bat
- 客户机在
$JMETER_HOME/bin/jmeter.properties
中添加远程机IP地址,配置项remote_hosts,以逗号“,”分隔;或者使用-R [remote hosts]在启动时动态指定 - 客户机在GUI模式下,可以在“run -> remote start”中查看远程机的连接情况;由于客户机自身也会执行Test Plan,所以还是应在非GUI模式下启动
jmeter -n -t script.jmx -R host1, host2
12-2 配置SSL
从4.0开始,jmeter的RMI将默认使用SSL,所以需要配置密钥和证书
执行bin/create-rmi-keystore.bat
将在本地生成rmi_keystore.jks
,将文件复制到其他的服务机以及客户机
13 命令行执行
启动参数
- -n,非GUI模式
- -t,指定JMX文件
- -l,记录sample执行结果
- -j,jmeter运行日志,默认是启动目录下的jmeter.log
- -r,远程执行,服务器信息取自jmeter.properties->remote_hosts
- -R,远程执行,后接具体的远程主机列表
覆盖属性
- -D[key]=[value],jvm系统属性
- -J[key]=[value],JMeter本地属性
- -G[key]=[value],全局属性,可供远程主机使用
- -L[key]=[value],logging设置,日志级别可直接使用
-LDEBUG