Jmeter

性能测试总体目标:

Jmeter_第1张图片

一、性能测试概述

1)性能的概念:

Jmeter_第2张图片

2)性能测试和功能测试:

Jmeter_第3张图片

3)性能测试分类:

3.1)基准测试:

Jmeter_第4张图片

3.2)负载测试:

Jmeter_第5张图片
Jmeter_第6张图片
注意:
通过负载测试,可以确定系统的最大负载量和极限负载量
系统对外宣称的最大负载量
负载测试的时间一般为1-2小时

3.3)稳定性测试

Jmeter_第7张图片

3.4)其他分类:

Jmeter_第8张图片
分类:
高负载下的长时间稳定性压力测试 (如:B-C区间内进行24/3*24小时长时间测试)
极限负载下的破坏性压力测试(如:C-D区间内进行测试)

Jmeter_第9张图片
Jmeter_第10张图片
与负载测试对比:
负载测试:主要目的是测试高负载情况下,对系统资源的消耗,是否会耗尽的问题(双11活动)
并发测试:主要目的是测试极短时间内,并发请求时,系统资源争抢的问题(抢红包、秒杀)

二、性能测试的指标

1)响应时间:

-指从客户端发起请求开始,到客户端接收到结果的总时间
-包括:服务器处理时间 + 网络传输时间
Jmeter_第11张图片

2)并发用户数:

-某一时刻同时向服务器发送请求的用户数
Jmeter_第12张图片

3)吞吐量:

Jmeter_第13张图片
QPS:
Jmeter_第14张图片
TPS:
Jmeter_第15张图片

4)点击数:

-所有的页面元素(如:图片、链接、框架等)的请求总数
-注意:
-点击数是请求数,不是页面上的一次点击

5)错误率:

-指系统在负载情况下,失败业务的概率
-注意:
-错误率是性能指标,是高负载下的失败业务的概率
-随机bug是功能bug,先解决随机bug才能进行性能测试

6)资源利用率:

Jmeter_第16张图片

三、性能测试的流程:

Jmeter_第17张图片
性能测试的核心:需求分析、性能测试执行、性能分析调优
需要大家掌握:性能测试执行

1)需求分析:

Jmeter_第18张图片

2)性能测试计划:

2.1) 测什么

  • 项目背景
  • 测试目的测试范围

2.2)谁来测

  • 进度与分工
  • 交付清单

2.3)怎么测

  • 测试策略

3)性能测试用例:

Jmeter_第19张图片

4)性能测试执行:

Jmeter_第20张图片

5)性能测试分析和调优:

说明:性能测试分析人员经过对结果的分析以后,如果不符合性能需求,则会提出性能bug,然后由开发人员进行后续的调优。

6) 性能测试报告:

Jmeter_第21张图片

性能测试小结:

1)性能测试的概述

性能测试的关注点:时间 和 资源
性能测试的概念:使用自动化的工具,模拟用户真实的使用场景,对软件各项性能指标进行测试和评估的活动
性能测试的目的:评估当前的系统能力; 出现性能bug后,优化性能;预测未来的性能需求是否满足
性能和功能的对比:

  • 焦点:功能(正向、逆向),性能(时间、资源)
  • 关联:先功能测试,再性能测试

2)性能测试的策略

基准测试:

  • 狭义上:单用户测试,记录性能指标
  • 广义上:设定基准线,后续软硬件条件发生变化时,再进行同样基准测试对比观察性能的变化。
    负载测试:逐步增加系统负载,找到满足系统需求情况下的最大负载量的测试。
    稳定性测试:在用户正常的业务负载下,长时间(1天 — 7天)测试,观察系统是否能稳定运行
    **并发测试:**极短时间内,发送大量请求,观察系统是否能并发执行
    压力测试:在高负载的情况下,观察系统是否有好的容错能力和可恢复能力。包括:高负载下的长时间稳定性压力测试 和 极限负载下的破坏力压力测试。

3)性能测试的指标

响应时间:客户端发起请求开始,到收到响应的总时间。包含:服务器处理时间 + 网络传输时间
并发(用户)数:同一段时间往服务器发送请求的用户数
吞吐量:单位时间内,服务器处理的客户端请求的数量。QPS和TPS
点击数:访问页面时,加载页面的各种元素(文本、图片、css、js等)的请求数量。
错误率:在用户负载情况下,失败业务的概率。 注意:与功能的随机bug区分
资源使用率:使用系统时,资源占用的比例。常见:CPU、内存、磁盘、网络

4)性能测试的流程

