IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 开发测试 -> jmeter性能测试从零基础到精通 -> 正文阅读

[开发测试]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步通常需要循环多次,才能最终解决性能问题

  开发测试 最新文章
pytest系列——allure之生成测试报告(Wind
某大厂软件测试岗一面笔试题+二面问答题面试
iperf 学习笔记
关于Python中使用selenium八大定位方法
【软件测试】为什么提升不了?8年测试总结再
软件测试复习
PHP笔记-Smarty模板引擎的使用
C++Test使用入门
【Java】单元测试
Net core 3.x 获取客户端地址
上一篇文章      下一篇文章      查看所有文章
加:2022-04-22 19:07:17  更:2022-04-22 19:09:26 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年5日历 -2024/5/19 8:38:54-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码