文章目录
JMeter安装和基本使用
JMeter环境安装
1.安装JDK
2.安装JMeter
官网下载地址:http://jmeter.apache.org/download_jmeter.cgi
安装:把下载的安装包,解压到某一目录即可
配置环境变量:JMETER_HOME=> F:\Jmeter\apache-jmeter-5.1.1在环境变量Path中添加%JMETER_HOME%\lib\ext\ApacheJMeter_core.jar;%JMETER_HOME%\lib\jorphan.jar
进入JMeter安装目录下的bin目录
启动:
1、双击 jmeter.bat
2、双击 ApacheJMeter.jar
3、命令行输入: java -jar ApacheJMeter.jar
JDK常用文件目录介绍
Bin目录:存放可执行文件和配置文件
docs目录:是JMeter的api文档,用于开发扩展组件
apache-jmeter-5.0/docs/api/index.html
printable_docs目录:用户帮助手册
apache-jmeter-5.0/printable_docs/index.html
lib目录:存放JMeter依赖的jar包和用户扩展所依赖的jar包
JMeter汉化
临时汉化:启动JMeter->选择菜单'Options'->Choose Language->Chinese(Simplified)
永久性汉化:修改配置文件
1.找到jMeter安装目录下的bin目录
2.打开jmeter.properties文件,把第37行修改为"language=zh_CN",并取消该行注释
3.重启JMeter即可
JMeter元件
JMeter元件和组件介绍
元件的基本介绍
元件:多个类似功能组件的容器(类似于类)
元件有:
取样器:发送请求
逻辑控制器:控制语句的执行顺序
前置处理器:对请求参数进行预处理
后置处理器:对响应结果进行提取
断言:检查接口的返回结果是否与预期结果一致
定时器:设置等待
测试片段:封装一段代码,供其他脚本调用
配置元件:测试数据的初始化配置
监听器:查看jmeter脚本运行结果
组件的基本介绍
组件:实现独立的某个功能(类似于方法)
就是鼠标悬停到元件出来的选项
接口自动化脚本的实现过程
初始化测试数据 ---配置元件
对请求参数进行赋值 ---前置处理器
调用GET/POST方法发送请求 ----取样器
提取响应中特定字段的值 -----后置处理器
对提取出来的值与预期结果进行对比 ----断言
在控制台查看脚本运行的结果 ----监听器
元件的作用域和执行顺序
元件的作用域
元件的作用域:是靠测试计划的树形结构中元件的父子关系来确定的。(所有的组件都是以取样器为核心来运行的,组件添加位置的不同,生效的取样器也不同)
作用域的原则
取样器:核心,不和其他元件相互作用,没有作用域
逻辑控制器:只对其子节点中的取样器和逻辑控制器起作用
其他元件:
如果是某个取样器的子节点,则该元件只对其父节点起作用;
如果其父节点不是取样器,则其作用域是该元件父节点下的其他所有后代节点(包括子节点,子节点的子节点等)
元件的执行顺序
同一个作用域下不同类型元件:
1.配置元件(configelements)
2.前置处理程序(Per-processors)
3.定时器(timers)
4.取样器(Sampler)
5.后置处理程序(Post-processors)
6.断言(Assertions)
7.监听器(Listeners)
同一个作用域下多个相同类型元件:
按照在测试计划中从上到下的顺序依次执行
JMeter基本组成部分
线程组
作用:线程组就是控制JMeter用于执行测试的一组用户
特点:
模拟多人操作
线程组可以添加多个,多个线程组可以并行或串行(当有多个线程组的时候默认并行执行,只有在测试计划中勾选独立运行每个线程组,才会串行执行)
取样器(请求)和逻辑控制器必须依赖线程组才能使用
线程组下可以添加其他元件下组件
线程组分类:
普通线程组:普通的、常用的线程组,可以看做一个虚拟用户组,线程组中的每一个线程都可以理解为一个虚拟用户
setup线程组:一种特殊类型的线程组,可用于执行预测试操作
teardown线程组:一种特殊类型的线程组,可用于执行测试后工作
线程组-参数详解
线程数的虚拟用户是并行执行
案例分析
取样器
HTTP请求
作用:向服务器发送Http及https请求
参数:
查看结果树
作用 :查看HTTP请求的请求和响应结果
察看结果树组成 :
取样结果:查看响应信息头信息、响应状态码
请求:查看请求相关信息(url、方法、参数)
响应:查看响应信息
异常
异常1:查看结果树种的HTTP请求中,有多个子HTTP请求
原因:
第一个HTTP请求中,URL错误,导致服务器产生了重定向,提供了新的URL路径
jmeter会自动的使用重定向路径发送第二个HTTP请求
点击最外层的HTTP请求和子请求中最后发送的HTTP请求一致
异常2:响应数据乱码
解决方法:
1.找到jMeter安装目录下的bin目录
2.打开jmeter.properties文件,修改配置sampleresult.default.encoding=UTF-8
3.重启JMeter即可
JMeter进行HTTP接口测试的技术要点
JMeter参数化
本质:使用参数的方式来替代脚本中的固定的测试数据
实现方式:定义变量、文件定义的方式、数据库的方式、函数的方式
参数化测试:把测试数据组织起来,用不同的测试爱护据调用相同的测试方法
Jmeter中常见的参数化方式:用户定义的变量、用户参数、CSV Data Set Config、函数
用户定义的变量
作用:定义全局变量
位置:测试计划-线程组-配置元件-用户定义的变量
参数定义及使用:
用户参数
作用:针对同一组参数,当不同的用户来访问时,可以获取到不同的值
位置:测试计划-线程组-前置处理器-用户参数
参数:
CSV数据文件设置
作用:让不同用户在多次循环时,可以取到不同的值
位置:测试计划-线程组-配置元件-csv数据文件设置
参数:
函数(_counter)
作用:计数函数,一般做执行次数统计使用
位置:在菜单中选择-选项-函数助手对话框
设置:TRUE,每个用户有自己的计数器;FALSE,使用全局计数器
Name of variable in which to store the result (optional) :用于存储变量名(可填)
JMeter断言
断言:让程序自动判断预期结果和实际结果是否一致
常用断言:
响应断言 :对任意格式的响应数据进行断言
位置:测试计划-线程组-HTTP请求-断言-响应断言
参数:
测试字段:要检查的项(实际结果)
响应文本:来自服务器的响应文本,即主体响应代码:响应的状态码,例如:200
响应信息:响应的信息,例如:OK
ResponseHeaders:响应头部
RequestHeaders:请求头部
RequestData:请求数据
URL样本:请求URL
Document(text):响应的整个文档
忽略状态:忽略返回的响应状态码
模式匹配规则:比较方式(注意:Equals和Substring模式是普通字符串,而包括和匹配模式是正则表达式)
包括:文本包含指定的正则表达式
匹配:整个文本匹配指定的正则表达式
Equals:整个返回结果的文本等于指定的字符串(区分大小写)
substring:返回结果的文本包含指定字符串(区分大小写)
否:取反
或者:如果存在多个测试模式,勾选代表逻辑或(只要有一个模式匹配,则断言就是OK),不勾选代表逻辑与(所有都必须匹配,断言才是OK)
测试模式:预期结果
即填写你指定的结果(可填写多个),按钮【添加】、【删除】是进行指定内容的管理
JSON断言 :对json格式的响应数据进行断言
位置:测试计划-线程组-HTTP请求-断言-JSON断言
参数:
持续时间断言(Duration Assertion) :对响应时间进行断言
作用:检查Http请求的响应时间是否超出要求范围
位置:测试计划-->线程组-->HTTP请求-->(右键添加)断言-->断言持续时间
参数:持续时间(毫秒):HTTP请求允许的最大响应时间(单位:毫秒)。超过则认为失败
JMeter关联
关联:当请求之间有依赖关系,比如一个请求的入参是另一个请求返回的数据,这时候就需要用到关联处理。
JMeter中常用的关联方法:
-正则表达式提取器:提取任意格式的响应数据
-XPath提取器:提取HTML格式的响应数据
-JSON提取器:提取JSON格式的响应数据
正则表达式提取器
作用:针对任意格式的响应数据进行提取
位置:测试计划-->线程组-->HTTP请求-->(右键添加)后置处理器-->正则表达式提取器
参数:
当匹配数字-1时,获取全部取值,可通过变量_n引用该匹配项的第n个数据
xpath提取器
作用:针对HTML格式的响应结果数据进行提取
位置:添加方式:测试计划-->线程组-->HTTP请求-->(右键添加)后置处理器-->XPath提取器
xpath表达式
JSON提取器
作用:针对JSON格式的响应结果数据进行提取
位置:添加方式:测试计划-->线程组-->HTTP请求-->(右键添加)后置处理器-->JSON提取器
参数:json路径:$...
JMeter属性关联
JMeter属性的配置函数:
__setProperty函数:将值保存成JMeter属性
__property函数:在其他线程组中使用property函数读取属性
JMeter属性的函数执行:
__setProperty函数执行(保存JMeter属性):
------需要通过BeanShell取样器来执行
__property函数(读取属性)
------在其他线程组中使用property函数
Debug Sampler(调试取样器)
允许用户查看在测试执行期间变量和属性的状态。
参数说明
- 名称:控制器的名称,可自定义,用于标识调试器。
- 注释:可选,用于记录添加Debug Sampler的原因或注意事项。
- JMeter Properties:设置为True时,显示JMeter的系统属性,如版本、编码格式等。
- JMeter Variables:设置为True时,显示用户定义的变量,如线程组或测试计划中定义的变量。
- System Properties:设置为True时,显示系统的属性信息。
正则表达式
正则表达式:就是一个公式或者一套规则,使用这套规则可以从任意字符串中提取出想要的数据内容
JMeter录制脚本
JMeter录制脚本:在没有接口文档的旧项目当中,快速录制web页面产生的http接口请求,帮助编写接口测试脚本。
原理:录制时,JMeter作为代理服务器来拦截和转发请求与响应数据
JMeter录制脚本的操作步骤 :
1.添加HTTP代理服务器,并进行配置
加HTTP代理服务器:测试计划(右键)->非测试元件->HTTP代理服务器
配置代理服务器的参数
2.开启windows操作系统的浏览器代理
JMeter直连数据库
直连数据库的使用场景
直连数据库的关键配置:
添加MySQL驱动jar包:
-方式一:在测试计划面板点击浏览按钮,将你的JDBC驱动添加进来
-方式二:将MySQL驱动jar包放到lib/ext目录下,重启JMeter
配置数据库连接信息:
-添加方式:测试计划-线程组-配置元件-JDBC Connection Configuration
参数介绍:
-
Variable Name: mysql数据库连接池名称(JDBC请求时要引用)
-
Database URL: jdbc:mysql://localhost:3306/tpshop2.0( 组成:协议 + 数据库IP + 数据库端口 + 连接的数据库名称)
-
JDBC DRIVER class: com.mysql.jdbc.Driver(MySQL驱动包位置固定格式 ------ 下拉框选择)
-
Username: root(连接数据库用户名,如实填写)
-
Password:(MySQL数据库密码,如实填写,如果密码为空不写)
添加JDBC请求:
添加方式:测试计划 --> 线程组--> 取样器 --> JDBC Request
参数介绍:
-
Variable Name:数据库连接池的名字,需要与JDBC Connection Configuration的Variable Name Bound Pool名字保持一致
-
Query Type:
-
查询操作:选择"Select Statement"
-
增加、删除、修改操作:选择"Update Statement"
-
Query:填写的SQL语句,未尾不要加";"
-
Variable names:保存SQL语句返回结果的变量名。(注意:SQL语句返回结果为列表,不能直接使用,要带下标)
JMeter逻辑控制器
逻辑控制器: 可以按照设定的逻辑控制取样器的执行顺序
如果(if)控制器
作用:If控制器用来控制它下面的测试元素是否运行
位置:测试计划 --> 线程组--> (右键添加) 逻辑控制器 --> 如果(If)控制器
参数介绍:(JS形式执行比函数形式执行慢)
函数形式:选项-函数助手-选择函数(__jex13),然后JEXLexpression to evaluate项值放入JS串,生成的函数字符串放入上图位置即可
循环控制器
作用:通过设置循环次数,来实现循环发送请求
位置:测试计划 --> 线程组--> (右键添加) 逻辑控制器 --> 循环控制器
参数介绍:
循环次数:需要循环几次填几次即可
ForEach控制器
作用:一般和用户自定义变量或者正则表达式提取器一起使用,读取返回结果中一系列相关的变量值。该控制器下的取样器都会被执行一次或多次,每次读取不同的变量值。
位置:测试计划 --> 线程组--> (右键添加) 逻辑控制器 --> ForEach控制器
参数介绍:
- 输入变量前缀:要读取的输入变量的固定前缀(例:如果使用的是用户自定义变量,要想遍历的遍历变量名前缀需要一致,此处填的就是对应的变量名前缀)
- 开始循环字段:要读取的输入变量后缀数字的最小值-1
- 结束循环字段:要读取的输入变量后缀数字的最大值(如果不写默认读取到最后一个值,但是如果变量后缀数字不连续,读到首次不连续出结束)
- 输出变量名称:读取输入变量的值后保存的新变量名,用于后续HTTP请求来引用
JMeter进行性能测试的技术要点
定时器
同步定时器
使用场景:测试抢购、秒杀、抢红包等高并发的场景时使用
同步定时器:阻塞线程(累积一定的请求),当在规定的时间内达到一定的线程数量,这些线程会
在同一个时间点一起释放,瞬间产生很大的压力。
位置:测试计划 --> 线程组--> HTTP请求 --> (右键添加) 定时器 --> Synchronizing Timer
参数介绍:
- Number of Simulated Users to Group by:模拟用户的数量,即指定同时释放的线程数数量。若设置为0,等于设置为线程组中的线程数量
- Timeout in milliseconds:超时时间(单位毫秒),即超时多少毫秒后同时释放指定的线程数;如果设置为0,该定时器将会等待线程数达到了设置的线程数才释放,若没有达到设置的线程数会一直死等。如果大于0,那么如果超过Timeout in milliseconds中设置的最大等待时间后还没达到设置的线程数,Timer将不再等待,释放已到达的线程。默认为0
常数吞吐量定时器Constant Throughput Timer
使用场景:需要按指定的吞吐量发送请求时,可以使用常数吞吐量定时器
作用:让JMeter按指定的吞吐量执行,以每分钟为单位。
位置:测试计划 --> 线程组--> HTTP请求 --> (右键添加) 定时器 --> Constant Throughput Timer
参数介绍: - Target throughput(in samples per minute):目标吞吐量。注意这里是每个用户每分钟发送的请求数(计算方法:要求QPS * 60 / 线程数)
JMeter分布式
使用场景:单台测试机无法满足用户要求的负载量时,使用多台机器来模拟
JMeter分布式执行原理
分布式相关注意事项
关闭防火墙
所有控制机、代理机、服务器都在同一网络上
所有机器的JMeter和JAVA版本必须一致
关闭RMI SSL开关
JMeter分布式配置和执行
配置 ------ 修改bin/jmeter.properties文件:
- 代理机:
-- 修改服务端口: 保证每个代理机都能正常启动。如果是在同一台机器上演示需要使用不同的端口,多台机器可以不修改。例如:server_port=2999(jmeter.properties配置文件中修改)
-- 将RMI SSL设置为禁用。例如:server.rmi.ssl.disable=true(jmeter.properties配置文件中修改) - 控制机:
-- 配置代理机远程地址:配置每个代理机的IP+port,多个代理机之间用','连接。例如: remote_hosts=192.168.182.100:1099,192.168.182.101:2999(jmeter.properties配置文件中修改)
-- 将RMI SSL设置为禁用。例如:server.rmi.ssl.disable=true
执行 - 代理机(命令行方式启动):
-- 进入bin目录,运行jmeter-server.bat文件,启动JMeter - 控制机(界面方式启动):
-- 进入bin目录,运行jmeter.bat文件,启动JMeter
-- 选择菜单:运行-->远程启动/远程全部启动
JMeter测试报告
聚合报告
作用:收集性能测试结束后,系统的各项性能指标。如:响应时间、并发数、吞吐量、错误率等
位置:测试计划->右键->监听器->聚合报告
参数介绍:
-Label:每个请求的名称
-
样本:各请求发出的数量
-
平均值:平均响应时间(单位:毫秒)
-
中位数:中位数,50% <= 时间
-
90%百分比:90% <= 时间
-
95%百分比:95% <= 时间
-
99%百分比:99% <= 时间
-
最小值:最小响应时间
-
最大值:最大响应时间
-
异常%:请求的错误率
-
吞吐量:吞吐量。默认情况下表示每秒完成的请求数,一般认为它为TPS。
-
接收 KB/sec:每秒接收到的千字节数
-
发送 KB/sec:每秒发送的千字节数
补充:正常情况下,取平均值作为响应时间结果,当存在最大值特别高,超出平均水平特别多的的情况,导致平均值不能代表大部分水平时,可以使用百分比时间
HTML报告
作用:JMeter支持生成HTML测试报告,以便从测试计划中获得图表和统计信息
命令:(cmd窗口执行)
jmeter -n -t [jmx file] -l [result file] -e -o [html report folder]
eg: jmeter -n -t hello.jmx -l result.jtl -e -o ./report
参数描述:
-n:非GUI模式执行JMeter
-t [jmx file]:测试计划保存的路径及.jmx文件名,路径可以是相对路径也可以是绝对路径(脚本路径)
-l [result file]:保存生成测试结果的文件,jtl文件格式(运行脚本后生成的临时日志文件)
-e:测试结束后,生成测试报告
-o [html report folder]:存放生成测试报告的路径,路径可以是相对路径也可以是绝对路径
注意:result.jtl和report会自动生成,如果在执行命令时result.jtl和report已存在,必须用先删除,否则在运行命令时就会报错
HTML测试报告:执行完毕后,用浏览器打开生成报告的文件目录下的index文件,效果展示如下(仪表盘显示统计信息)
APDEX (应用性能指标): APDEX:满意度,范围在 0-1 之间,1表示达到所有用户均满意;T(Toleration threshold):容忍或满意阈值; F(Frustration threshold):失败阈值
Requests Summary(请求总结):成功与失败的请求占比,KO指失败率,OK指成功率
Chart(详细信息图表):它包括Throughput(吞吐量) 、Response Times(响应时间)等
Response Times Over Time(脚本运行期间的响应时间变化趋势图)
JMeter性能测试常用图表
掌握性能测试时TPS的计算方法
系数:根据项目情况,业务量未来发展情况,如果项目比较平稳2即可,如果预期未来一年业务量翻5倍则5
能使用JMeter来下载第三方插件
说明:先下载JMeter插件管理工具包,再用此包下载JMeter插件
下载插件管理包的步骤:
- 下载包管理工具jar包
https://jmeter-plugins.org/install/Install/
- 将包管理工具jar包添加到JMeter放入到lib\ext目录下
3.重启JMeter,可以在选项下看到插件管理器
安装第三方插件的步骤: - 打开Plugins Manager插件管理器
- 选择Available Plugins,当前可用的插件
- 选择需要下载的插件(等待右方文本内容展示出来)
- 下载右下角的下载按钮,自动的完成下载,JMeter会自动重启
理解常用的性能测试图表
Concurrency Thread Group 线程组
阶梯线程组:作用是阶梯加压;图形界面显示运行状态
添加方式:测试计划 --> 线程(用户)--> Concurrency Thread Group
参数介绍:
- Target Concurrency:目标并发(线程数)
- Ramp Up Time:加速时间
- Ramp-Up Steps Count:加速步骤计数
- Hold Target Rate Time:运行时间
- Time Unit:时间单位(分钟或者秒)
- Thread Iterations Limit:线程循环次数
- Log Threads Status into File:日志记录
Transactions per Second
每秒完成事务数:作用是统计各个事务每秒钟成功的事务个数
添加方式:测试计划 --> 线程组--> 监听器-->Transactions per Second
Transactions per Second和聚合报告中的TPS在性能测试时的作
用有何不同,以哪个为准?
• 性能测试的结果统计,以聚合报告的结果为准
• 每秒性能指标的作用是:查看系统长时间运行过程中是否有异常出现,有则进一步分析
Bytes Throughput per Second
每秒字节吞吐量:作用是查看服务器吞吐流量(单位/字节)
添加方式:测试计划 --> 线程组--> 监听器-->Bytes Throughput Over Time
使用PerfMon插件监控服务器资源
作用:用来监控服务端的性能资源指标的工具,包括cpu、内存、磁盘、网络等性能数据
添加方法:线程组->监听器->jp@gc - PerfMon Metrics Collector
注意:使用之前需要在服务器端安装监听服务程序并启动
监控服务器资源指标的步骤:
- 下载安装包ServerAgent-2.2.3.zip,链接地址:https://github.com/undera/perfmon-agent
- 上传到服务器上,并解压ServerAgent-2.2.3.zip
- 启动,如果是windows运行startAgent.bat,如果是linux运行startAgent.sh(./startAgent.sh)
- 启动这个工具后,jmeter的插件jp@gc - PerfMon Metrics Collector就可以收集服务端的资源使用率,并在
jmeter中查看了