jmeter性能测试从零基础到精通

 一.基本元件介绍:

  •     线程组:模拟的用户
  •     取样器:发送请求。类似于自动化中的业务测试语句
  •     逻辑控制器:控制元件执行顺序。类似于自动化中的逻辑控制语句
  •     前置处理器:对发送的请求参数进行预处理。类似于自动化中的参数化。
  •     后置处理器:对收到的响应数据进行处理。类似于自动化中获得对应的测试结果。
  •     断言:对响应结果进行断言。类似于自动化中的断言
  •     定时器:等待一定时间。类似于自动化中的sleep 语句
  •     测试片段:封装的脚本,供其他脚本调用。类似于自动化中封装的函数
  •     配置元件:测试前的环境及数据配置。类似于自动化中的初始化动作
  •     监听器:查看测试的结果。类似于自动化中的日志和报告。

二.参数化

1.参数化-用户定义的变量

在配置元件中配置:添加路径:测试计划——线程组——配置元件——用户定义的变量

参数设置:参数名:参数值

在HTTP取样器中引用:${参数名}

线程组下配置的用户定义的变量,在线程组下生效,与测试计划中配置的变量冲突时,以线程组下的为准

 

 

  2.参数化-在测试计划配置全局变量

在测试计划中配置(全局生效)

 三.用户参数

使用用户定义的变量时,不同的用户在访问时,读取的参数值完全相同,如果希望每个用户在访问时的变量不同,可以使用用户参数。

配置方法

  • 添加位置:线程组——前置处理器——用户参数
  • 添加用户:可以添加多组用户
  • 添加参数:针对每个用户添加多个参数

 

四.CSV数据文件设置 

使用用户参数时,每个用户可以取不同的数据,但是同一用户的多次循环时读取的数据是不变的。如果想让同一用户多次循环读取时的数据也不同,需要使用CSV数据文件设置的方式。

配置CSV数据文件设置:添加位置:线程组——配置元件——CSV数据文件设置

参数配置:

添加HTTP请求:引用参数值时,使用时CSV数据文件中定义的变量名${变量名}

 

 五.函数

函数对话框里面有很多可以自助生成的函数方法,需要什么用什么 

我现在是通过counter函数在生成动态变化的数值

counter函数:如果counter参数设置为:TRUE,则每个用户分别从1开始计算,每循环一次加1,如果counter参数设置为:FALSE,则所有用户公用一个计数器,每发送一个请求时,取值加1 

 

 六.响应断言

添加:线程组——HTTP取样器——断言——响应断言(断言一定是在HTTP请求的子节点下)

配置介绍:

1.测试字段:需要进行校验的部分

  • 响应文本:响应体中的数据
  • 响应代码:响应状态码
  • 响应信息:响应状态码对应的信息
  • Response Headers:响应头
  • Request Headers:请求头
  • Request Data:请求体中的参数
  • URL样本:请求URL
  • Document(text):响应数据的文本格式
  • 忽略状态:勾选后如何收到4XX,5XX消息,不主动判定为发送消息失败

2.模式匹配规则:要校验的方式

  • 包括:通过正则表达式的方式校验
  • 匹配:通过正则表达式的方式校验
  • 相等:等于
  • 字符串:包含
  • 否:非(取反)
  • 或者:添加多个校验数据时,满足其中一个即可

测试模式:校验预期结果数据

  • 添加:可以填写多个要校验的数据

 

可以在同一个HTTP请求下包含多个响应断言  

 七.JSON断言

配置介绍:

  • Assery JSON path exists:填写要校验的json路径
  • Additionally assert value:勾选上才能填写下面的内容
  • Expected Value:要校验的内容
  • Expected Null:要校验的结果为空
  • invert assertion (will fail if above conditions met):取否,不包含上门要校验的内容

 

 八.断言持续时间

客户端发送请求,到收到服务器的响应的时间,要求不超过指定的时间。

实际时间,是统计的取样器结果中的load time

