jMeter安装配置
jMeter的使用
jMeter及安装配置
- 开源免费、安装简易、多系统兼容
- 支持多种应用/服务/协议类型的性能或负载测试如HTTP(HTTPS)、SOAP / REST Webservices、Database via JDBC、LDAP、Message-oriented middleware (MOM) via JMS、TCP等
- 丰富的基础插件
- 良好的拓展性
官方文档
- jMeter官网,官网上包含多部分文档
- jMeter github
安装及配置
- 前提:JDK
$ java -version
openjdk version "1.8.0_202"
OpenJDK Runtime Environment (Zulu 8.36.0.1-CA-macosx) (build 1.8.0_202-b05)
OpenJDK 64-Bit Server VM (Zulu 8.36.0.1-CA-macosx) (build 25.202-b05, mixed mode)
$ echo $JAVA_HOME
~/.sdkman/candidates/java/current
至于jdk的安装及管理可参看我之前的文章sdkman
- 下载:直接下载最新的已经编译好的二进制版本,如我这下载的是
apache-jmeter-5.4.1.tgz
- 解压
$ mv ~/Downloads/apache-jmeter-5.4.1.tgz ~/
$ cd ~
$ tar zxvf apache-jmeter-5.4.1.tgz
$ cd apache-jmeter-5.4.1
- 启动
$ cd ~/apache-jmeter-5.4.1/bin
$ sh jmeter.sh
- 快捷启动配置:每次进入指定目录执行有点繁琐
$ vim ~/.bash_profile
添加如下内容:
# jmeter设置
export JMETER_HOME=~/apache-jmeter-5.4.1
export PATH=$PATH:$JMETER_HOME/bin
在任意目录执行jmeter快速启动
- 切换为中文(不建议)
$ cd ~/apache-jmeter-5.4.1/bin
$ vim jmeter.properties
修改language=zh_CN
,重启jMeter即可
jmeter基本使用
- 认识jmeter
- 取样器
- 逻辑控制器
- 前置处理器
- 后置处理器
- 断言
- 定时器
- 配置元件
- 监听器
- 取样器之HTTP请求:协议默认是http,可不填,如果是https请求,协议一定要填https
- 参数类型:参数(key-value)、消息体数据(json/xml)、文件上传
- 配置元件之http请求默认值:线程组-添加-默认元件-http请求默认值
- 起到复用的作用,如果http请求的参数相同,则可使用http请求默认值
- 如果既使用了http请求默认值又在http请求参数中填写了参数,则以后者为准
- 监听器之察看结果树
- 默认text格式
- CSS选择器测试:只适用于文本响应,可根据JSoup或Jodd对响应数据进行过滤和查看
- HTML
- JSON/JSON Path Tester:从json格式数据响应中提取特定数据,可参看之前的文章jsonpath
- Document:从各种类型文档中提取文本,用的比较少
- Regexp Tester:仅适用于文本响应,用于提取特定响应数据。关于正则表达式可参看之前的文章正则表达式介绍
- XPath Tester:仅适用于文本响应,用于提取特定响应数据。关于xpath可参看之前的文章xpath表达式的使用
- 配置元件
- HTTP信息头管理器使用:请求头参数管理,如user-agent。如有自定义的请求头则需要添加该配置元件;分全局和局部
- 断言
用于检查响应数据是否符合预期,可配合使用监听器-断言结果
- 响应断言
- XPath Assertion
- 结合fiddler查看响应结果:在http请求高级选项中设置代理到fiddler即可
- 请求参数化
- 自定义变量:线程组-配置元件-用户定义的变量,使用
${变量名}
来引用 - 参数化CSV Data Set Config:线程组-配置元件-CSV Data Set Config
- 选择文件:同一行为一组,同组不同变量用逗号分割,可以是txt文档或者csv文档(推荐,便于管理)
- 编码
- variable names:若为txt填写如username,pwd(同样用逗号分割),若为csv文档,在表格中填写即可
- 是否忽略第一行
- 然后则可在请求中通过
${变量名}
来引用变量即可,只能执行第一行的数据,可设置线程组的循环次数来依次取多行
- 利用函数助手参数化
- CSVRead:参数1填写csv文件路径,参数2填写列号(从0开始)点击生成,然后就可用生成的值在请求中来引用了,修改线程组中线程数来依次取多行
- RandomString:参数1随机字符串的长度,参数2从哪些字符集合中来随机生成,点击生成,然后就可用生成的值在请求中来引用了,随机可能会重复
- 正则表达式:语法更多可参看正则表达式介绍
- 正则表达式提取器提取响应结果:http请求-后置处理器-正则表达式提取器
- 引用名称如res
- 正则表达式:使用分组(),可多组如
{"status":1, "code":(.*), "msg":(.*)}
- 模板如
$1$ $2$
取第一个和第二个分组 - 匹配数字0随机
- 可结合线程组-sampler-debug sampler一起使用,来验证正则是否正常匹配
- 参数引用,使用
${变量名}
,可结合debug sampler中的值来取分组的变量
- 正则表达式提取器获取数组数据
- 匹配数字设置为-1,匹配所有符合正则的值
- ForEach控制器:逻辑控制器-foreach控制器来执行多个http请求(http请求在foreach控制器下一层):设置变量前缀(从debug sampler中查看变量前缀),开始及结束的index,并设置存储到的变量名如var则可在接下来的请求中使用
${var}
来引用提取到所有数据
- JSON PATH提取响应结果:jsonpath表达式更多可参看jsonpath的使用
- JSON Extractor:http请求-后置处理器-json提取器
- 设置变量名及jsonpath表达式,则其他http请求则可使用
${变量名}
来引用该提取值了 - 可结合使用debug sampler或查看结果树的JSON Path Tester来查看提取是否正确
- 设置变量名及jsonpath表达式,则其他http请求则可使用
- cookie处理
- 应用场景:如登录接口与需要先登陆才能进一步操作的两个接口之间
方法1:HTTP Cookie管理器 - 线程组-配置元件-HTTP Cookie管理器
方法2:正则表达式提取器,来提取登陆接口响应头中的jessionid;然后添加配置元件-HTTP Cookie管理器 - 在HTTP Cookie管理器中添加从登陆接口利用正则表达式提取到的jessionid的键值对(通过
${变量名}
来引用变量值)、域及路径(可从登陆的响应头中获取)
- token处理
- 使用正则表达式提取器或者json提取器提取出来后用于后续接口请求中
- 在适当的位置和请求中添加HTTP Cookie管理器
jmeter进阶
- 存储测试结果
- 写入结果到Excel:使用jwl.jar(把第三方jar包放入jmeter lib/ext目录下)和BeanShell取样器并编写代码实现
- BeanShell取样器:线程组-取样器-BeanShell取样器
- 保存响应到文件:http请求-监听器-保存响应到文件
- 文件上传及下载
- 结合http请求中的参数/消息体数据和文件上传选项
- 一般下载文件需结合保存响应到文件
- 同样可结合参数化CSV Data Set Config来完成批量上传和下载
- 录制脚本
- 使用jmeter自带代理工具:添加-线程组A,添加-非测试元件-HTTP代理服务器,设置端口和目标控制器选择需要录制的脚本进入的线程组A,设置request filtering-添加建议排除,并启动。需要录制的端则为浏览器或者手机端(ios需要证书,证书在jmeter安装包内),设置录制端的代理到jmeter即可
- badboy录制,相对比较简单过时,适用于初学者,这里不做过多介绍
- 一般不建议录制脚本
- 压力场景设置
- 需要做压力测试的是比较常用的业务或功能模块
- 压力场景的并发数是多少?是否有预期值,参照上次性能测试结果,没有预期值参考在线用户数(28原则,用在线用户的20%去参考)
- 关注的参数:响应时间(135/258原则),tps,错误率(99%以上或有对应的容错处理机制),cpu(不要超过80%)和内存(不要超过80%)、队列(小于1)及磁盘(读写操作不要太频繁)
- 线程数设置:就是并发数,如目标为100,通过叠加的方式去添加
- 启动时间设置:每秒启动多少个(可以根据结果去调整),原则是想要服务器的压力大点就是时间少点,想要服务器压力慢慢增加就时间长点
- 循环次数设置:指定次数或永远,每一个线程需要跑的次数,跟持续时间配合使用
- 调度器配置:配合循环次数设置为永远使用,去设置持续时间
- 负载测试是逐步增加并发数,稳定性测试即时间确定,查看该段时间内的性能情况
- 查看压力测试结果
- 聚合报告:添加监听器-聚合报告,也可写如文件jtl。average即平均响应时间,median即中位数(50%用户)响应时间,99%line即90%用户响应时间,min最小响应时间,max最大响应时间,error即错误率,thoughput即吞吐量,每秒完成的请求数
- 需要关注的指标取决与样本数据
- 压力测试结果分析
- 使用断言对结果进行简单的分类如响应时间断言(http请求-断言-断言持续时间),并设置察看结果树保存到文件,通过文件来查看响应断言的错误率,然后对压力策略进行适当的调整
- 分析聚合报告
- GUI模式和非GUI模式
- GUI模式仅仅在编写测试脚本,脚本调试的时候使用
- 非GUI模式:命令行模式即CLI(command line)模式,如
jmeter -n -t my_test.jmx -l log.jtl
- Jmeter常用命令的学习使用
-
官方文档jmeter命令行options:CLI Mode
-
Jmeter如何用命令行生成Html报告
- properties配置
jmeter.save.saveservice.bytes = true # Only available with HttpClient4 #jmeter.save.saveservice.sent_bytes=true jmeter.save.saveservice.label = true jmeter.save.saveservice.latency = true jmeter.save.saveservice.response_code = true jmeter.save.saveservice.response_message = true jmeter.save.saveservice.successful = true jmeter.save.saveservice.thread_counts = true jmeter.save.saveservice.thread_name = true jmeter.save.saveservice.time = true jmeter.save.saveservice.connect_time = true jmeter.save.saveservice.assertion_results_failure_message = true # the timestamp format must include the time and should include the date. # For example the default, which is milliseconds since the epoch: jmeter.save.saveservice.timestamp_format = ms # Or the following would also be suitable jmeter.save.saveservice.timestamp_format = yyyy/MM/dd HH:mm:ss
- 方式1:性能测试结束后,自动生成本次测试的html图形报告(推荐)
jmeter -n -t <test jmx file> -l <test result file> -e -o <path to output folder>
-e:在脚本结束后生成html报告,-o保存html报告的路径,此文件夹必须为空或不存在
- 方式2:使用一个已有的结果文件(jtl,csv文件)来生成该次结果的html图形化报告
jmeter -g <log file> -o <path to output folder>
- Jmeter操作数据库
- 原理:Jmeter提供了JDBC连接的插件,通过执行SQL语句的java API,实现对数据库的操作(这里以mysql为例)
- 准备:下载驱动安装并放到
JMETER_HOME/lib
下,重启jmeter - 数据库的配置元件JDBC Connection Configuration:线程组-配置元件-JDBC Connection Configuration添加即可,需要关注的参数如下
- variable name for created pool
- database url:
jdbc:mysql://host:port/dbname
如jdbc:mysql://192.168.60.11:3306/omp_operator
,如果在JDBC Request中执行多条sql语句,需要设置成如jdbc:mysql://192.168.60.11:3306/omp_operator?allowMultiQueries=true
,如果有中文插入或更新到数据库,出现乱码时,需加上characterEncoding
,如jdbc:mysql://192.168.60.11:3306/omp_operator?allowMultiQueries=true&characterEncoding=UTF-8
- jdbc driver class:选择com.mysql.jdbc.Driver
- username、password
- 数据库的元件JDBC Request:线程组-取样器-JDBC Request添加即可,需要关注的参数如下
- variable name:使用数据库配置元件里面的名称
- query type:根据不同的使用场景设置SQL的语句类型,如:Select Statement用于查,Update Statement则可用于增删改,以上两种只支持单条语句。Prepared Select Statement、Prepared Update Statement则支持多条语句
- 批量操作:使用多条语句或者修改线程组来多次执行
- 添加察看结果树来查看执行结果
- 参数化
- 函数助手,拷贝生成的字符串到sql语句中
- 使用csv
- 数据库select操作:jdbc request中的参数,如sql为
SELECT operator_id, province FROM omp_operator_attribution WHERE rule=?;
- parameter values:参数的值,对应SQl中
?
的值,如有多个值,使用逗号分隔。若值为NULL则使用]NULL[
。结合Query Type为Prepared Select Statement、Prepared Update Statement 来使用 - parameter types:parameter values中参数值对应的类型,如,INTEGER, DATE, VARCHAR, DOUBLE,如有多个值,使用逗号分隔,具体类型可查看JDBC Type
- variable names:变量名称,用于保存Select statements, Prepared Select Statements or CallableStatement 等查询语句返回的值,如返回多个值使用逗号分隔
- 添加Debug Sampler(调试取样器)中,则可查看到保存的变量的值,使用如
${name_1}
来取值 - result variable name:创建一个对象变量,保存所有返回的结果。也可使用该变量值来保留结果集,如结果为
result=[{province=浙江, operator_id=1}]
,然后我们也进一步使用beanshell sampler脚本来取出结果集中的某些值,如
- parameter values:参数的值,对应SQl中
province = vars.getObject("result").get(0).get("province");
vars.put("pro",province)