性能需求分析
性能测试计划和方案
性能测试用例
性能测试执行: 搭建性能环境、准备测试脚本、配置监控指标、执行测试脚本
性能结果分析和调优
性能测试的报告

四、性能测试工具

1)JMeter和Loadrunner工具对比:

Jmeter_第22张图片

2)jmeter环境搭建(重点):

安装JDK:
•下载JDK – 安装JDK – 配置环境变量 – 验证
安装Jmeter:
•下载Jmeter – 安装Jmeter – 配置环境变量 – 启动验证
注意点:
•下载JDK时,注意电脑操作系统是32位/64位
•下载Jmeter时,注意与本机安装的JDK版本匹配
•安装Jmeter时,安装路径中不能有中文/空格

3)jmeter的功能概要:

3.1)jmeter文件目录结构:

Jmeter_第23张图片

3.2)基本配置

Jmeter_第24张图片

3.3)jmeter元件及基本作用域(理解):

在这里插入图片描述

3.4)作用域的原则:

Ø取样器:核心,没有作用域
Ø逻辑控制器:只对其子节点中的取样器和逻辑控制器起作用
Ø其他元件:
•如果是某个取样器的子节点,则该元件只对其父节点起作用
•如果其父节点不是取样器,则其作用域是该元件父节点下的其他所有后代节点(包括子节点,子节点的子节点等)

3.5)元件执行顺序:

在同一个作用域(目录/级别/缩进)的不同元件的执行顺序:
配置元件 - 前置处理程序 - 定时器 - 取样器 - 后置处理程序 - 断言 - 监听器
在同一个作用域(目录/级别/缩进)的相同元件的执行顺序:
从上到下的顺序依次执行
Jmeter_第25张图片

正确:定时器1 - 请求1 - 定时器1 - 定时器2 - 请求2 - 定时器1 - 定时器3 - 请求3

3.6)Jmeter第一个案例:

Jmeter_第26张图片

3.6)Jmeter三个重要组件(重点):

线程组的介绍:

  • 控制Jmeter用于执行测试的一组用户
    线程组的分类:
  • Setup线程组:预测试操作,所有脚本之前执行
  • 普通线程组:执行测试用例,可以有1个或者多个(并行/串行)
  • Teardown线程组:测试后操作,所有脚本之后执行
    线程组的属性:
    参数介绍:
    Jmeter_第27张图片
    Jmeter_第28张图片
    案例分析:
    使用1个线程组,添加HTTP请求(百度)
    配置线程数为2,循环次数为3时,运行观察结果
    配置线程数为3,循环次数为2时,运行观察结果,对比不同
    分析:
    线程数代表虚拟用户数,用户数越多,负载越大
    循环次数代表运行时间,次数越多,运行时间越长

3.7)HTTP请求:

参数介绍:
作用:向服务器发送http及https请求
位置:选中线程组->右键->添加->取样器->HTTP请求
参数
Jmeter_第29张图片
案例一(使用HTTP请求路径来传递get请求参数):
(1)使用1个线程组,添加HTTP请求(百度),路径为:/S

  • 使用HTTP协议,GET请求方法,路径中添加参数为: wd = test,运行观察结果
    案例二(使用参数列表来传递get请求的参数):
  • 使用HTTPS协议,GET请求方法,路径中添加参数为: wd = test,运行观察结果
    案例三(使用参数列表来传递POST请求的form格式参数):
  • 使用HTTPS协议,POST请求方法,消息体数据中添加参数为: wd = test,运行观察结果
    案例四
  • 使用HTTP协议,POST请求方法,消息体数据中添加参数为: wd = test,运行观察结果
    Jmeter_第30张图片

3.8)查看结果树:

各部分的含义:
Jmeter_第31张图片

五、Jmeter参数化(重点)

定义:使用不同的测试数据,调用相同的测试方法进行测试
本质:实现测试数据与测试方法的分离。
实现方式:

  • 用户定义的变量 —— 全局变量
  • 用户参数 —— 为每个用户分配不同的参数值
  • CSV数据文件设置 —— 文件方式参数化
  • 函数 —— 随机数据
  • 数据库

1)用户定义的变量:

Jmeter_第32张图片

2)用户参数:

Jmeter_第33张图片

3)CSV数据文件设置:

Jmeter_第34张图片

4)函数:Jmeter_第35张图片

5)四种参数化方式的对比:

Jmeter_第36张图片

Jmeter测试工具小结

(1)JMeter基本使用