配置介绍:断言持续时间:配置能接受的最长的响应时间(单位:毫秒)

 九.关联-正则提取器

当请求之间有依赖关系,一个请求的入参,需要使用到之前请求的响应数据时,需要使用关联

正则表达式介绍:

  • .:是通配符,可以代表任意字符(除换行回车)
  • *: 代表前面的字符出现0次或者多次
  • .*匹配规则:找到左边界值后,往右查找有边界,找到最后面的右边界,中间的所有数据都被记录下来
  • ?: 代表非贪婪匹配,找到左边界后,往右查找匹配右边界,只要有匹配的右边界就停止继续查找;再次查找 左边界和右边界
  • 左边界(.*?)右边界:可以提取出想要获取的数据内容: <titile>.*?<titile> 

应用场景:正则表达式提取器可以提取任意格式的响应数据

参数介绍:

  • 引用名称:保存提取出来的变量,用于后续请求的引用
  • 正则表达式:从响应结果中提取出需要的数据内容,注意:加括号,才能提取
  • 模板:当正则表达式有多个括号时,需要取第几个括号中值来保存为变量,正则表达式可能匹配多组值,通过模板的编写来保存指定的值到变量中
  • 匹配数字(0代表随机):当一个变量(括号)中有几个值时,取第几个,1代表取第一个,-1代表取所有
  • 缺省值:当没有提取数据时,返回一个默认值 

在下一个http请求里面引用变量token

十.xpath提取器 

应用场景:只能适用于响应消息为HTML格式的情况

参数介绍:

  • Use Tidy (tolerant parser):勾选上才能解析HTML格式文件
  • 引用名称:定位到指定元素数据后,要保存的变量
  • Xpath query:xpath路径
  • 匹配数字(0代表随机):返回匹配的数据,1代表返回第一个,-1代表返回所有
  • 缺省值:当没有匹配数据时,返回一个默认值

 

 十一.json提取器

应用场景:适用于返回的数据类型为JSON格式的情况

参数介绍:

  • Name of created variables:提出出的参数要保存的变量名
  • JSON path expressions:JSON数据的路径
  • Match No(0 for random):一般不用写,因此json路径对应的数据就是唯一的
  • Default Values:默认值,如果没有提取出数据,就返回默认值

 

 

 十二.跨线程组关联

跨线程组关联指的是多个请求之间有关联关系(即一个请求的参数需要使用前面请求的响应),但是两个请求不在一个线程组内,此时使用提取器无法完成关联,需要使用Jmeter属性来完成数据的传递。

