jMeter安装配置
jMeter的使用

jMeter及安装配置

  • 开源免费、安装简易、多系统兼容
  • 支持多种应用/服务/协议类型的性能或负载测试如HTTP(HTTPS)、SOAP / REST Webservices、Database via JDBC、LDAP、Message-oriented middleware (MOM) via JMS、TCP等
  • 丰富的基础插件
  • 良好的拓展性

官方文档

安装及配置

  • 前提: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基本使用

  1. 认识jmeter
  • 取样器
  • 逻辑控制器
  • 前置处理器
  • 后置处理器
  • 断言
  • 定时器
  • 配置元件
  • 监听器
  1. 取样器之HTTP请求:协议默认是http,可不填,如果是https请求,协议一定要填https
  • 参数类型:参数(key-value)、消息体数据(json/xml)、文件上传
  • 配置元件之http请求默认值:线程组-添加-默认元件-http请求默认值
    • 起到复用的作用,如果http请求的参数相同,则可使用http请求默认值
    • 如果既使用了http请求默认值又在http请求参数中填写了参数,则以后者为准
  1. 监听器之察看结果树
  • 默认text格式
  • CSS选择器测试:只适用于文本响应,可根据JSoup或Jodd对响应数据进行过滤和查看
  • HTML
  • JSON/JSON Path Tester:从json格式数据响应中提取特定数据,可参看之前的文章jsonpath
  • Document:从各种类型文档中提取文本,用的比较少
  • Regexp Tester:仅适用于文本响应,用于提取特定响应数据。关于正则表达式可参看之前的文章正则表达式介绍
  • XPath Tester:仅适用于文本响应,用于提取特定响应数据。关于xpath可参看之前的文章xpath表达式的使用
  1. 配置元件
  • HTTP信息头管理器使用:请求头参数管理,如user-agent。如有自定义的请求头则需要添加该配置元件;分全局和局部
  1. 断言
    用于检查响应数据是否符合预期,可配合使用监听器-断言结果
  • 响应断言
  • XPath Assertion
  • 结合fiddler查看响应结果:在http请求高级选项中设置代理到fiddler即可
  1. 请求参数化
  • 自定义变量:线程组-配置元件-用户定义的变量,使用${变量名}来引用
  • 参数化CSV Data Set Config:线程组-配置元件-CSV Data Set Config
    • 选择文件:同一行为一组,同组不同变量用逗号分割,可以是txt文档或者csv文档(推荐,便于管理)
    • 编码
    • variable names:若为txt填写如username,pwd(同样用逗号分割),若为csv文档,在表格中填写即可
    • 是否忽略第一行
    • 然后则可在请求中通过${变量名}来引用变量即可,只能执行第一行的数据,可设置线程组的循环次数来依次取多行
  • 利用函数助手参数化
    • CSVRead:参数1填写csv文件路径,参数2填写列号(从0开始)点击生成,然后就可用生成的值在请求中来引用了,修改线程组中线程数来依次取多行
    • RandomString:参数1随机字符串的长度,参数2从哪些字符集合中来随机生成,点击生成,然后就可用生成的值在请求中来引用了,随机可能会重复
  1. 正则表达式:语法更多可参看正则表达式介绍
  • 正则表达式提取器提取响应结果: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}来引用提取到所有数据
  1. JSON PATH提取响应结果:jsonpath表达式更多可参看jsonpath的使用
  • JSON Extractor:http请求-后置处理器-json提取器
    • 设置变量名及jsonpath表达式,则其他http请求则可使用${变量名}来引用该提取值了
    • 可结合使用debug sampler或查看结果树的JSON Path Tester来查看提取是否正确
  1. cookie处理
  • 应用场景:如登录接口与需要先登陆才能进一步操作的两个接口之间
    方法1:HTTP Cookie管理器
  • 线程组-配置元件-HTTP Cookie管理器
    方法2:正则表达式提取器,来提取登陆接口响应头中的jessionid;然后添加配置元件-HTTP Cookie管理器
  • 在HTTP Cookie管理器中添加从登陆接口利用正则表达式提取到的jessionid的键值对(通过${变量名}来引用变量值)、域及路径(可从登陆的响应头中获取)
  1. token处理
  • 使用正则表达式提取器或者json提取器提取出来后用于后续接口请求中
  • 在适当的位置和请求中添加HTTP Cookie管理器

jmeter进阶

  1. 存储测试结果
  • 写入结果到Excel:使用jwl.jar(把第三方jar包放入jmeter lib/ext目录下)和BeanShell取样器并编写代码实现
  • BeanShell取样器:线程组-取样器-BeanShell取样器
  • 保存响应到文件:http请求-监听器-保存响应到文件
  1. 文件上传及下载
  • 结合http请求中的参数/消息体数据和文件上传选项
  • 一般下载文件需结合保存响应到文件
  • 同样可结合参数化CSV Data Set Config来完成批量上传和下载
  1. 录制脚本
  • 使用jmeter自带代理工具:添加-线程组A,添加-非测试元件-HTTP代理服务器,设置端口和目标控制器选择需要录制的脚本进入的线程组A,设置request filtering-添加建议排除,并启动。需要录制的端则为浏览器或者手机端(ios需要证书,证书在jmeter安装包内),设置录制端的代理到jmeter即可
  • badboy录制,相对比较简单过时,适用于初学者,这里不做过多介绍
  • 一般不建议录制脚本
  1. 压力场景设置
  • 需要做压力测试的是比较常用的业务或功能模块
  • 压力场景的并发数是多少?是否有预期值,参照上次性能测试结果,没有预期值参考在线用户数(28原则,用在线用户的20%去参考)
  • 关注的参数:响应时间(135/258原则),tps,错误率(99%以上或有对应的容错处理机制),cpu(不要超过80%)和内存(不要超过80%)、队列(小于1)及磁盘(读写操作不要太频繁)
  • 线程数设置:就是并发数,如目标为100,通过叠加的方式去添加
  • 启动时间设置:每秒启动多少个(可以根据结果去调整),原则是想要服务器的压力大点就是时间少点,想要服务器压力慢慢增加就时间长点
  • 循环次数设置:指定次数或永远,每一个线程需要跑的次数,跟持续时间配合使用
  • 调度器配置:配合循环次数设置为永远使用,去设置持续时间
  • 负载测试是逐步增加并发数,稳定性测试即时间确定,查看该段时间内的性能情况
  1. 查看压力测试结果
  • 聚合报告:添加监听器-聚合报告,也可写如文件jtl。average即平均响应时间,median即中位数(50%用户)响应时间,99%line即90%用户响应时间,min最小响应时间,max最大响应时间,error即错误率,thoughput即吞吐量,每秒完成的请求数
  • 需要关注的指标取决与样本数据
  1. 压力测试结果分析
  • 使用断言对结果进行简单的分类如响应时间断言(http请求-断言-断言持续时间),并设置察看结果树保存到文件,通过文件来查看响应断言的错误率,然后对压力策略进行适当的调整
  • 分析聚合报告
  1. GUI模式和非GUI模式
  • GUI模式仅仅在编写测试脚本,脚本调试的时候使用
  • 非GUI模式:命令行模式即CLI(command line)模式,如jmeter -n -t my_test.jmx -l log.jtl
  1. 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
    

    进一步可参看Generating Report Dashboard

    • 方式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>
    
  1. 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/dbnamejdbc: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脚本来取出结果集中的某些值,如
province = vars.getObject("result").get(0).get("province");
vars.put("pro",province)

扩展阅读