本文档主要记录jmeter接口性能测试学习过程中常见的那些问题

性能测试初识

性能测试Jmeter - 图1

Jmeter安装配置

1、JDK下载 Java Downloads | Oracle
image.png
2、下载Jmeter
image.png
3、环境变量配置
image.png
image.png
4、找到jmeter.bat文件,双击启动
image.png

导入JMX文件报错

使用Jmeter-5.1.1导入jmx文件时,报如下错误
image.png
解决办法,安装插件管理器,检测并自动导入必要的jar包,然后点击install自动下载
将下载完成的Plugins-manager.jar包复制到apache-jmeter-5.1.1\lib\ext目录下,重启Jmeter,再次导入jmx文件,此时提示需要下载的插件,点击install it,插件下载完毕后,Jmeter会自动重启,然后就可以打开你想要打开的jmx文件了
https://jmeter-plugins.org/install/Install/
image.png

响应报文乱码处理

1、添加后置处理器BeanShell PostProcessor
输入prev.setDataEncoding(“utf-8”),目的是修改响应数据编码格式为utf-8,重启Jmeter即可
image.png
2、修改配置文件
a.进入Jmeter的bin目录下,找到jmeter.properties文件
b.#sampleresult.default.encoding=ISO-8859-1的注释去掉
c.改成:sampleresult.default.encoding=UTF-8,
image.png
3、检查内容编码是否遗漏
image.png

Jmeter代理录制脚本

1、添加线程组-配置原件-HTTP Cookie管理器
添加逻辑控制器-录制控制器
添加非测试原件-HTTP代理服务器
image.png
image.png
2、HTTP代理设置
image.png
3、浏览器证书设置-证书导入
image.png
image.png
image.png
4、启动,停止录制
image.png
image.png
5、录制完成后取消代理服务器的选项,否则将无法正常连接网络

Jmeter使用手册

