目录
一、性能测试理论知识
1、性能测试的概念
性能测试是通过自动化的测试工具模拟多种正常、峰值以及异常负载条件来对系统的各项性能指标进行测试。
2、性能测试的类型
基准测试:也是单用户测试,测试环境确定以后,对业务模型中的重要业务做单独的测试,获取单用户运行时的各项性能指标,为多用户并发测试和综合场景测试等性能分析提供参考依据。
负载测试:对系统不断增加压力或增加一定压力下的持续时间,直到某项或者多项指标到达临界值(此时临界值仍满足我们的要求性能值)。
稳定性测试:给系统加载一定业务压力的情况下,使系统运行一段时间,检测是否稳定。
压力测试:在强负载下的测试,查看系统在峰值情况下是否功能隐患,系统是否具有良好的容错能力和可恢复能力。
并发测试:并发测试(绝对并发),是指在极短的时间内,发送多个请求,来验证服务器对并发的处理能力。
3、性能测试的指标
响应时间:指用户从客户端发起一个请求开始,到客户端接收到从服务器返回的结果,整个过程所耗费的时间。
并发(用户)数:某一时刻同时向服务器发送请求的用户数。
吞吐量:指的是单位时间内处理的客户端请求数量,直接体现软件系统的性能承载能力。
单位:每秒事务数(TPS)、每秒查询数(QPS)
补充:事务,即业务,一个事务可以对应一个请求/多个请求。一个事务对应一个请求时:TPS=QPS,一个事务对应n个请求时:QPS=n*TPS
点击数:指客户端向服务器发送请求时,所有页面资源元素(如:图片、链接、框架css、js等)的请求总数量。
注意:
-只有web项目才有此指标
-点击数不是页面上的一次点击
错误率:指系统在负载情况下,失败业务的概率。错误率=(失败业务数/业务总数)*100%
注意:
-大多系统都会要求错误率无限接近于0
-错误率是一个性能指标,不是功能测试里的随机bug
资源利用率:是指系统各种资源的使用情况,一般用“资源的使用量/总的资源可用量*100%”形成资源利用率的数据。
二、Jmeter性能测试实战(初步)
下载安装完Jmeter后可以切换中文:
步骤:
1、添加线程组
鼠标右键添加线程组:
填写要用到的参数:
线程数:Jmeter中用线程数来模拟用户数,有多少个线程数在这里就表示有多少个用户数。
Ramp-up时间(秒):表示要在多少时间内启动指定数量的线程数。
循环次数:每个线程发送请求的次数;如果勾选了“永远”,表示所有线程会一直发送请求,直到停止运行脚本。
调度器:压测的时候无法控制执行的时间,需要用到调度器设置线程组启动的开始时间和结束时间(配置调度器时需要勾选循环次数为“永远”)
2、添加HTTP请求
右键线程组->添加->取样器->HTTP请求
根据接口文档填写:
3、添加查看结果树
右键HTTP请求->添加->监听器->察看结果树
4、添加断言
右键HTTP请求->添加->断言->响应断言
举例:响应断言校验返回的文本中是否包含搜索词,添加"name":"北京"(这是根据预期返回结果的响应数据来填写)到测试模式中:
右键HTTP请求->添加->监听器->断言结果
这时再运行一次就可以看到断言结果啦
6、添加聚合报告
右键HTTP请求->添加->监听器->聚合报告
查看聚合报告:
聚合报告参数详解:
Label:每个JMeter的element的Name属性,例如HTTP Request的Name;
样本(Samples):发出请求数量;例如模拟20个用户,循环100次,所以显示了2000;
平均值(Average):默认情况下是单个Request的平均响应时间,当使用了Transaction Controller(事务控制器) 时,也可以用Transaction的时间,来显示平均响应时间 ,单位是毫秒。
中位数(Median):50%用户的响应时间小于该值;
90%百分位(90%Line):90%用户的响应时间小于该值;
95%百分位(95%Line):95%用户的响应时间小于该值;
99%百分位(99%Line):99%用户的响应时间小于该值;
最小值(Min):最小响应时间;
最大值(Max):最大响应时间;
异常%(Error%):错误率=错误请求的数量/请求的总数;
吞吐量(Throughput):默认情况下表示每秒完成的请求数(Request per Second);
接收KB/sec(Received KB/sec):每秒从服务器端接收到的数据量;
发送KB/sec(Sent KB/sec):每秒发送到服务器端的数据量。
三、参数化
(继续用上面接口示例演示)
1、用户参数
介绍:该参数化方式适用于参数较少的情况,如较少用户登录系统。
步骤:
1、添加用户参数模块
2、设置参数变量和值
添加变量/删除变量是指变量名称,即第一列;
添加用户/删除用户是指变量的值,即名称后面的值。
注意:若未勾选每次迭代更新一次,每次都会使用相同的数据
3、使用参数化的变量
注意:参数值应与用户参数定义的变量名保持一致。
4、运行,查看结果树
注意修改线程数,有几个参数值就需要添加几个线程数。
2、用户自定义变量
介绍:该参数化方式适用于变量不随请求迭代的常量,如IP地址、端口等。
步骤:
1、添加用户自定义变量功能模块
2、设置变量、变量的值
3、使用参数化字段
4、运行,查看结果树
3、CSV数据文件
介绍:该参数化方式适用于取值范围较大的情况,如上百、上千人员登录系统。
步骤:
1、桌面新建记事本,写入参数,保存后更改文件后缀为.csv文件
2、添加csv文件
3、jmeter导入csv文件
调整目录结构,注意查看结果树要放在最后:
4、修改参数为变量
5、修改线程组数量
根据csv文件中参数的数量修改
6、运行,查看结果
7、添加断言
在csv文件最后一列添加需要断言的参数
在jmeter中添加断言:
修改csv配置,添加需要断言的字段
添加响应断言
点击运行,断言成功
四、接口关联
介绍:调用一个接口,得到参数,将这个参数设为变量,在下一个接口中调用这个参数。
示例:
接口一:获取验证码
url:http://kdtx-test.itheima.net/api/captchaImage
返回格式:json
请求方式:get
接口二:用验证码登录
url:
返回格式:json
请求方式:post
请求参数:
名称 类型 是否必填 说明 示例 username string 必填 用户名 admin password string 必填 密码 HM_2023_test
code string 必填 返回值 2 uuid string 必填 验证码返回参数
1、正则表达式
(1)添加正则表达式提取器
(2)写正则表达式
引用名称:变量名;
正则表达式:就是需要提取的内容,()括号表示需要提取的部分,()前后是提取的边界内容;
模板:正则表达式的提取模式。这里是固定格式:$数字$,如果正则表达式有多个提取结果,则结果是数组形式,模板$1$,$2$等等,表示把解析到的第几个值赋给变量;从1开始匹配,以此类推。若只有一个结果,则只能是$1$;
匹配数字:正则表达式匹配数据的结果可以看做一个数组,表示如何取值:0代表随机取值,正数n则表示取第n个值(比如1代表取第一个值),负数则表示提取所有符合条件的值。
缺省值(Default Value):匹配失败时的默认值。可以不写。若需用于后续逻辑判断,可简单写为 ERROR。
(3)填写获取到的变量并运行
这里因为是json格式的数据体,所以还需要添加一个“HTTP信息头管理器”,填写Content-Type:application/json;charset=UTF-8
运行成功:
可能遇到的问题:
1、运行后只有一个http请求的响应结果,需要检查线程数是否修改为对应http请求的数量;
2、注意http的端口号是80,https的端口号是443;
3、查看结果树只显示当前http的响应结果,如果要看整个线程组的结果树,注意“查看结果树”放置的目录位置,就要在线程组目录下面了;
4、响应结果出现中文乱码的问题。解决方法:在jmter的bin目录下面找到jmeter.properties文件,修改sampleresult.default.encoding=UTF-8,重启jmeter后就可以了。(当然也有其他方法,自行查找解决吧~~~)
2、json extractor(json提取器)
当前接口响应返回的json中提取内容,作为变量可以在不同的请求中传递。如下,从获取验证码接口返回的json中提取uuid,变量名设置为uuid,在其他请求中可以直接调用这个变量,或者作为post参数。
1、添加json提取器
2、设置变量名和参数
json extractor中使用$代表原来接口的返回值,取值如下图:
Variable names : 名称
JSONPath Expression:JSON表达式
Match Numbers:匹配哪个,可为空即默认第一个
Default Value:未取到值的时候默认值
3、查看结果树,登录成功