性能测试一:性能理论及JMeter使用

一、性能测试理论

1.1 何种系统需要做性能测试

  1. 用户量大,PV较高的系统
  2. 系统核心模块/接口
  3. 业务逻辑/算法比较复杂
  4. 促销/活动推广计划
  5. 新系统、新项目
  6. 线上性能问题验证和调优
  7. 新技术选型
  8. 性能容量评估和规划(对于容量的评估,估测具体的容量)
  9. 日常系统性能回归

1.2 性能测试指标

  1. 事务
  • 性能测试领域中,衡量一个系统性能的好坏,主要看单位时间内,系统可以处理多少业务量。
  • 事务代表业务操作,一个事务可以代表一个业务,也可以代表多个业务操作
  1. TPS/QPS:每秒处理的事务数
  2. 响应时间
  • 响应时间=网络传输的总时间+各组件业务处理时间

image.png

  • 平均响应时间:测试过程中,所有请求的平均耗时。(PS:当样本数量少时,用平均值来看数据,得出来结论会有异常,比如:一个接口为1ms,一个接口为1s,平均出来的值就不合理)
  1. TOP响应时间
  • Tp90(90%响应时间):90%的请求耗时都低于某个时间
  • Tp95(95%响应时间):95%的请求耗时都低于某个时间
  • Tp99(99%响应时间):99%的请求耗时都低于某个时间
  • 算法:将所有请求的响应时间从大到小进行排序,计算指定比例的请求都是小于某个时间。该指标统计的是大多数请求的耗时。

拿Tp90举例

接口A连续响应10次请求序号响应时间ms
1800
2600
3500
4900
5950
6750
7400
8500
9300
10500

第一步:将列表降序排列

接口A连续响应10次请求序号响应时间ms
5950
4900
1800
6750
2600
3500
8500
10500
7400
9300

90%*10=9,从倒数第一个到第九个都处于900ms以下,所以就以900ms为分界线

  1. 高频接口一般响应时间为200ms,低频的接口一般响应时间为100ms,上秒的接口需要被优化;静态资源无需测试,都存储在CDN中
  2. 并发数/虚拟用户:压测工具中设置的并发线程/进程数量
  3. 成功率:请求的成功率
  4. PV(Page View):页面/接口的访问量
  5. UV(Unique Visitor):页面/接口的每日唯一访客
  6. 吞吐量:网络中上行和下行的流量总和
  • 吞吐量代表网络的流量,TPS(每秒钟的请求数)越高,吞吐量越大

1.2.1 TPS、响应时间与并发数的关系

  • 系统大道性能瓶颈之前,TPS和并发数成正比关系
  • 响应时间(单位:秒)为前提:
    • TPS = 1 / 响应时间*并发数
    • TPS = 并发数 / 响应时间
      • 跑完性能测试,可通过结果来算TPS,数值差别不大,则结果是合适的
      • 如果是多接口并发,需要把每个接口的响应时间相加
    • image.png

1.3 性能监控指标

  1. 操作系统监控级别
  • CPU使用率,内存使用率,网络IO(input/output),磁盘(read/write/util)
  1. 中间件监控
  • 连接数,长短连接,使用内存
  1. 应用层监控
  • 线程状态,JVM参数,GC频率,锁
  1. db层监控
  • 连接数,锁,缓存,内存,SQL效率

