性能测试是通过自动化的测试工具模拟多种正常、峰值以及异常负载条件来对系统的各项性能指标进行的测试。
https://jmeter.apache.org/
性能测试的分类
1、负载测试:系统运行有效的情况下,不同负载下的服务器性能
2、压力测试:增加负载,直到系统运行失效
3、稳定性测试:测试系统长时间运行的稳定性
4、基准测试:测量和评估系统的性能指标的一项活动,通过基准测试可以建立一个基本的性能水平,以供后续进行参考
例子:主要用于日常中的产品的【跑分】
5、容量测试:测试服务器最大的容量,即用户数最大用户数的容量
6、配置测试:各种的软件或硬件的配置测试
7、从测试手段上:
1)单用户测试
2)并发测试:一般用于针对服务器的性能测试
负载测试是系统运行有效的情况下,不同负载下的服务器性能 ;压力测试:增加负载,直到系统运行失效。
性能测试的流程
1、分析性能需求:
1)哪些功能需要进行性能测试:
- 系统主要的、核心的功能
- 用户访问量较大的功能,即表示服务器的负载越大 例如:双十一秒杀、春节抢票、疫情抢菜等
- 涉及数据量大的功能,即海量数据
- 业务复杂的功能, 例如理财的数据跑批结算
- 其他的特殊场景, 例如上海的沪牌拍卖
2)需要关注常见的性能指标:
并发数:
(1) 同一个时间段内向服务器发送请求的用户的数量,分为2种:普通并发(可以由现后顺序)、极限并发(无现后顺序,同一个时间点一起发送请求);
(2) 性能指标是根据性能需求确定。
响应时间:
- 用户进行操作开始,直到收到服务器返回的响应为止,总共时间称为响应时间 例子:一般网页的响应时间 在 2-5-8秒
事务成功率:
- 多个操作组成事务,事务中的操作共同成功或失败
- 所有的事务中成功的事务的比例 例子:登陆事务成功率>95%
- 资源使用情况:系统运行占用CPU、内存、网络宽带等
- 其他:吞吐量、TPS、QPS等
- 吞吐量:单位时间内产生的样本量
- TPS:每秒的事务数
- QPS:每秒的请求数
没有性能需求怎么办?
根据产品的历史数据,我们可以得出他的性能需求,可以得到
没有历史数据?
可以采用探索式的测试,数据量按照从小到大原则,先使用500条数据探索,若都成功,则再加大数据量(比如1000或10000的数据量)再次进行探索
2、制定测试计划
3、设计、编写测试用例:分为2种场景
- 单场景测试用例
- 多场景测试用例
4、搭建测试环境
5、准备测试数据:
性能测试的数据可能远远多于功能测试。
性能测试数据分为2种:
1)并发数据:并发测试中需要使用的数据
2)铺底数据:(对系统进行填充的作用)对预估系统使用一段时间后的数据量,进行填充的数据
造数据的方法:
1)即复制和使用生产环境的数据。优点:使用最方便最真实;缺点:造成用户信息的泄露
2)使用自动化工具运行,生成数据
3)使用专门的造数据的工具 例如:data factory
4)访问数据库造数据
6、编写测试脚本:
(光写用例是不够的),可以使用Jmeter工具
7、执行测试,分析结果,编写测试报告
1、jmeter
2、jdk :版本:8+
1)JAVA_HOME ,填写jdk路径
2)path:jdk 路径下的/bin目录
主要元件:
1、测试计划:每个脚本文件只有一个测试计划
2、线程组:模拟用户
3、取样器:模拟用户请求
4、前置处理器:在请求前进行处理,即预请求阶段
5、后置处理器:在收到响应后进行处理
6、断言 Assertions:作用是检查结果
7、监听器 Lis…:查看样本的信息和结果
8、配置元件Config Element:包括变量定义、参数化等
9、逻辑控制器Logic Controller:
10、定时器Timer
例如访问百度————
名称:http请求
(web服务器)协议:https
服务器请求或IP:www.baidu.com
http请求:get(F12 抓包看下请求时get)
路径:/(若查询显示由路径,则需要填入真实路径)
1)查看结果树——显示每个样本的详细信息,包含取样器的结果、请求、响应数据)。
1)用户定义的变量:全局变量、调用变量的值 ${变量名}
2)http请求默认值:可以设置http请求参数默认值,供其他请求使用
3)http信息头部管理器:可以添加、管理http请求的头部中的信息
4)http cookie管理器:在请求中添加、管理cookie
检查样本中的响应时间
- json:标识、标志,是javaScript对象的标识,是语法中的一块内容
- {key:value,…}
- " " —— 字符串
- [] 数组(列表)
- json path:用来描述json文档中节点的路径,文本框内是填写json节点的路径
基本语法:http://www.e123456.com/aaaphp/online/jsonpath/
log.info("今日小雨转中雨");
vars.put("v1","晚上下雨");
脚本中的可用的内置对象 prev,prev表示样本的结果
if 条件:
语句
---------------------------
if 条件:
if 条件
语句
-----------------------------------------------------
关于js的写法:
if(v5=="20230413"){
}
if(v5=="20230412"){
1
2
v5="20230415"
3
}
2)吞吐量控制器:
- based on,☞表示百分比
- PercentExecutions,表示可在吞吐量中填写具体的百分比的数值
- TotalExecutions,表示总线程数
- 吞吐量:指目标值
- 吞吐量控制器可以在控制器下的元件执行的线程数,一般作用在多功能场景的测试
双循环结构--
for:
for
----------------------------------------------------------
for 2:
if :
1
2
for
1,2,3
仅在循环的第一次执行下面的元件操作,作用域是针对所在层级的循环
事务 transaction的概念:指一些列操作的集合,事务时是原子性的,在事务中的操作应该是成功或者失败的
generate parent sample —— 勾选情况下,表示聚合报告中仅按事务进行统计
作用于:一般用于极限并发
1)模拟用户组的数量:每个的用户数,一起进行极限并发
2)超时时间:最大等待时间,时间超时后则不再等待,线程直接执行
作用:后置处理器--提取器:边界提取器,json提取器,正则表达式提取器,jsr223提取器等
例子:seafile的获取token 的接口,可以使用提取器来提取响应中的token值
通过调用变量的值,来使用上游接口的内容 ${变量名}
例子:创建seafile的接口,在请求的头部中使用token值
数据驱动的测试、关键词驱动、事件驱动
测试用例的步骤不变,但测试的数据结果发生改变,即为数据驱动的测试
例子1:
在seafile中,测试创建不同的名称的资料库,可以包括中文、数字、英文、特殊符号、空格、空等资料库
例子2:将资料库的名称进行参数化,即把资料库名称的值设置为变量
例子3:使用jmeter元件创建变量并赋值
1)配置元件----用户定义的变量
2)前置处理器----用户参数
3)配置元件----csv数据文件设置
4)使用函数助手,调用函数:例如使用random随机函数生成随机的值
jmeter工具中如何直接访问数据库?
答:可以用于测试项目数据库服务器的性能;使用mysql,先创建链接,再发送请求
使用MySQL,下载驱动文件放置的路径,创建jdbc连接,再通过取样器向数据库发送请求(取样器---jdbc request),可以用于测试项目数据库服务器的性能
1)使用java数据库的链接,可以网上先找到驱动mysql driver下载,将驱动放置到jmeter的目录下后,启动jmeter,
2)在线程组中添加配置元件----JDBC,JDBCDriverclass com中找到mysqljdbeDriver,在Variablelameforcreatedpool 必须填写名称,在 DatabaseURL 中填写自己历史已创建的数据库的名称(jdbc:mysql://localhost:3306/studysql277),同时填入username、password
3)在线程组中添加取样器----JDBC请求,填入步骤2的(必须填写名称),在文本编写
select * from student表;运行查看响应结果即可。
在jmeter的bin目录中输入CMD打开,再输入jmeter -n即可显示信息
jmeter图形界面可以用于测试脚本的编写和调试
创建是使用图形模式,执行不使用图形模式:因图形模式下本身有占用资源,会对测试产生影响,命令行(CLI模式)可以用于测试的执行:命令行模式本身资源占用少,可以通过其他工具调用命令进行执行
jmeter -n -t [测试脚本] -l [测试结果日志文件] -e -o [html文档测试报告]
练习:
1、创建和调试脚本:seafile,获取token,创建资料库,查看资料库列表;
测试100并发下(每秒增加5线程),创建资料库事务,查看资料库事务,响应时间:(预期:响应时间90% <3秒、事务成功率>=95%)
2、执行脚本:CLI模式执行脚本,生成测试结果文件,以及测试报告
1、为了解决单台测试电脑能产生的线程数有限,可以通过多台电脑进行分布式的性能测试;
2、要先进行jmeter配置
server.rmi.ssl.disable=true
启动服务