1、负载测试使用CLI模式(以前称为非 GUI 模式的命令行模式
不要使用GUI模式进行负载测试,GUI模式下是用于脚本的创建和调试
2、Jmeter目录结构
/bin 目录(常用文件介绍)
examples:目录包含jmeter使用实例
ApacheJMeter.jar:JMeter源码包
jmeter.bat:windows下启动文件
jmeter.sh:Linux下启动文件
jmeter.log:Jmeter运行日志文件
jmeter.properties:Jmeter配置文件
jmeter-server.bat:windows下启动负载生成器服务文件
jmeter-server:Linux下启动负载生成器文件
/docs目录——Jmeter帮助文档
/extras目录——提供了对Ant的支持文件,可也用于持续集成
/lib目录——存放Jmeter依赖的jar包,同时安装插件也放于此目录
/licenses目录——软件许可文件,不用管
/printable_docs目录——Jmeter用户手册
3、正则表达式使用:
提取单子字符串:
name=”file” value=”readme.txt”>
name=”file” value=”(.+?)”>
提取多个字符串:
name=”file.name” value=”readme.txt”
name=”([^”]+)” value=”([^”]+)”

Jmetr变量提取

1、使用json提取器提取单个变量:
image.png
names of created variables:自定义变量名,后面其它接口需要调用该变量时使用 ${变量名2} 进行调用 。
json path:json path表达式,使用 $. 表示从根目录下开始。(注意:$号后面的英文符号”.”不要忘记写)
match no:填写匹配数组中第几个值N,N为整数。(注意:N=-1 或 N=0 或 N>0)
N=-1 表示全部匹配,整个数组中所有的值全部取到,后续在其他接口调用时使用 ${变量名_N} 取数组中第N个匹配值 ;
N=0 表示随机匹配,随机取到数组中任意一个值;
N>0 表示取第几个匹配值;(例如:N=1为取到数组中第一个值);
2、使用json提取器提取多个变量:
image.png
names of created variables:自定义变量名,后面其它接口需要调用该变量时使用 ${变量名1} 或 ${变量名2} 或 ${变量名3} 或 ${变量名4} 选择对应的变量进行调用。
重要:每个变量之间使用英文符号”;”进行隔开
json path:json path表达式,使用 $. 表示从根目录下开始。(注意:$号后面的英文符号”.”不要忘记写)
重要:每个表达式之间使用英文符号”;”进行隔开,表达式数量要和上面的自定义变量名数量保持一致。
match no:填写匹配数组中第几个值N,N为整数。(注意:N=-1 或 N=0 或 N>0 )
重要:每个数之间使用英文符号”;”进行隔开,表达式数量要和上面的自定义变量名数量保持一致。
N=-1 表示全部匹配,整个数组中所有的值全部取到,后续引用用 ${变量名_N} 取数组中第N个匹配值
N=0 表示随机匹配,随机取到数组中任意一个值;
N>0 表示取第几个匹配值;(例如:N=1为取到数组中第一个值);
default values:缺省值,可以填写自己想要的值(例如:error、null等),匹配不到值的时候取该值。(PS:例如数组中3个值,如果取第四个值的时候就会因为超出数组界限无法取值,转而取缺省值。)
重要:每个缺省值之间使用英文符号”;”进行隔开,表达式数量要和上面的自定义变量名数量保持一致
3、使用正则表达式提取变量:
image.png
image.png
引用名称:自定义变量名,后面其它接口需要调用该变量时使用 ${变量名} 进行调用 。
正则表达式:参考上述正则表达式编写方法编写正则表达式。
模板:正则表达式模板,固定写法。
匹配数字:填写匹配数组中第几个值N,N为整数。(注意:N=-1 或 N=0 或 N>0)
N=-1 表示全部匹配,整个数组中所有的值全部取到,后续引用用 变量名_N 取数组中第N个匹配值 ;
当N=-1时,可以使用如下方式调用数组中不同的值:
${变量名_N} :表示获取数组中第N个值
N=0 表示随机匹配,随机取到数组中任意一个值;
N>0 表示取第几个匹配值;(例如:N=1为取到数组中第一个值);
缺省值:缺省值,可以填写自己想要的值(例如:error、null等),匹配不到值的时候取该值。(PS:例如数组中3个值,如果取第四个值的时候就会因为超出数组界限无法取值,转而取缺省值。)
4、调试取样器,用于查看提取变量是否正确
image.png

CSV数据文件设置

image.png
image.png

Jmeter中函数使用

image.png

Jmeter定时器的使用

固定定时器,每个请求之间暂停相同的时间,使用固定定时器,
固定计时器的延时不会计入单个sampler,但会计入事务控制器的时间
image.png
统一随机定时器,将采样器暂停一个随机的毫秒数
image.png
同步定时器,实现了某种意义上的并发
image.png

Jmeter断言方式

响应断言,响应结果中包含指定字符串,断言通过,不包含断言失败
JSON断言,json表达式值与期望结果相等,断言通过,不相等则断言失败
image.png
断言持续时间,实际请求时间系小于等于期望时间,断言通过,否则断言失败
image.png

Jmeter数据库测试

1、下载数据驱动jar包,放在C:\apache-jmeter-5.4.3\apache-jmeter-5.4.3\lib\ext目录下,重启jmeter
将数据驱动文件添加到Classpath
image.png
2、添加JDBC配置原件并进行配置,JDBC Connection Configuration,连接配置池文件
image.png
3、添加【sampler】,JDBC Request
image.png

Jmeter扩展插件

Jmeter本身是不能够展示内存,cpu和吞吐量的,但是可以通过添加插件的方式来对jmeter添加这些功能
http://www.51testing.com/html/15/n-3726415.html
https://www.cnblogs.com/imyalost/p/7751981.html
https://jmeter-plugins.org/install/Install/
image.png
image.png
Installed Plugins(已安装的插件):即插件jar包中已经包含的插件,可以通过选中勾选框,来使用这些插件;
Available Plugins(可下载的插件):即该插件扩展的一些插件,可以通过选中勾选框,来下载你所需要的插件;
Upgrades(可更新的插件):即可以更新到最新版本的一些插件,一般显示为加粗斜体,可以通过点击截图右下角的Apply Changes and Restart Jmeter按钮来下载更新;
PS:一般不建议进行更新操作,因为最新的插件都有一些兼容问题,而且很可能导致jmeter无法使用(经常报加载类异常)!!!
jp@gc - Transactions per Second:
TPS:每秒事务数,性能测试中,最重要的2个指标之一。该插件的作用是在测试脚本执行过程中,监控查看服务器的TPS表现————比如整体趋势、实时平均值走向、稳定性等。
jp@gc - Response Times Over Time:
TRT:事务响应时间,性能测试中,最重要的两个指标的另外一个。该插件的主要作用是在测试脚本执行过程中,监控查看响应时间的实时平均值、整体响应时间走向等。

PerfMon Metrics Collector:
服务器性能监控数据采集器。在性能测试过程中,除了监控TPS和TRT,还需要监控服务器的资源使用情况,比如CPU、memory、I/O等。该插件可以在性能测试中实时监控服务器的各项资源使用
服务器性能监控数据采集器。在性能测试过程中,除了监控TPS和TRT,还需要监控服务器的资源使用情况,比如CPU、memory、I/O等。该插件可以在性能测试中实时监控服务器的各项资源使用。
下载地址:http://jmeter-plugins.org/downloads/all/或链接:http://pan.baidu.com/s/1skZS0Zb 密码:isu5
下载界面如下:
性能测试Jmeter - 图38
其中JMeterPlugins-Standard和JMeterPlugins-Extras是客户端的插件,ServerAgent是服务端的插件。
下载成功后,复制JmeterPlugins-Extras.jarJmeterPlugins-Standard.jar两个文件,放到jmeter安装文件中的lib/ext中,重启jmeter,即可看到该监视器插件。如下图:
性能测试Jmeter - 图39
将ServerAgent-2.2.1.jar上传到被测服务器,解压,进入目录,Windows环境,双击ServerAgent.bat启动;linux环境执ServerAgent.sh启动,默认使用4444端口。
如出现如下图所示情况,即表明服务端配置成功:
性能测试Jmeter - 图40
1、服务端启动校验
CMD进入命令框,观察是否有接收到消息,如果有,即表明ServerAgent成功启动。
2、客户端监听测试
给测试脚本中添加jp@gc - PerfMon Metrics Collector监听器,然后添加需要监控的服务器资源选项,启动脚本,即可在该监听器界面看到资源使用的曲线变化。如下图所示:
性能测试Jmeter - 图41
在脚本启动后,即可从界面看到服务器资源使用的曲线变化,Chart表示主界面显示,Rows表示小界面以及不同资源曲线所代表的颜色,Settings表示设置,可选择自己需要的配置。
PS:注意测试脚本需要持续运行一段时间,才可以看到具体的曲线变化,否则ServerAgent端会断开连接!

Jmeter分布式测试

若并发数较大,单台电脑的CPU和内存无法支持时,可以使用jmeter的分布式测试
image.png
注意事项:

  1. 防火墙必须关闭
  2. 所有的测试机必须在同一个子网下,能互相ping通
  3. 确保jmeter能够访问服务器
  4. 确保测试机上的jdk和jmeter是同一版本
  5. 禁用jmeter的RMI SSL配置项

代理机(slave)配置:

  1. agent上必须安装jmeter和jdk,不管是Linux 还是Windows
  2. 如果在同一台机器上跑多台代理机,必须要修改jmeter设置中的server_port.如果多台不同的电脑上跑代理则不需要修改。如果代理机是虚拟机,必须保证虚拟机和主机之间相互都能ping通,否则无法正常测试
  3. 修改RMI SSL disable 为true
  4. 通过agent上的jmeter-server.bat文件启动代理机(如果提示没有权限,则需要先将jmeter目录权限改为777)
  5. 注意:linux上通过命令+参数启动:

    ./jmeter-server -Djava.rmi.server.host.name=ip地址
    主控机(master)配置

  6. master的jmeter的bin目录下的jmeter.properties配置文件,修改“remote_hosts”为代理机ip地址和端口

  7. 如:remote_host=127.0.0.1:2099,192.168.2.200:1099
  8. 修改RMI SSL disable为true
  9. 启动jmeter
  10. 选择菜单:运行-》远程启动/远程启动所有

注意:如果通过远程执行无法显示响应内容的话,需要将jmeter.properties中的mode=Standard取消注释