1.4 性能测试流程

  1. 需求调研
    1. 调研范围
      • 项目背景
      • 测试范围
      • 业务逻辑&数据流向(数据:数据从哪来到哪去,有无缓存,是否调用第三方接口,了解后有助于排查问题)
      • 系统架构(部署的架构及使用的组件,如负载均衡、消息中间件、负载均衡等)
      • 配置信息(硬件配置,如CPU几核、内存,有的公司会有性能测试环境,尽量与线上保持一致)
      • 测试数据量(量级要一致)
      • 外部依赖(mock )
      • 系统使用场景,业务比例(比如登录、注册两个接口,真实场景肯定会存在同时发生的场景,那么业务比例就可以理解为同时有多少人登录、多少人注册)
      • 日常业务量(PV)
      • 预期指标
      • 上线时间
  2. 测试计划
    1. 项目描述
    2. 业务模型及性能指标(需求调研中的预期指标)
    3. 测试环境说明
    4. 测试资源
    5. 测试方法以及场景设计原则
      • 基准测试:为了找到一种性能基准,一般为单并发、长时间去跑一连串的操作;意义:优化接口后与优化前的数据进行对比,可以看出优化效果如何的;但是如果想看性能拐点,还是需要使用高并发来压测
      • 单交易负载测试(常用):指单业务、单接口的测试
      • 混合场景测试(常用):如登录、注册接口,一定要先跑单交易负载测试,保证每个接口没问题后,再按照一定的比例(需求调研中获得)进行压测
      • 高可用性测试(一般针对线上集群)
        • 测试方法:把集群中的某一个节点挂掉,查看集群是否可以正常运行;再运行挂掉的节点,查看集群在节点重启后,是否可正常使用
      • 异常场景测试:比如弱网场景下,发送请求,虽然是弱网,但仍然会产生高并发的情况;有一些异常情况比如弱网下进行交易,第一次接口没跑通,因为触发了某些机制,又重新跑了接口,可能就会导致产生了两个订单
      • 稳定性测试(常用):需要做长时间的压测(如12小时),为了测试是否有比如,内存泄漏等的问题
      • 其他特殊场景
  3. 环境搭建硬件配置
    1. 注意事项
      • 尽量和线上一致
      • 系统版本与线上一致
      • 测试环境部署线上最小单元模块
      • 应用、中间件、数据库配置要与线上一致
      • 其他特殊配置
  4. 数据准备
    1. 测试数据分为:基础数据、参数化数据
    2. 数据构造方式:
    • 业务接口
      • 适合数据表关系复杂
      • 优点:数据完整性比较好
    • 存储过程
      • 适合表数量少、简单
      • 优点:速度最快
    • 脚本导入
      • 适合数据逻辑复杂
      • 自由度比较高
  5. 脚本编写
    1. 选择工具(Loadrunner、Jmeter、Locust等)
    2. 选择协议(HTTP、TCP、RCP)
    3. 参数化
    4. 关联
    5. 检查点
    6. 事务判断
  6. 压测执行
    1. 分布式执行
    2. 监控
      • Linux
      • JVM
      • 数据库
    3. 手机测试结果
    4. 数据分析
    5. 瓶颈定位
  7. 调优回归
    1. 性能调优需要整个团队完成
    2. 反复尝试
    3. 回归验证
    4. 监控工具
    5. 全链路排查
    6. 日志分析
    7. 模块隔离
  8. 测试报告

1.5 HTTP协议

1.5.1 http简介

1、支持客户/服务器模式。
2、简单快速:客户向服务器请求服务时,只需传送请求方法和路径。请求方法常用的有GET、 POST、PUT、DELETE。每种方法规定了客户与服务器联系的类型不同。
由于HTTP协议简单,使得HTTP服务器的程序规模小,因而通信速度很快。
3、灵活:HTTP允许传输任意类型的数据对象。正在传输的类型由Content-Type加以标记。
4、无连接:无连接的含义是限制每次连接只处理一个请求。服务器处理完客户的请求,并收到 客户的应答后,即断开连接。采用这种方式可以节省传输时间。
5、无状态:HTTP协议是无状态协议。无状态是指协议对于事务处理没有记忆能力。缺少状态 意味着如果后续处理需要前面的信息,则它必须重传,这样可能导致每次连接传送的数据量增大。 另一方面,在服务器不需要先前信息时它的应答就较快。

1.5.2 http协议结构


tips:

关于压力测试、负载测试、性能测试概念区分的问题
1、对于上述三个概念,业界无统一标准和定义,资料五花八门,说的各不一样
2、对于初学者来说,可以先忽略这些概念
3、只需记住:所做的测试都成为性能测试,在实际公司里,都叫做【压测】
4、至于是为了测试最大并发用户、稳定性还是最高tps,这些都属于性能测试,只是测试的目的有所不同,因为目的不同而设计成不同的测试场景

二、Jmeter

2.1 安装与配置

官方网站:https://jmeter.apache.org/
1、本机配置好Java环境变量
2、官网下载压缩包,在任意目录下解压
3、修改配置文件,打开Jmeter的bin目录下jmeter.properties,修改
language=zh_CN #中英文环境
sampleresult.default.encoding=utf-8 #防止乱码

调整图标大小
jmeter.toolbar.icons.size=32x32
jmeter.tree.icons.size=32x32