生成全局变量:

  • 添加Bean Shell取样器(填写setProperty函数——将提取器提取出来的值赋值给Jmeter
  • ${__setProperty(属性名,${json提取器的变量名},)}

使用全局变量:

  • 使用property函数——将Jmeter属性值读取出来
  • ${__property(属性名,,)} 

 十三.自动录制脚本

jmeter脚本录制:

1、在测试计划中添加非测试元件中的HTTP代理服务器

2、配置HTTP代理服务器

  • Jmeter代理的端口
  • 配置目标控制器:选择一个线程组,将脚本录制到该线程组中
  • filter过滤:正向/反向 

3、配置浏览器的代理设置:输入IP地址和端口号

4、启动HTTP代理服务器的配置

5、进入浏览器进行操作,HTTP请求会自动记录在Jmeter中

过滤规则的配置:

Cookie管理器:

  • 管理cookie:自动将cookie信息添加到后续的所有请求中
  • 登录及后续的相关操作时,需要提前添加HTTP Cookie管理器 

 十四.连接数据库

准备工作:

1.启动数据库

2.加载mysql的JDBC驱动:

方法1:在测试计划下方的位置,点击浏览添加JDBC的jar包

方法2:将JDBC的jar拷贝到lib目录,并重启jmeter

3.配置JDBC连接池的参数

编写JDBC脚本步骤:

1、添加JDBC Request请求

  • JDBC连接池名称:必须与“JDBC连接池”中的连接名一致
  • 要执行的sql语句
  • Variable Name中:写明要保存的数据的参数名 

 2、添加HTTP请求 —— 搜索请求 

参数为中文时,将参数写到下方参数位置,并勾选上“编码”

 3、添加响应断言

在响应断言中配置要检查的数据内容。

注意:应用JDBC Request查询出的结果时,需要加上索引(因为JDBC查询的结果保存为一个列表)

 十五.逻辑控制器

1.如果(if)控制器

第一种配置方法:

第二种配置方法:

勾选上Interpret Condition as Variable Expression,判断条件需用使用jexl3函数。 

(使用这个函数来进行判定时,Jmeter自身的执行效果要高一些)

 2.循环控制器

控制子节点下的HTTP请求的执行次数

循环控制器与线程组中的循环次数的对比:

  • 循环控制器只控制其子节点下的HTTP请求,线程组对所有的请求都有效
  • 假如线程组循环次数为2,循环控制器次数为3,则循环控制器下的请求执行次数为:2*3

 

3.ForEach控制器: 

与用户定义的变量或者正则表达式提取器配合使用,循环读取用户定义的变量或者正则表达式结果中的所有数据。

配置参数:

 与用户定义的变量配合使用:

  • 添加用户定义的变量:参数名:固定前缀 + 连续的数字后缀
  • 添加ForEach控制,并配置
  • 在ForEach控制器下方添加HTTP请求,并引用ForEach读取的数据${输出变量名称}
  • 添加查看结果树

 

 

 与正则表达式配合使用: 

  • 添加HTTP请求——itcast首页
  • 添加正则表达式提取器,提取出itcast响应中所有的地址相关的数据,并保存为参数area(列表数据)
  • 添加ForEach控制器,循环提取area列表中的每一个地址信息
  • 在ForEach控制器下添加一个HTTP请求——百度,引用ForEach控制器中定义的变量${word},作为参数
  • 添加查看结果树 

 

 

十六.定时器 

1.同步定时器

又叫做集合点(LR的叫法),保证大量的请求在同一时间进行发送,形成绝对的并发

实现原因:设置同步定时器,有请求要发出时,同步定时器会暂缓请求发送,一直到积攒的请求数达到要的数量时

将所有的请求同步发送出去,形成绝对的并发(更大的压力负载)

 

 2.常数吞吐量定时器

设置Jmeter以指定的吞吐量速度往服务器发送HTTP请求。

注意:常数吞吐量定时器只是帮忙达到性能测试的负载(压力)要求,本身不代表性能有bug/无bug,对于bug的分析需要通过响应时间来判断

 十七.jmeter分布式

应用场景:当性能测试时需要模拟的负载(用户/请求)太高,一台测试机无法模拟,需要使用多台测试机一起来模拟以达到要求的负载量,这就叫分布式

原理:

  • 分布式测试时通常由1台控制机和N台代理机
  • 控制机:给代理发送任务,接收代理机返回的数据统计,做汇总展示
  • 代理机:往服务器发送HTTP请求,并接收服务器的响应,并对响应进行处理。

 分布式相关注意事项:

  • 测试机上所有的防火墙关闭
  • 所有的控制机、代理机、被测系统都在同一个子网中
  • 所有的控制机和代理机上安装的Jmeter和JDK的版本必须完全一样。
  • 要关闭Jmeter中的RMI SSL开关

分布式配置与运行:

配置:

代理机(Jmeter.property):

  • server_port :代理机启动的端口,不冲突即可 
  • server.rmi.ssl.disable=true

控制机:

  • remote_hosts: 代理机的IP:port,如果有多个代理机用','分隔 
  • server.rmi.ssl.disable=true

运行:

  • 代理机:进入bin目录下,执行jmeter_server.bat
  • 控制机:启动时,点击“运行”——“远程启动所有”控制代理机的运行

 十八.jmeter报告

1.聚合报告:

label:接口名称

样本:每个接口请求的总次数

平局值:请求的平均响应时间

中位数:50%的样本都没有超过这个时间。这个值是指把所有数据按由小到大将其排列,就是排列在第50%的值

90%百分位:90%的样本都没有超过这个时间。这个值是指把所有数据按由小到大将其排列,就是排列在第90%的值

95%百分位:95%的样本都没有超过这个时间。这个值是指把所有数据按由小到大将其排列,就是排列在第95%的值

99%百分位:99%的样本都没有超过这个时间。这个值是指把所有数据按由小到大将其排列,就是排列在第99%的值

最小值:所有请求最小值

最大值:所有请求最大值

错误率:本次测试中,有错误请求的百分比

吞吐量:吞吐量是以每秒/分钟/小时的请求量来度量的。这里表示每秒完成的请求数,一般认为他为TPS

接收:收到的千字节每秒的吞吐量测试,测试机在过程中的网络传输速率

发送:发送的千字节每秒的吞吐量测试,测试机在过程中的网络传输速率

重点关心的性能指标:

  • 响应时间:观察当前的最大最小值的波动范围,如果波动范围不大,以平均响应时间作为最终的性能响应时间结果,如果波动范围很大,以90%(经验)的响应时间作为最终性能响应时间结果
  • 错误率
  • 吞吐量

2.jp@gc - Response Codes per Second 

每秒事务响应时间

3.jp@gc - Bytes Throughput Over Time 

每秒服务器处理的字节数

Bytes Received Over Time:接收

Bytes Sent Over Time:发送

4.jp@gc - PerfMon Metrics Collector 

基于jmeter客户端监控服务器 硬件资源

CPU:服务器CPU使用情况

memory:服务器内存使用情况

net worK:服务器网络使用情况

disks I/O:服务器磁盘I/O使用情况

5.Concurrency Thread Group 

 6.并发数计算TPS(每秒的请求数)

(1)普通的计算方式:

TPS = 总的请求数 / 总的时间

问题:对于同一天的时间内,不同的时间段,请求速率会有波动,这样计算会被平均掉,无法测试负载高的情况

(2)二八原则:

核心:80%的请求数会集中在20%的时间内完成

TPS = 总的请求数 *80% / 总的时间 * 20

注意:二八原则的计算方法会比平均的计算方式更准确

(3)按照每天的具体业务数据进行计算(稳定性测试TPS)

当获取每天的具体业务统计数据时,就可以统计出业务请求集中的时间段作为有效业务时间;并统计有效业务时间内的总请求数

TPS = 有效业务时间的总请求数 * 80% / 有效业务时间 * 20%

(4)模拟用户峰值业务操作的并发量:(压力测试TPS)

获取每天的交易峰值的时间段,及这个时间段内的所有请求的数量

TPS = 峰值时间内的请求数/峰值时间段 * 系数

系数可以是:2、3、6、10,由项目组自己觉得要达成的性能指标 

 十九.性能测试监控关键指标

1、系统指标:与用户场景与需求直接相关的指标

并发用户数:某一物理时刻同时向系统提交请求的用户数

平均响应时间:系统处理事务的响应时间的平均值。对于系统快速响应类页面,一般响应时间为3秒左右

可以直接用来衡量系统处理能力的指标是(吞吐量)

在系统处于轻压力区(未饱和)时,并发用户数上升,平均响应时间(基本不变),系统吞吐量(上升)

在系统处于重压力区(基本饱和)时,并发用户数上升,平均响应时间(上升),系统吞吐量(基本不变)

在系统处于崩溃区(压力过载)时,并发用户数上升,平均响应时间(上升),系统吞吐量(下降)

2、服务器资源指标:硬件服务器的资源使用情况的指标

CPU使用率:一般可接受上限为85%(用户CPU和系统CPU)

硬件的组成:

 CPU时间的介绍:

CPU占用分类:

内存利用率:一般可接受上限为85%(虚拟内存和实际内存)

1、正常情况下,程序加载到内存中来执行

2、当内存不够时,会加载部分立即要执行的程序到内存中,其他的程序部分放在磁盘中(虚拟内存)

3、当立即要执行的程序执行完成后,从虚拟内存中读取其他的数据内容到实际内存中,再执行程序的处理

4、依次循环第3步,完成程序的运行

卡的原因的就是:每次都需要从虚拟内存(磁盘)中读取数据进行执行,磁盘的读取速度相对CPU和内存而言非常,因此感觉内存不足程序很卡

闪退的原因就是:在第2步中,需要加载部分立即要执行的程序到内存中,如果当前的内存空间不满足最低要求(立即要执行的程序所需要的内存)时,就会出现闪退

磁盘I/O(磁盘input和ouptut)

监控点:监控磁盘实际IO是否已经接近最大值,接近则有问题

监控点:IO队列,如果当前IO队列长度一直不为0,说明磁盘IO有问题

网络带宽(网络上下行带宽)

监控实际的网络流量,与网络带宽做对比,如果实际网络流量与网络带宽接近,则说明网络存在瓶颈,需要优化。

百兆带宽:100Mbyte/s

实际技术中衡量的宽带的单位:KB/s,因此需要换算:100/8 = 12.5MKB/s

 3、JAVA应用 : JAVA应用程序在运行时的各项指标

java虚拟机

JVM(JAVA Virtual Machine): 虚拟出来的空间,专门供JAVA程序运行

java虚拟机内存 

堆区:需要重点关注的部分(动态变化)

所有的对象在初始化会申请堆区的空间,如果申请的空间在使用结束没有及时的释放,那么这个空间就会被占用。—— 内存泄漏

监控点:因此在测试时,需要关注堆区的空间是否持续上升,没有下降

FULL GC机制 

垃圾回收:将内存中已申请并使用完成的那部分内存空间回收,供新申请使用。

垃圾回收机制都是针对堆区的内存进行的。

因为系统在做垃圾回收时,不能够处理任何用户业务的。如果垃圾回收过于频繁,导致系统业务处理能力下降。

监控点:Full GC内存比较大,垃圾回收一次时间比较长,那么这段时间内都不能处理业务,对系统影响比较大,因此我们需要关注Full GC频率

4、数据库:数据库服务器运行时需要监控的指标

慢查询

慢查询:监控系统在运行时,所执行的所有SQL语句,检查这些SQL执行时间是否慢(自己设置一个时长,执行时间超过这个时长就是慢查询)

通过这个方法可以把系统运行时所有执行时间比较长的SQL找出来,进行优化。

缓存命中率

如果缓存命中率过低,需要优化对应的代码和SQL查询语句,想办法提交缓存命中率

监控点:业务执行过程中SQL查询时的缓存命中率。(查询语句读取缓存的次数占总的查询次数的比例) 

 数据池连接数

监控点:数据库连接池的使用率

如果数据库连接池被占满,此时如果有新的SQL语句要执行,只能排队等待,等待连接池中的连接被释放(之前的SQL语句执行完成)

如果监控发现数据库连接池的使用率过高,甚至是经常出现排队的情况,需要进行调优

MYSQL锁 

对比:

页面锁:处理效率低,但是不会出现死锁

行锁:处理效率高,但是可能出现死锁

监控点:需要监控在性能测试过程中,是否有死锁出现,如果出现需要进行代码优化。

5、压测机资源指标:测试机在模拟用户负载时的资源使用情况

CPU:使用率不超过80%

内存:使用率不超过80%

网络:带宽

磁盘空间:

压测机主要是发送请求,发请求时往外发消息, 没有太多的磁盘操作,IO通常不会有问题

jmeter运行时会记录日志,注意磁盘空间不要被占满

一般情况下,测试人员执行性能测试时,只需要关注1、2、5就可以,判断系统是否有性能问题而开发人员要定位性能问题时,需要再次运行,并监控所有的性能指标,来进行分析并调优

 二十.性能监控工具

1.系统指标:通过性能测试工具jmeter以图形化方式监控

2.服务器资源指标

使用jmeter性能监控插件perfmon进行监控

使用linux命令监控:

  • top:相当于windows下的资源管理器
  • free:查看内存
  • vmstat:查看虚拟内存
  • sar:查看网络
  • iostat:查看磁盘IO

Nmon:全面监控liunx系统资源使用情况,包括CPU,内存,IO等,可独立应用监控

3.JAVA应用:jvisualvm

监控JVM内存等指标:

找到JDK的路径:/usr/libexec/java_home -V

进入bin目录:cd /Library/Java/JavaVirtualMachines/jdk1.8.0_181.jdk/Contents/Home/bin

打开Jvivusalvm:open Jvivusalvm

点击“远程”,右键添加远程主机(IP地址为linux虚拟机的IP)

点击JMX连接,选择监控,看JVM对应的监控指标。(重点关注:CPU使用、堆的内存使用)

4.数据库

自带的功能,可以在数据库配置中打开对应的开关,通过日志的方法来监控

定义:指执行速度要低于设置的时间的sql语句。帮助定位查询速度比较慢的sql语句

慢查询时的几个重要参数::

  • slow_query_log : 慢查询日志的开关
  • slow_query_log_file: 慢查询日志存放的位置
  • long_query_time: 慢查询的时长设置 

设置方法:

查询:

  • show variables like '%slow_query%'
  • show variables like 'long_query_time' 

设置:

  • set global slow_query_log = 'ON'
  • set global long_query_time= 1(下次会话时生效) 

5.压测机资源:windows自带任务管理器

二十一.性能调优 

步骤:

1、确定性能问题,根据性能测试的指标进行分析,确定是否存在问题。—— 测试人员能掌握
2、确定问题原因:确定问题后,针对问题进行分析,确定可能的原因。
3、确定调整目标和解决方案(修改配置、增加资源、修改代码)
4、测试给出的解决方案
5、分析优化后的结果。
在性能调优时,1-5步通常需要循环多次,才能最终解决性能问题

  • 6
    点赞
  • 37
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论
JMeter是一款功能强大的开源性能测试工具,广泛应用于接口测试。2021年最新的JMeter接口测试入门到精通实战主要包括以下几个方面: 1. JMeter基础知识:首先要了解JMeter的基本概念和工作原理,包括测试计划、线程组、取样器、监听器等。掌握JMeter的基础知识对于后续的实战非常重要。 2. 接口测试准备:接口测试前需要做一些准备工作,比如准备测试环境、了解接口文档、分析接口性能要求等。这个阶段还可以学习如何使用JMeter的代理功能来捕获接口请求。 3. 创建测试计划:在JMeter中,测试计划是测试的基础,可以在测试计划中添加多个线程组,设置线程数、循环次数等参数。通过设置各种配置元件,如HTTP请求、参数化、断言等,来模拟实际接口请求。 4. 编写测试脚本:使用JMeter的录制功能,可以将浏览器的请求转化为JMeter的测试脚本。也可以手动编写测试脚本,根据接口文档构建请求并添加断言、参数化等。同时可以学习如何使用JMeter的函数和变量,实现参数化和数据驱动测试。 5. 断言和验证:在接口测试中,需要对返回结果进行断言和验证。可以使用JMeter提供的多种断言器对返回结果进行校验,如响应码、响应时间、返回值等。同时,可以学习如何使用JMeter内置的验证器,如正则表达式、xpath等。 6. 性能监控和分析:通过监听器可以查看测试结果,包括响应时间、吞吐量、错误率等。还可以学习如何使用JMeter的插件和扩展,实现更详细的性能监控和分析,如生成图表、分析报告等。 7. 脚本优化和调试:在实际测试过程中需要不断优化和调试测试脚本,提高测试效率和可靠性。可以学习如何使用JMeter的调试功能,查看请求和响应的详细信息,解决测试中的问题。 通过以上实战,可以逐步提升自己的JMeter接口测试能力,从入门到精通。但需要注意的是,JMeter是一个非常强大但也复杂的工具,需要付出一定的学习和实践,才能更好地掌握和应用。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一只小鱼o

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值