• 性能测试一:性能理论及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
    
    • 1
    • 2
    • 3
    • 4

    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
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37

    处理方式:

    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": []
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 2、提取某字段在该响应中的所有数据$.docGroups[0].documents[*].docId
    {
        "responseStatus": {
        },
        "docGroups": [
            {
                "documents": [
                    {
                        "docId": 1,
                        "startTime": 1673406999
                    },
                 		{
                        "docId": 2,
                        "startTime": 1673406998
                    }
        ],
        "events": []
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17

    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)}̲、
    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

  • 相关阅读:
    1209. 带分数
    飞项聊职场:剖析产品经理和项目经理关键技能
    Spring:IOC与AOP
    Java简单类,(康复训练1)
    torch.autograd
    数据结构——经典链表OJ(二)
    Vue3 <script setup> 单文件组件 组合式 API 相关语法
    新一代实时数据集成框架 Flink CDC 3.0 —— 核心技术架构解析
    【CSS系列】writing-mode —— 文字方向(水平/垂直;左右/右左)
    接口自动化测试系列-接口测试
  • 原文地址:https://blog.csdn.net/TDLDDMZ/article/details/130913897