性能测试
- 思维差异
- 功能测试、自动化测试
- 输出: 找bug 预期结果与实际结果进行比较
- 隐藏的前提:模拟都是1个用户的操作
- 性能测试
- 不是模拟1个人,模拟多个人同时,
- 关注?
- 接口服务器性能测试中,一定是多个人同时操作,才是性能测试
性能概念
性能指标
负载测试
50tps: 服务器每秒能处理50个事务
50 t/s * 60 * 60 = 18w 300tps
18w * 8h = 144w
内容回顾
性能测试:通过工具,模拟一定量的并发用户数,向服务器发起请求,获得我们性能指标
负载测试: 逐步增加并发用户数, 获得最大并发用户数的拐点区间
?拐点区间: 1、有没有报错
2、响应时间
3、tps下降
压力测试: 使用一定量的并发用户数,持续比较长时间向服务器发起请求,查看服务器的稳定性
? 一定量:访问 小于最大并发用户数 20% 或 80% maxThreads
内容
TPS: 服务器每秒处理事务数 服务器的综合处理能力
吞吐量:网络每秒能通过的事务
rps: 请求,每秒用户请求率 发起方
qps: 每秒查询率, 服务器的查询
? 在企业中,如果没有严格区分,是把1个事务,当做只查询1次,但,实际请求可能是 1事务: n个查询
hps:hitpers 每秒用户点击率 页面点击
容量测试
在性能测试时,如果数据库的数据量级是不一致的,性能指标值,也可能存在差异。 在做性能测试时,数据库的数据量级一定要保证一致。
? 生成的数据库数据量级 百万级
测试用的环境,独立性能测试环境, 不超过万
性能测试: 需要自己搭建性能测试环境,独立环境
性能测试,不能使用功能测试环境、自动化测试环境、验收、生成环境都不能用。需要自己搭建独立环境
自己搭建:
独立环境:真正的性能测试环境,机器资源配置是和生产完全一样(硬件配置一样、数量一样、网络一样、架构参数一样)
网络:网络架构,网络基础,性能测试,不能使用无线网络,也不要去使用vpn等桥连,尽可能使用局域网
-
性能测试并不是想做就做?
可测性:反复沟通确定性能指标 -
性能测试流程
- 性能测试准备
- 搭建性能测试环境
- 性能测试脚本开发
- 性能测试脚本执行
- 结果分析与调优
- 测试报告与结果跟踪
性能课程需要的知识面
服务器的发展
台式机器 ---> 刀片机有了n个操作系统后,
vmware虚拟技术:vmware、
虚拟出操作系统
理论上1个刀片机安装1个操作系统之后,可以虚拟出n多个操作系统
1:n操作系统
1个刀片机 n个刀片机
08-15年左右,企业中服务器为虚拟机非常流向
用vmware 虚拟技术虚拟的操作系统,是非常消耗本机的硬件资源
用vmware虚拟技术虚拟的机器,能产生多个操作系统,更大化使用本机资源,但是,vmware也非常消耗资源,会使用大量的磁盘空间和cpu、内存资源。它对我们本机的性能是有影响,但是因为虚拟了多个操作系统,可以更大化利用空间。
云服务器
也是虚拟技术发展的产品,虚拟操作系统(比较完整的操作系统)
docker
也是linux操作系统,定制化, 缩减版的操作系统(namespace、unionFS、cgroup)
应用发展
os系统: linux(常用命令)
常用名称
配置环境变量
防火墙、网络
linux的性能分析命令(top、ps、netstat、)
cpu
OOM
jvm 前面这些内容,快速浏览,暂时不要深入研究
应用的发展
- 最开始,所有的代码都在一个工程下面,生成一个项目包,随着项目开发,代码越来越多,要运行这个工程的硬件资源配置就要越来越高
- 然后,就是拆项目和数据库Oracle sqlserver access mysql postgrasql、文件服务ftp、oss器、 项目服务器apache、tomcat、springboot、 springcloud、docker 、集群nginx
- 数据库: 主从、非关系型(mongodb、memcache、redis)、时序数据库(influxdb\ prometheus)
- 拆项目:前 后端(最初)中台, 后台逐步模块化,微服务
环境的搭建
ova文件
? vmware + 操作系统iso ===导出 ova文件 开机即可使用
安装vmware软件、virtualbox: 一定要记得 重启动电脑
? 查看‘网络连接’ 里面一定要有 vmnet8 必须是启用
Vmware工具,可以在windows、linux、mac中安装( 版本可以是12以上都可以)
vmware file > 打开 找到ova文件 填写名称,选择路径(不要使用默认的c盘路径)
第一次会报错,没有关系,点击重试
-
导入成功之后: 编辑虚拟机设置
- 根据自己的机器配置,修改 内存大小,cpu的数量
- 网络适配器,vmware一定要选择 NAT 网络 virtualbox选择桥接网络
-
开启虚机机:
- 账号密码: root 123456
- 这台机器的jdk版本是1.7 所以,千万不要去改这台机器的jdk也不要拿这台机器做课程后面的练习。
- 项目是用 tomcat8 /opt/apache-tomcat-8.x.x
- 没有开机自启动,所以需要自己手动去启动tomcat
- 项目的数据库用的 mysql docker方式安装的mysql
-
启动机器:
-
使用远程连接客户端工具
- xshell crt、finalshell、putty、dos终端
工具环境搭建
-
安装jmeter
- Apache 托管的开源java工具
- 接口测试、自动化测试、性能测试
- java要运行依赖什么?
- jre java 运行环境
- jdk java开发工具包,一般是包含jre
- 我们课程中,除了kyj项目是jdk1.7 其余所有地方用到jdk的都是1.8
- 查看jdk版本
java -version 正常返回jdk版本,但是不代表你的系统就配置JAVA_HOME环境变量- JAVA_HOME
-
jmeter安装
-
文件路径:
- bin 启动 配置文件
- lib jar包 工具自身jar, 以及第三方jar
- docs 文档 用于jmeter进行二次开发调用的api 接口文档
- printable_docs 离线帮助文档
- extras 扩展 CICD 性能测试持续集成
-
gui界面
- 一切都在右键掌握之中
- 测试计划: 工作中测试计划: 什么时间什么人做什么事情
- 万物的根, 脚本的根文件
- 元件
- 线程组: 接口、自动化测试时,基本不会去改动
- 性能测试,这个是用于进行性能场景设计的
- 线程组:进行性能场景设计
- setup线程组
- teardown线程组
- 配置元件
- 监听器
- 就是侦探 就是摄像头,性能结果进行监控,展示结果数据
- 不同的元件,是从不同的角度,展示结果数据
- 取样器: 根据不同的协议,使用不同的取样器编写脚本
- 逻辑控制:
- 前置:
- 后置: 对取样器进行控制
- 定时器
接口文档: 用户使用易捷支付平台的 接口文档 不是管理人员的接口问题
jmeter写脚本
万能法
先把项目启动
打开我们项目接口文档
接口文档: 一般是开发
特别注意事项:
当你的接口请求参数为json格式时,**一定**要写请求头,请求头中**一定**要有 Content-Type: application/json
如果没有这个信息,100%报错,不局限于jmeter
衍生: http**请求**包括哪些部分
请求行
请求方法,请求地址URI
请求头
Content-Type
cookie
User-Agent
空一行
请求体
参数: 表单
消息体数据: json 、xml
json格式
声明: 我们的项目接口地址URI中只有一层/app
写脚本
- 测试计划上右键, 添加 线程组
- 线程组上右键,添加 取样器> http请求 (http协议簇)
- 线程组上右键,添加 监听器 > 查看结果树
一个最简单的jmeter脚本,包括,线程组、取样器、监听器
线程组: 性能测试中用于场景设计的,写脚本阶段不用改动
取样器: 根据不同的协议,编写不同的脚本。 填空
监听器: 调试脚本时使用,性能测试执行时,禁用
? 不管哪种监听器,都是对结果数据进行不同维度的展示,这些展示,是需要消耗本地资源的
8080端口,是tomcat的默认端口
http协议的默认端口:80
https协议默认端口: 443
jmeter的默认保存路径,jmeter的bin文件夹
请注意:
1、当请求体为json, 一定要有请求头 Content-Type:application/json
2、json格式有问题
3、协议: 当协议为http时,可以不写,如果是https,那就必须写
4、服务器名称或IP:不能带有/
5、路径: 不要带域名或ip,和端口
? 路径开头,用/
? 不要带有空格, 带有空格请求URL %20 urlencoded编码
? URI 资源地址
? URL: 带domain
6、内容编码:utf8
? 请求内容出现乱码处理方法:
? 1、内容编码: utf8
? 2、请求头,;charset=utf-8
? 3、请求体为参数类型:勾选参数“编码” 编码:urlencoded编码
? 在参数值为 非字符(汉字、特殊符号) 我都需要勾选编码
? 给大家的建议: 参数值,不管什么类型,都建议勾选编码
? 响应内容出现乱码处理方法:
? 需求修改jmeter.properties中sampler.result.encoding
? 不是简单的设置为utf8、 gbk、gb2312、big5
? 同一个接口,用postmen请求,响应是正常,用jmeter请求响应中文乱码?原因是: jmeter的编码是根据操作系统编码。
? 在国内,中文windows系统的字符集编码是gbk 936, mac系统中文编码utf8
7、参数、消息体数量 选择
? 当我们的请求接口文档中说,请求体为json格式,那么我们就选择用消息体数据,来写json, soap=http+xml
? 参数: 我们的请求体,form-data
? Content-Type: application/x-www-form-urlencoded 或者不指明请求体类型,get
8、自动重定向:不会显示中间重定向过程,无法从过程中,提取信息
? 跟随重定向:会自动显示重定向过程,能从过程中,提取想要信息,用于后面接口请求
使用keepAlive:保持连接, 长连接,
因为现在用http协议版本为1.1 就是长连接,所以,默认勾选keepAlive,但是在性能测试中,我们会根据需要,去掉这个勾。
写脚本注意事项
-
协议: http,https必须谢 -
域名或ip: 不能有/ -
请求方法: 看清楚接口文档 -
路径: 不要把 域名和ip再次
- 路径中,前后空格要看清楚 %20 空格的urlencoded编码
-
内容编码: utf8
- 请求体编码控制:
- 1: 内容编码
- 2: 消息头
- 3: 参数, 勾选编码 urlencoded
- 响应乱码:
-
请求体:
-
新内容:
-
上部分内容,再扩展
- 没有接口文档?
- 抓包: F12 、fiddler、wireshark、Charles
- 第三接口:api接口
- swagger:
写脚本方法扩展
录制脚本:
badboy: 曾经很流行,现在已经不维护,已经被遗弃
代理录制: 用于脚本参数比较多,或者用手动编写脚本,一时半会写不出来。
代理服务器: 自己启动一个代理服务器
本地,要使用代理服务器的ip和端口,使用自己启动的代理服务器
1、添加线程组
2、测试计划 > 非测试元件 > http代理服务器
ip就是你自己电脑的ip,port是可以修改,默认8888
目标控制器,**一定要修改 修改为** 测试计划>线程组
添加过滤器
3、启动代理服务器时,会出现一个证书的弹窗
如果要抓取https信息时,就必须使用证书
4、本地浏览器使用 代理服务器上网
脚本功能增强
关联: 前面接口的响应信息,有动态值,作为后续接口的参数参数
我想把手机号码,发生变化:
变量: 用户定义变量,用户参数
**用户定义变量**:
配置元件、测试计划
**全局变量**:
作用域:作用于整个‘**测试计划**’
<font color="red">在启动运行时,获取一次值,在运行过程中,不会动态获取值,在运行过程中,值一直都不变。</font>
**用户参数**:
前置处理器
**局部变量**
作用域: 作用于当前线程组或当前的取样器
<font color="red">在启动运行时,获取一次值,在运行过程中,还会动态获取值。</font>
jmeter的函数: 方法
1888888${__Random(1000,9999,)}: 字符串的连接
使用用户定义变量,设置5循环 register + login: 1次register-success 5次login-success
使用用户参数,设置5循环 register + login: 5次register-success 0次login-success
迭代: 一个线程组下所有的接口,全部执行完1次,才算1个迭代
用户参数
-
每次迭代更新一次 -
函数:方法
- 双下划线开头
- 函数名称,严格区分大小写
- 重要的函数
- ${__counter(,)} 计数器
- ${__dateTimeConvert(,)} 时间格式转换
- ${__digest(,)} 加密 简单加密
- ${__intSum(,)} 整数相加函数
- ${__P(,)} 获取属性函数
- ${__property(,)} 获取属性函数
- ${__setProperty(,)} 设置属性函数
- ${__Random(,)}
- ${__RandomString(,)}
- ${__threadNum} 获取线程号函数
- ${__time(,)} 获取当前时间戳函数
- ${__timeShift(,)} 数据格式化
- ${__V(,)} 拼接函数
用户定义变量 vs 用户参数
用户定义变量
全局变量: 可以跨线程组
在启动时,获取一次值,在运行过程中不会动态获取值
用户参数
局部变量: 不能**直接**跨线程组
在启动时,获取一次值,在运行过程中,还会动态获取值
- 作为功能测试、自动化测试,非性能测试时,可以把接口写在一个线程组下面
- 在性能测试时,可能会因为不同的需求,把接口写到不同的线程组中
- 在性能测试中,多线程组脚本,有个难题,跨线程组传参
- 我们采用“用户属性”
- 函数
函数
======
${__V(,)} 拼接函数
属性
- jmeter的属性,是jmeter工具自身的标签
- 属性:
- jmeter属性:
- 静态属性: propertites文件中
- 动态属性: setProperty 函数进行设置, P porperties 函数获取属性
- 系统属性: 不可改变
jmeter中,做功能测试、自动化测试时,你可以使用 Beanshell元件,
但是,在性能测试中,能不用,坚决不要用带有任何Beanshell。
如果你要写java脚本,也不要使用Beanshell任何元件,JSR223 开头元件
jmeter可以支持: java、jython、python、groovy、js。
类似: var_1 var_2 前缀相同,后缀是递增数字的变量名称,常见于 jdbc从数据库中获取数据时。
select name from table where id like ‘123%’; —结果可能有多条数据
这个脚本就会返回多个name值, 我用table_name这个变量来接收值,table_name_1,table_name_2…
${变量名称} ===得到变量的值
${__V(前缀_可变后缀)} ===== 得到是这个 “前缀_可变后缀” 变量名值
${__P(属性名称)} ====得到的是 属性名称的值
特别注意事项:
1、查看结果树中,
? 绿色>只是代表网络成功,不代表结果是否准确;
? 红色,代表失败,失败的原因有千万,具体是那种,需要具体排查
2、查看结果树为红色,不要只截图 取样器结果
? 需要截图: request-body + request headers, response-body
3、最重要点: 查看结果树中的显示顺序是,根据收到响应的先后顺序显示
jmeter中取样器的执行顺序:在没有逻辑控制器控制时,顺序是从上往下,不管多少人并发,每个线程用户都是从上往下执行。
会出现 取样器的执行顺序与 查看结果树中的显示顺序不一致。
- 响应提取: response提取
- json提取器
- 当确定响应信息为json格式时,我们优先选择用 json提取器提取我们响应的信息
- $.根路径.二级路径 json提取式 ----绝对路径写法
- $…末梢节点名称 -----相对路径写法, 推荐
- 在取样器上右键 > 后置处理器 > json提取器
- 重点:
- 正则提取器
- 正则提取式: 左边界(正则式)右边界 万能正则式: .*?
data date
|