修改消息体数据大小
jsyntaxtextarea.font.family= Hack
jsyntaxtextarea.font.size=36

改变界面元素大小
更改为 true ,才算启用
jmeter.hidpi.mode=true
控制大小
jmeter.hidpi.scale.factor=2.0

若修改配置未生效,则在jmeter.bat中增加如下代码
image.png

set JVM_ARGS=%JVM_ARGS% -Dswing.plaf.metal.controlFont=Dialog-20
set JVM_ARGS=%JVM_ARGS% -Dswing.plaf.metal.systemFont=Dialog-20
set JVM_ARGS=%JVM_ARGS% -Dswing.plaf.metal.userFont=SansSerif-20
set JVM_ARGS=%JVM_ARGS% -Dswing.plaf.metal.smallFont=SansSerif-20

4、进入到Jmeter的bin目录下,双击jmeter.bat启动

2.2 脚本编写

2.2.1 入参

入参的三种类型

接口名称接口类型参数
参数为key=valuePOSTusername=“123”&password=“123”
参数为json类型POST{username=“123”,password=“123”}
参数为key=json类型POSTkey = {username=“123”,password=“123”}

第二种:json类型
image.png
json类型的入参都是填写在【消息体数据】中的,如果消息体数据有数据,则无法操作【参数】
注意:参数为json类型需增加一个http信息头管理的配置元件,还需要注意的是配置元件的生效域,不一定所有接口的入参都是这种类型image.png
http信息头管理:
image.png
PS:报415的错,检查是否加了信息头

第三种:key=json类型
便捷方法:可从底部的【从剪贴板添加】直接粘贴
image.png

2.2.2 断言

结果树中查看到的成功状态,仅为接口调用成功(因respond code=200),但不能判断业务是否跑通了,所以则需要加断言。

2.2.2.1 JSON断言