元件:配置元件、前置处理器、定时器、取样器、后置处理器、断言、监听器
作用域:

  • 取样器:是核心,本身无作用域
  • 逻辑控制器:只对子节点起作用
  • 其他元件:
    • 父节点是取样器,只对父节点起作用
    • 父节点不是取样器,对父节点的所有后代节点(子节点、子节点的子节点等)都起作用

执行顺序:

  • 同一个作用域的不同元件:配置元件、前置处理器、定时器、取样器、后置处理器、断言、监听器
  • 同一个作用域的相同元件:从上到下的顺序

(2)核心元件

线程组:

  • 分类:普通线程组、setup线程组、teardown线程组
  • 属性:线程数、ramp-up时间、循环次数、持续运行时间、延迟启动时间

HTTP请求

  • GET请求(在URL的路径中)
    • URL:协议、域名、端口、路径、请求方法GET、编码格式
    • 参数:
      • 在路径中添加参数。?参数名 = 参数值&参数名 = 参数值
      • 在参数列表中添加。格式:参数名,参数值
  • POST请求(在消息体数据中)
    • URL:协议、域名、端口、路径、请求方法POST、编码格式
    • 参数:
      • 在参数列表中添加(只能添加form格式)
      • 在消息体数据中添加(任意格式)
  • 查看结果树
    • 请求:请求行(URL)、请求体(参数)
    • 响应:状态码、响应体

(3)JMeter参数化

作用:使用不同的测试数据,调用相同的测试方法

  • 用户定义的变量:定义全局变量
  • 用户参数: 不同的用户使用不同的测试数据
  • CSV数据文件设置: 不同的用户,或者同一个用户的多次循环,都可以获取不同的数据
  • 函数:不同的用户,或者同一个用户的多次循环,都可以获取不同的数据,不需要提前准备数据。

问题描述:

当发送www.jd.com的http请求时,查看结果树看到的发送消息和HTTP取样器中配置的不完全一样?
Jmeter_第37张图片
原因分析:

  • 查看结果数中最外层HTTP请求的 请求信息和响应信息,应该与子节点中最后一个HTTP请求的请求
    消息和响应消息一致;
  • 配置的HTTP请求,应该与子节点中第一个HTTP请求的请求信息一致
    Jmeter_第38张图片
  • JMeter可以自动判断/处理响应状态码

六、Jmeter断言:

Jmeter_第39张图片

1)响应断言:

参数:
Jmeter_第40张图片
Jmeter_第41张图片

案例1:检查百度首页的接口响应中包含“百度一下,你就知道”

Jmeter_第42张图片

案例2:响应断言中,有多个待校验的测试数据

Jmeter_第43张图片

2)JSON断言:

2.1)参数

Jmeter_第44张图片

案例:
请求: http://www.weather.com.cn/data/sk/101010100.html
检查:让程序检查响应的JSON数据中,city对应的内容是否为“北京”
Jmeter_第45张图片

2.2)断言持续时间:

Jmeter_第46张图片
案例:
请求: https://www.jd.com
检查:让程序检查响应时间是否大于100毫秒

Jmeter_第47张图片

3)Jmeter关联:

Jmeter_第48张图片

3.1)正则表达式介绍:

正则表达式:就是一个公式,或者说一套规则,使用这套规则可以从任意字符串中提取出想要的数据内容

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

案例:

原始文本:
021-1234-1234
022-1234-1235
023-1234-1236
024-1234-1237
025-1234-1238
026-1234-1239
027-1234-1230
要求:匹配出 城市号、地区号、个人号码三组

正则表达式匹配:

(.*?)-(.*?)-(.*?)\n

结论:

  • 通过一个正则表达式可以提取出多组数据,每组数据设置对应的左边界和右边界即可
  • 每一组数据都可以有一个或者多个值

3.2)正则表达式提取器:

Jmeter_第49张图片
案例1:获取传智播客首页的title,并作为参数传递
Jmeter_第50张图片
**案例2:**获取传智播客首页的地址,把第5个校区地址作为参数传递(span为地址的校区)

响应中的地址格式显示:

地址上海市浦东新区航头镇航都路18号万香创新港

方法1:
Jmeter_第51张图片
方法2:
Jmeter_第52张图片
引用:以列表索引的方式来引用。格式:${变量名_索引} ,索引从1开始
Jmeter_第53张图片
案例3:获取传智播客首页的地址,把第5个校区地址作为参数传递(span为地址/后面带一、二、三)

地址格式1:

地址一昌平区建材城西路金燕龙办公楼一层

地址格式2:

地址上海市浦东新区航头镇航都路18号万香创新港

Jmeter_第54张图片
Jmeter_第55张图片

3.3)xpath提取器:

案例:
//a[@id='kw']: 在HTML页面中,找出a标签(有一个属性为id,且id的值为kw)
//a : 找出所有的a标签

Jmeter_第56张图片
案例:获取传智播客首页的title,并作为参数传递

Jmeter_第57张图片

Jmeter_第58张图片
案例:提取天气接口中的城市信息,作为参数在访问百度首页时传递
Jmeter_第59张图片

4)JMeter属性:

Jmeter_第60张图片
Jmeter_第61张图片
案例
Jmeter_第62张图片

七、自动录制脚本

1)原理:

Jmeter_第63张图片

2)jmeter脚本录制:

1.添加HTTP代理服务器,并进行配置

  • 加HTTP代理服务器:测试计划(右键)->非测试元件->HTTP代理服务器
  • 配置代理服务器的参数
    Jmeter_第64张图片

2.开启windows操作系统的浏览器代理

Jmeter_第65张图片

  1. 启动代理服务器,开始录制

Jmeter_第66张图片

  1. 在浏览器页面中进行操作,成功后,就能在JMeter当中看到抓取到的接口请求了。

Jmeter_第67张图片

练习:
设置过滤规则,录制tpshop的登录脚本,运行脚本观察测试结果

当使用代理的过程中,发现抓不到包,几个可能的情况

  • 过滤规则设置有问题
  • 重启Jmeter代理服务器或者重启Jmeter
  • 换浏览器来使用(Chrome、IE)
  • 检查PC机中的代理设置是否处于可用状态
  • 拔掉网线,抓包

Jmeter性能测试小结

(1)JMeter断言

响应断言

  • 作用:在任意响应格式中,都可以使用
  • 配置:
    • 实际要校验的字段
    • 校验规则
    • 预期结果

JSON断言

  • 作用:响应格式为JSON数据时,使用JSON断言
  • 配置:
    • JSON路径
    • 预期结果

持续时间断言

  • 作用:检查响应时间是否超出预期时间
  • 配置:预期响应时间

(2)JMeter关联

概念:请求依赖关系,一个请求的响应作为另一个请求的参数进行传递
正则表达式提取器

  • 作用:可以针对任意格式的响应数据进行提取
  • 配置:
    • 变量名
    • 正则表达式:左边界(.*?)右边界
    • 模板:$n$ 。提取第几个括号的(提取第几组值)
    • 匹配数字:1表示第一个值,-1表示全部值,0表示随机

XPath提取器

  • 作用:可以针对HTML格式的响应数据进行提取
  • 配置:
    • 变量名
    • xpath表达式。//标签,//标签[@属性名=属性值]
    • 匹配数字:1表示第一个值,-1表示全部值,0表示随机

JSON提取器

  • 作用:可以针对JSON格式的响应数据进行提取
  • 配置:
    • 变量名
    • JSON路径。格式:$.键名.键名

JMeter属性

  • 作用:跨线程组关联,跨线程组实现数据的传递
  • 函数及调用:
    • 保存JMeter属性:setProperty —— 放入到BeanShell取样器中执行
    • 读取JMeter属性:Property —— 放入到第二个线程组的HTTP请求中
  • 步骤:
    • 添加第一个线程组
    • 添加HTTP请求
    • 添加JSON/Xpath/正则表达式提取器 —— 提取数据
    • 添加BeanShell取样器 —— 执行setProperty函数
    • 添加第二个线程组
    • 添加HTTP请求 —— Property函数读取JMeter属性
    • 查看结果树

(3)JMeter脚本录制

原理:JMeter作为代理服务器,所有请求和响应数据都会经过JMeter,Jmeter再还原为脚本
步骤:

  • 添加代理服务器,并配置
    • 端口
    • 目标控制器
    • 过滤条件
  • 在PC上设置浏览器代理,指向JMeter代理服务器
  • 启动JMeter代理服务器
  • 在浏览器上操作并还原出脚本

八、Jmeter直连数据库

Jmeter_第68张图片

1)Jmeter直连数据库步骤:

1.1)添加MySQL驱动jar包

  • 方式一:在测试计划面板点击“浏览…“按钮,将你的JDBC驱动添加进来
  • 方式二:将MySQL驱动jar包放入到lib/ext目录下,重启JMeter

Jmeter_第69张图片