1、添加断言:
JSON路径表达式:$.code 代表JSON中的code字段名(详细参考:https://github.com/json-path/JsonPath)
需勾选additionally assert value、match as regular expression
image.png
PS:断言也注意断言文件存放的位置,存放的层级不同,生效域则不同,比如途中存放在登录接口下,仅对登录接口生效,若放置在最外层,则对全域生效image.png

2、json中包含了数组,可按如下处理:
示例json:

{
  "store": {
    "book": [
      {
        "category": "reference",
        "author": "Nigel Rees",
        "title": "Sayings of the Century",
        "price": 8.95
      },
      {
        "category": "fiction",
        "author": "Evelyn Waugh",
        "title": "Sword of Honour",
        "price": 12.99
      },
      {
        "category": "fiction",
        "author": "Herman Melville",
        "title": "Moby Dick",
        "isbn": "0-553-21311-3",
        "price": 8.99
      },
      {
        "category": "fiction",
        "author": "J. R. R. Tolkien",
        "title": "The Lord of the Rings",
        "isbn": "0-395-19395-8",
        "price": 22.99
      }
    ],
    "bicycle": {
      "color": "red",
      "price": 19.95
    }
  },
  "expensive": 10
}

处理方式:

JsonPathResult
$.store.book[*].authorThe authors of all books
$…authorAll authors
$.store.*All things, both books and bicycles
$.store…priceThe price of everything
$…book[2]The third book
$…book[-2]The second to last book
$…book[0,1]The first two books
$…book[:2]All books from index 0 (inclusive) until index 2 (exclusive)
$…book[1:2]All books from index 1 (inclusive) until index 2 (exclusive)
$…book[-2:]Last two books
$…book[2:]All books from index 2 (inclusive) to last
$…book[?(@.isbn)]All books with an ISBN number
$.store.book[?(@.price < 10)]All books in store cheaper than 10
Misplaced @

$…book[?(@.price <= $[‘expensive’])] | All books in store that are not “expensive” |
| $…book[?(@.author =~ /.REES/i)] | All books matching regex (ignore case) |
| $…
| Give me every thing |
| $…book.length() | The number of books |

2.2.2.2 响应断言

image.png
Apply to

  • main sample only:该断言针对主请求
  • main sample and sub-sample:该断言针对主、次请求,例如重定向的场景,可能会使用到该选项

测试字段:选择需要对哪个数据做判断

  • 忽略状态:忽略jmeter默认的状态判断,来跑响应断言中对于状态的断言

响应断言模式匹配规则

  • 包括(Contains):如果响应中包含了指定的字符串,判断为成功,支持正则表达式
  • 匹配(Matches):如果响应完全匹配指定的字符串,判断为成功,支持正则表达式
  • 相等(Equals):如果响应完全匹配指定的字符串,判断为成功,不支持正则表达式
  • 字符串(Substring):如果响应中包含了指定的字符串,判断为成功,不支持正则表达式
  • 最常用的是字符串,性能测试只需要判断业务是否跑通,无需写过于复杂的断言

2.2.3 测试计划

定义全局变量,例如域名及端口号
image.png
接口中可通过${变量名称}配置
image.png

2.2.4 参数化

2.2.4.1 通过【函数助手】生成各种函数

功能位置:工具栏倒数第二个
常用的函数例如:

  • 生成随机数:Random函数

image.png
输入完范围后,点击【生成】按钮,复制【当前JMeter变量】的语句,粘贴至【参数】的【值】中
image.png

  • 随机字符串:RandomStringimage.png

image.png
点击【生成】按钮后,${__RandomString(8,abcdefghijklmQ39589fsafdgAAA,)} 函数字符串会自动复制到剪切板

  • 时间戳

两个参数皆为可选填,都不填也可,直接点击生成就可以直接用
image.png
填了参数
image.png

  • uuid

image.png

2.2.4.2 文件参数化

1、**CSVRead:**从文本文件中读取数据
优点:该函数适用于使用登录后,仍然需要用这些账号进行一系列操作的压测
image.png
第一个参数填文件的绝对路径,第二个参数填第几列,例如下图中:第一列是登录接口的用户名,第二列是密码
image.png
注意:接口轮询中使用txt文件中的用户数据数量,取决于线程数的数量
线程数=1时,无论循环次数为几,皆使用文件中的第一条用户数据
image.png
线程数=2时,调了两条txt中的用户数据
image.png
线程数=4时,重复调用了两遍文件中的两条数据
image.png
使用函数生成的参数来替换接口中的参数,如下图中的mobile、password字段
image.png

PS:存储函数的变量名
2、CSV Data Set Config
功能添加路径:线程组→添加→配置元件→CSV Data Set Config
image.png

  • Allow quoted data(是否允许带引号):选择true,读取中文时会导致参数值出现乱码

文件编码:可以不填

  • 如果接口中的参数是用西文逗号隔开的(例如:“user”:“username,password”),那么txt数据就不可以再用逗号隔开,可以用【\t】代替,在txt中为用tab键隔开,也可以用别的符号隔开
    | Recycle on EOF(遇到文件结束符再次循环?) | Stop thread onEOF(遇到文件结束符停止线程?) | 参数效果 |
    | — | — | — |
    | True | False | 重复 |
    | False | True | 唯一 |

  • 参数效果=唯一 举例:txt有四条数据,线程数=2,循环次数=3,此时接口只会跑四次,取的txt中四条数据,第五条因需重头取,导致数据重复,所以不会继续运行

  • 参数替换方式

image.png

注意:使用CSV Data Set Config读取数据,无论线程数与循环次数是几,每次查询都是查询下一条数据,若所有数据都读取了一遍,则会从头读取第二遍
线程数=1,循环次数=2时,会使用文件中的两条用户数据
image.pngimage.png

假设txt中是四条用户数据,线程数=2,循环次数=2,在轮询时,会依次读取文件中的四条用户数据
image.png

2.2.5 线程组

线程数:假设有多少用户正在同时使用
多用户场景时,无需参考查看结果树中的接口顺序,其实是同时发生的

2.2.6 数据关联

2.2.6.1 方法一:后置处理器———JSON提取器

image.png
image.png
apply to:一般选main sample only (主请求)
Name of created values:对提取的变量起名
JSON Path expression:要提取的变量(用jsonpath写)

  • 切记,如遇到数据在json中的数组下,记得指定取数组中的第几个,不然会取不出来数据
  • 1、提取最深层某字段的其中一个数据:$.docGroups[0].documents[0].docId
{
    "responseStatus": {
    },
    "docGroups": [
        {
            "documents": [
                {
                    "docId": 38604724,
                    "startTime": 1673406999
                },
             		{
                    "docId": 2,
                    "startTime": 1673406998
                }
    ],
    "events": []
}
  • 2、提取某字段在该响应中的所有数据$.docGroups[0].documents[*].docId
{
    "responseStatus": {
    },
    "docGroups": [
        {
            "documents": [
                {
                    "docId": 1,
                    "startTime": 1673406999
                },
             		{
                    "docId": 2,
                    "startTime": 1673406998
                }
    ],
    "events": []
}

Match No:想提取第几个数据

  • Match No = 0,则会随即返回其中一个数据
  • 填几,则会返回几个
  • Match No =-1,返回所有的数据

若其他接口想调用取到的值,如下图catalogId字段一样使用即可
image.png

2.2.6.2 调试取样器

image.png
调试取样器可以打印出来Jmeter运行过程中保存下来的参数,需要配合查看结果树使用,无需配置任何数据
image.png
结果树中可看到获取到的get_docID值
image.png

2.2.6.3 方法二:后置处理器——正则表达式提取器

可以通过正则表达式来获取http请求返回的数据
image.png
引用名称:匹配后的结果,保存到一个参数中,如param
正则表达式
三步走:
1、拷贝目标数据和左右边界
2、把目标数据用括号括起来
3、把目标数据用.+?代替
模板 1 1 1表示取匹配到的第一组数据, 2 2 2为第二组
匹配数字:当某组数据中包含多少个参数时,0代表随机,1代表该组的第一个参数,2表示第二 个。。。-1代表获取全部的参数,这个时候,引用名称就变成了参数数组,可以通过param_n来 获取指定的参数,当有多组数据时,第一组为param_1_g1,第二组为param_1_g2
结果:看倒数第四行的re_docid字段,是通过正则提取器提取到的第一个文章id
image.png

2.2.7 聚合报告

image.png
模拟用户使用时,循环次数要选【永久】
image.png
聚合报告结果:image.png
#样本: 表示一共发出了多少个请求Average:平均响应时间
中位数:类似于50% Line90% Line: 假设该值为20,那么90%用户的响应时间小于等于20msMin:最小响应时间
Max/最大值: 最大响应时间
Error%/异常%: 错误率,出现错误的请求数量/请求的总数Throughput:吞吐量KB/Sec: 每秒从服务器端接收到的数据量
吞吐量:默认情况下表示每秒完成的请求数(Request per Second) 对于接口测试来说,Jmeter里的吞吐量=TPS
保存结果:聚合报告底部可保存结果数据
image.png

tip:
1、若两接口在同一线程组下,TPS值一致,但响应时间不一定一致
2、有关联关系的接口放在同一个线程组下,无关联的接口们需独立存放在不同的线程组下

2.2.8 定时器

1、Jmeter中的定时器类似于loadrunner中的pacing值和think_time
1)定时器是在
每个sampler(采样器)之前执行的
,而不是之后
2)定时器是有作用域的;当执行一个sampler之前时,所有当前作用域内的定时器都会被执行。且所有的sampler执行前都会执行定时器
3)如果希望定时器仅应用于其中一个sampler,则把该定时器作为子节点加入

2、常用的定时器

  • 固定定时器:设置一个固定的延迟时间,单位ms

image.png

  • 同步定时器(synchronizing timer):在该定时器处,使线程等待,一直到指定的线程个数达到 后,再一起释放。可以在瞬间制造出很大的压力。它和loadrunner的集合点差不多的功能
    • 集合点
      • 集合点是为了增加瞬间并发压力的一种机制,在脚本中增加一个标记,所有虚拟用户执行到标记 处会进行等待,等所有用户都到达后,再同时继续执行下一步操作。
      • 优点:对服务器来说,会产生一种瞬间高并发
      • 缺点:对服务器来说,平均压力会降低
    • 需要加集合点的场景 :
      • 根据业务来选择,如果业务场景是瞬间高并发类型的,如抢购、秒杀等,需要加集合点; 其他的场景都不需要加,一般加了集合点后,就不使用tps来衡量系统性能 集合点功能要慎重选择,因为加了集合点后,系统的平均压力会降低
    • 超时时间=0,则不会发生超时;超时时间>0,等待X毫秒后,已处理完上一步的的线程组数进行并发

image.png

  • 常量控制器:可以控制每分钟tps的总量,限制最高tps (线上测试最好加该控制器,以防压爆线上)

image.png

2.2.9 逻辑控制器

常用的逻辑控制器:
1、循环控制器:可以设置该控制器内的sampler执行的次数,循环次数与线程的循环次数各自独立

  • 主要作用于多个请求时

image.png
image.png
此条件下,【获取专栏详情页的资讯列表】接口仅执行1次,【请求2】接口执行会执行6次

2、if控制器:根据判断条件决定是否执行该控制器内的请求,如果是字符串比较条件,参数和字符串 都需要加引号
条件格式:
KaTeX parse error: Expected group after '_' at position 2: {_̲_jexl3(条件表达式)}<…{__jexl3(KaTeX parse error: Expected 'EOF', got '}' at position 11: {num} > 5)}̲、 <br />2、若相比较的…{__jexl3(“${ip}”) == “xxxxx”)}
image.png
3、仅一次控制器:该控制器内的请求只执行一次,无论线程循环多少次

  • 针对单个线程

image.png
image.png
此种情况下本应【请求2】【请求3】皆执行6次,但因为【请求3】在【仅一次控制器】下,最终结果为:
【请求2】执行6次【请求3】执行1次

4、foreach控制器,可以遍历某个参数数组,循环获取数组中的参数
参数是通过其他接口通过提取器提取出来的参数数组,再把参数循环附入需要这些参数的接口
image.png
结束循环字段:${get_docId_matchNr}取字数组末尾的get_docId_matchNr=12,方便标记,也不会产生写死的情况(只能获取到get_docId_9的情况)
输入变量法前缀:取自于结果树中get_docId(名字是自己在提取器中设置的变量名)
image.png

2.2.10 Http cookie管理器

2.2.10.1 cookie和session

cookie数据保存在客户端,session数据保存在服务器端。cookie有安全隐患,但是Session过多的时候会消耗服务器资源

  • Cookie 机制:正统的 Cookie 分发是通过扩展 HTTP 协议来实现的,服务器通过在 HTTP 的响应头中加上一行特殊的指示以提示浏览器按照指示生成相应的 Cookie。然而纯粹的客户端脚本如 JavaScript 或者 VBScript也可以生成 Cookie。而 Cookie 的使用是由浏览器按照一定的原则在后台自动发送给服务器的。浏览器检查所有存储的 Cookie,如果某个 Cookie 所声明的作用范围大于等于将要请求的资源所在的位置,则把该 cookie 附在请求资源的 HTTP 请求头上发送给服务器。
  • Session 机制:Session 机制是一种服务器端的机制,服务器使用一种类似于散列表的结构(也可能就是使用散列表)来保存信息。

Cookie 存在一定的全安隐患。Cookie 像我们以前用的存折,用户的存钱、取钱都会记录在这张存折上(即浏览器中会保存所有用户信息),那么对于有非分想法的人可能会去修改存折上的数据(这个比喻忽略掉银行同样会记录用户存取款的金额)。相对于存折,银行卡要全安的得多,客户拿到的只是一个银行卡号(即浏览器只保留一个 Sessionid),那么用户的存钱、取钱都会记录在银行的系统里(即服务器端),只得到一个 sessionid 是没有任何意义的,所以相对于 Cookie 来说就会安全很多。
cv文章~~

2.2.10.2 cookie管理器

位置:
image.png
使用:
image.png
1、名称:取自抓包接口中cookie下,对应的cookie名称,具体其中哪个字段作为cookie需问开发image.png
2、值:即对应的cookie值,配置的cookie必须是有效的,无效接口会有对应的提示:比如用户无效啊,用户未登录~之类的
3、域:接口的域名,全局配置的话,可用 i p 对应的名称 写,配置如下图中,可写为 {ip对应的名称}写,配置如下图中,可写为 ip对应的名称写,配置如下图中,可写为{ip}image.png

无需每次通过抓包获取cookie的便捷方法
image.png
调用login接口获取cookie,http cookie管理器无需填写内容、接口中无需调用,管理器会自动获取接口中cookie塞到需要cookie的接口中

2.2.11 token接口处理

简单了解一下token的使用~

  • 前端登陆的时候向服务器发送请求,服务器验证成功,会生成一个token
  • 前端会存储这个token,放在session或cookie中,用于之后的业务请求身份验证
  • 拿着这个token,可以在当前登录的账号下进行请求业务,发送请求时,token会放在请求头里,服务器收到这个业务请求,验证token,成功就允许这个请求获取数据
  • token可以设置失效期

token知识~
从登录接口中提取token,若是在请求头里需要增加该参数,则在HTTP信息头管理器中添加对应的key、value
image.pngimage.png

2.2.12 上传、下载文件(可以忽略该小节)

内容不全也无真实实例可展示(手头接口不支持)需要细了解请自行搜索
上传文件小点~
1、文件上传原理:浏览器将本地文件内容通过HTTP发送到服务器,服务器收到数据后重新创建一个文件
2、文件上传的HTTP请求content-type:multipart/form-data,MIME类型为application/octet-stream
3、文件上传一般有表单上传和ajax上传两种方式

实现步骤:
1、需要用到的图片本地地址填在txt文本里
image.png
2、把需要读取的txt文件配置在【CSV数据文件设置】中image.png
3、
image.png

下载:
1、文件下载的原理:服务器将文件内容通过HTTP发送到浏览器,浏览器接受到数据后在本地创建一个文件
2、创建文件是浏览器的自沈从文,测试文件下载不需要在本地创建文件
3、文件下载是一个普通的HTTP GET类型请求

2.2.13 WebService接口脚本编写

1、接口配置为http请求

image.png
2、添加header:Content-Type:text/xml;chartset-
image.png

2.2.14 TCP接口脚本编写

image.png
要发送的文本:可能是xml、也可能是十六进制的一串数据,具体数据格式需要找开发了解

2.2.15 JDBC请求脚本编写

1、添加数据库jar包

  • mysql-connector-java-8.0.29.jar阿里盘地址: https://www.aliyundrive.com/s/cW8XgHNyF98
  • 方式一:拷贝mysql驱动包到jmeter/lib目录下
  • 方式二:测试计划处添加驱动jar包(仅针对该测试计划添加某jar包)
  • image.png

3、配置JDBC Connect Configuration
红框中为需要填写的参数;
Database URL:jdbc:mysql://{ip}:{port}/{dbname}?useUnicode=true&characterEncoding=utf8
JDBC Driver class:选择所需使用的数据库
image.png
4、**JDBC Request **
image.png

  1. Variable Name of Pool declared in JDBC Connection Configuration:该字段填写【JDBC Connection Configuration】中【Variable name of createdpool】字段值
  2. Query Type:语句类型
  • Select statement:查询语句类型(select),只支持一条查询语句,多条查询语句只执行第一条
  • Update statement:更新语句类(insert,update,delete),只支持一条更新语句,多条更新语句只执行第一条
  • Prepared Select statement:支持多条查询(select)语句,查询响应数据只展示第一条SQL的查询结果
  • Prepared Update statement:支持多条更新(insert,update,delete)语句,响应数据展示多条更新提示(做参数化最好选择该类型)
  • Callable Statement:支持多条查询、更新(insert,update,delete,select)语句,响应数据展示展示多条数据更新结果。如果是多条select语句同时查询,建议使用Callable Statement,响应数据可以展示多条查询结果值
  1. Parameter values:填写参数的具体的值,或者参数的名称(代替sql语句中问号的值)。可以利用此字段对SQL语句进行参数化
  2. Parameter types:指Parameter Values参数的数据类型,例如:integer,String,double类型
  3. Parameter values 和Parameter types:必须成对出现,且SQL语句中有多个参数,就必须有多少个parameter values 和Parameter types。
  4. Variable names:自己设置的变量名称,用于存放select操作返回的查询结果。有多个字段返回时,需用逗号隔开
  5. Result variable name:用于存放select操作返回的查询结果集
  6. Query timeout:查询超时时间
  7. Handle result set:定义如何处理由callable statements 语句返回的结果

若想保存查询出的数据
1、添加【调试取样器】
2、【JDBC Request】中【Variable names】赋值image.png
调试取样器中可查看到保存下来的结果
image.png

2.3 插件便捷管理

http://jmeter-plugins.org/downloads/all
1、下载jmeter-plugins.jar
2、把jar文件放入%Jmeter_Home%\lib\ext,重启jmeter
3、点击工具栏中的图标image.png,可对插件进行管理

可能会用到的插件:

  • 3 Basic Graph:windows下可用的实时tps和响应时间的插件

image.png
image.png
image.png
image.png

  • Custom JMeter Functions
  • Random CSV Data Set Config
  • PerfMon :服务端性能实时监控插件

安装:
1、搜索并勾选需要的插件
image.png
2、点击并等待,下载完成后会自动重启
image.png

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值