1.2)配置数据库连接信息

  • 添加方式:测试计划 --> 线程组–> (右键添加) 配置元件 --> JDBC Connection Configuration
    Jmeter_第70张图片
    Jmeter_第71张图片
    案例1
    连接tpshop商城数据库获取商品名包含:小米手机5的商品id
    Jmeter_第72张图片

需求
1、在tpshop首页中搜索商品名称“长虹(CHANGHONG) 49A1U 49英寸双64位4K超清智能网络LED液晶电视”,
请求URL:http://127.0.0.1/Home/Goods/search.html
请求方法:GET
请求参数:q=
2、在搜索的响应数据中检查是否有该商品对应的商品链接:/Home/Goods/goodsInfo/id/65.html
(id:65需要通过数据库查询返回,才保证每次都是有效的)

编写JDBC脚本步骤(搜索指定商品,在返回结果中检查是否包含指定商品的ID的详情URL)
1.添加线程组
2.添加 JDBC Connection Configuration
3.添加 JDBC request
4.添加 HTTP请求 - 搜索商品
5.在搜索HTTP请求下,添加响应断言,检查响应结果中的字符 是否包含 **商品URL。引用格式:${变
量名_索引}
6.添加查看结果树

2)逻辑控制器:

2.1) 如果(if)控制器:

Jmeter_第73张图片
案例:
1、使用‘用户定义的变量’定义一个变量name,name的值可以是baidu或itcast
2、根据name的变量值实现对应网站的访问

Jmeter_第74张图片

2.2) 循环控制器:

案例:
(1) 循环访问百度10次Jmeter_第75张图片
Jmeter_第76张图片
(3)思考:线程组属性可以控制循环次数,那么循环控制器有什么用?
不同点:线程组的循环次数对线程组下的所有HTTP请求有效,循环控制器的循环次数对子节点下的
HTTP请求有效
关联:循环控制器次数为M,线程组循环次数为N,

  • 循环控制器下的请求运行:M * N 次
  • 线程组下,非循环控制器下的请求运行:N次

2.3) ForEach控制器:

Jmeter_第77张图片
与用户定义的变量配合使用(案例1):

案例1需求
1. 有一组关键字 [hello,python,测试],使用用户定义的变量存储
2. 要依次取出关键字,并在百度搜索,例如:https://www.baidu.com/s?wd=hel

步骤:
1.添加线程组
2.添加用户定义的变量

Jmeter_第78张图片
3.添加ForEach控制器
Jmeter_第79张图片
4.添加HTTP请求-百度

Jmeter_第80张图片
5.添加查看结果树

与正则表达式配合使用(案例2)

案例2:
1. 访问传智播客首页http://www.itcast.cn,获取首页中的地址信息,并全部保存下来
2. 要依次取出地址关键字,并在百度搜索,例如:https://www.baidu.com/s?wd=地址

Jmeter_第81张图片

  • 注意:结束循环字段可以设置为0,自动读取到最后一个

3)定时器:

3.1)同步定时器:

Jmeter_第82张图片

案例:1、模拟100个用户同时访问百度首页,统计各种高并发情况下运行情况

使用同步定时器的操作步骤?
1.添加线程组,设置线程数为n
2.添加HTTP请求
3.添加同步定时器

  • 设置并发线程数:同时发送请求的虚拟用户数
  • 设置超时时间:
    Ø建议设置:不设置的话,若没有达到设置的线程数会一直死等
    Ø不能设置太小:等待时间后还没达到设置的线程数,会释放已到达的线程

4.添加查看结果树
5.添加监听器-聚合报告

3.2) 常数吞吐量定时器:

案例:
(1)一个用户以 20QPS (20 次/s) 的频率访问百度首页,持续一段时间,统计运行情况.
(2)2个用户针对 (服务器的QPS要求:20QPS (20 次/s)) 的频率访问百度首页,持续一段时间,统计运行情况.
Jmeter_第83张图片

3.3) 固定定时器:

案例:
(1)IHRM系统登录错误3次后,锁定1分钟,1分钟后重新输入正确的用户名密码登录成功
步骤:
添加线程组
添加HTTP请求1 - 错误1次
添加HTTP请求2 - 错误2次
添加HTTP请求3 - 错误3次
添加HTTP请求4 - 正确用户名密码
在HTTP请求4下,添加固定定时器
添加查看结果树

Jmeter_第84张图片
注意:

  • 固定定时器,必须添加在需要等待的HTTP请求的子节点下
  • 在HTTP信息头管理器中,修改HTTP请求的头域

Jmeter_第85张图片

你可能感兴趣的:(系统测试技术,jmeter,服务器,java)