性能测试阶段大纲

  • 第 1 章 性能测试理论

    • 性能测试概述
    • 性能测试策略
    • 性能测试指标
    1. 性能测试流程
  • 第 2 章 性能测试工具JMeter

    • 常用性能测试工具
    1. JMeter环境搭建
    2. JMeter基本使用
    3. JMeter参数化、断言、关联
    4. JMeter录制脚本
    5. JMeter直连数据库
    6. JMeter分布式
    7. JMeter测试报告
  • 第 3 章 项目实战

    • 项目介绍和部署
    1. 性能测试需求分析
    2. 性能测试计划
    3. 测试用例设计
    4. 测试脚本开发
    5. 建立测试环境
    6. 执行测试脚本
    7. 性能测试监控
    8. 性能分析和调优
    9. 编写测试报告
  • 第 4 章 Locust框架

    • Locust介绍和安装
    • Locust使用

课程目标

  1. 掌握性能测试理论中常见的性能测试场景、性能测试指标和性能测试流程;
  2. 掌握使用JMeter工具发送http接口请求,并掌握断言、关联、参数化等功能;
  3. 熟悉性能测试的流程;

性能测试理论

学习目标

  1. 理解什么是性能测试
  2. 掌握性能测试常用分类
  3. 熟悉性能测试常用指标
  4. 熟悉性能测试流程
  5. 知道进行性能测试的原因
  6. 理解性能测试的概念
  7. 理解性能测试和功能测试的区别与联系

为什么要进行性能测试

业务需求

  • 进行性能测试:满足真实的业务场景(活动场景)、支持大量的用户。满足商用要求

    • 电商双11活动/微信春晚抢红包/12306春运订票

    • 当前服务器配置是否支持20000人同时使用

    • 技术选型,如编程语言选择Java?Python?PHP?

image-20240111171458436

招聘需求

  • 要求会使用性能测试工具JMeter、LoadRunner

性能测试的概念

什么是性能

  • 性能:就是软件质量属性中的“效率”特性
  • 效率特性:
    • 时间特性:指系统处理用户请求的响应时间
    • 资源特性:指系统在运行过程中,系统资源的消耗情况
      • CPU
      • 内存
      • 磁盘IO(磁盘的写入Input和读取Output,简称IO)

什么是性能测试

  • 概念:使用自动化工具,模拟不同的场景,对软件各项性能指标进行测试和评估的过程就是性能测试。
    • 测试后台处理程序的性能(代码性能)
    • 测试应用服务器、中间件、数据库、架构设计等是否存在瓶颈
      • 中间件:是提供系统软件和应用软件之间连接的软件。如:Tomcat、Apache…
    • 服务器资源消耗(CPU、内存、磁盘、网络)

性能测试目的

  • 评估当前系统能力

    • 例如:验收第三方提供的软件

    • 例如:获取关键的性能指标,与其他类似产品进行比较

  • 寻找性能瓶颈,优化性能

  • 评估软件是否能够满足未来的需要

性能测试与功能测试

焦点不一样

  • 功能测试:验证软件系统操作功能是否符合产品功能需求规格,主要焦点在功能(正向、逆向);

    • 正向(功能))例如:输入正确的用户名密码,登录成功
    • 逆向(功能) 例如:输入错误的用户名密码,登录失败给出提示
  • 性能测试:验证软件系统是否满足业务需求场景,主要焦点是业务场景的满足(时间、资源);

    • 例如:100W人使用正确的用户名密码登录,1s内能登录成功 (时间)
    • 同时服务器的CPU使用率低于70%,内存使用率低于60%等 (资源)

关系

  • 功能测试和性能测试是相辅相成的,对于一款优秀的软件产品来讲,它们是不可减少的2个重要测试环节;
  • 注意:一般新项目中,先功能测试通过后,再进行性能测试。功能测试和性能测试不能同时进行,因为代码的修改,会影响软件的性能

性能测试策略

学习目标

  • 理解性能测试中常见测试策略

性能测试策略

  1. 基准测试
  2. 负载测试
  3. 稳定性测试
  4. 其他:并发测试、压力测试、容量测试等

基准测试

  • 基准测试:

    • 狭义上讲:也是单用户测试,测试环境确定以后,对业务模型中的重要业务做单独的测试,获取单用户运行时的各项性能指标。(进行基础的数据采集)
    • 广义上讲:是一种测量和评估软件性能指标的活动。你可以在某个时刻通过基准测试建立一个已知的性能水平(称为基准线),当系统的软硬件环境发生变化之后再进行一次基准测试以确定那些变化对性能的影响。
  • 基准测试数据的用途:

    • 为多用户并发测试和综合场景测试等性能分析提供参考依据
    • 识别系统或环境的配置变更对性能响应带来的影响
    • 为系统优化前后的性能提升/下降提供参考指标

负载测试

  • 说明:通过逐步增加系统负载,测试系统性能的变化,并最终确定在满足系统的性能指标情况下,系统所能够承受的最大负载量的测试。
  • 负载:指向服务器发送的请求数量,请求越多,负载越高
  • 注意:负载测试关注的重点是逐步增加压力 , 系统最大负载量达到用户要求时 , 系统才能正式上线使用

稳定性测试

  • 说明:稳定性测试是指,在服务器稳定运行(用户正常的业务负载下)的情况下进行长时间测试,并最终保证服务器能满足线上业务需求
    • 时长一般为1天或者一周等。

其他测试策略

  • 性能测试中,测试策略其实有很多种,但是掌握基础的用法后,其他不同名称的测试策略只是基础用法的一个变形用法。
    • 并发测试:

      • 并发测试是指在极短的时间内,发送多个请求,来验证服务器对并发的处理能力。
      • 如:抢红包、抢购、秒杀活动等。
    • 压力测试:

      • 压力测试是在强负载(大数据量、大量并发用户等)下的测试,查看应用系统在峰值使用情况下操作行为,从而有效地发现系统的某项功能隐患、系统是否具有良好的容错能力和可恢复能力。
      • 压力测试分为高负载下的长时间(如24小时以上)的稳定性压力测试和极限负载情况下导致系统崩溃的破坏性压力测试。
    • 容量测试:

      • 关注软件的极限压力下的各个极限参数值
      • 例如:最大 TPS,最大连接数,最大并发数,最多数据条数等。

性能测试指标

学习目标

  • 掌握常用的性能测试指标
  • 理解性能测试指标中每种指标的含义

什么是指标

  • 说明:一些经过运算得出的结果,来衡量某种操作性能统称;比如:错误率 0.5%
  • 测试指标的作用 : 对性能测试结果进行量化衡量

性能指标

  1. 响应时间
  2. 并发数
  3. 吞吐量
  4. 点击数
  5. 错误率
  6. 资源利用率
  7. PV和UV

常用性能指标

响应时间

  • 说明:响应时间指用户从客户端发起一个请求开始,到客户端接收到从服务器端返回的结果,整个过程所耗费的时间
  • 组成:响应时间 = 网络时间 + 应用程序处理时间
    • 通过HTTP接口请求消息来测试 , 不包括发消息时前端页面的处理时间和收到消息后前端页面的渲染显示时间

image-20240111180755212

并发数

  • 说明:同一时间往服务器发送请求的用户数 ,即并发测试的用户数
  • 扩展:
    • 系统用户数:系统注册的总用户数据
    • 在线用户数:某段时间内访问系统的用户数,这些用户并不一定同时向系统提交请求
    • 并发用户数:某一物理时刻同时向系统提交请求的用户数

吞吐量

  • 说明:吞吐量(Throughput)指的是单位时间内处理的客户端请求数量,直接体现软件系统的性能承载能力

  • 注意:

    • 从业务角度来看,吞吐量也可以用“业务数/小时”、“业务数/天”、“访问人数/天”、“页面访问量/天”来衡量
    • 从网络角度来看,还可以用“字节数/小时”、“字节数/天”等来衡量网络的流量
    • 从技术指标来看,可以用每秒事务数(TPS)和每秒查询数(QPS)来衡量服务器具体性能处理能力
      • TPS :
        • 说明:Transactions Per Second,每秒事务数 (单位时间内系统处理的客户端请求的事务次数) , TPS归属吞吐量
        • 计算:TPS = 并发数/平均响应时间
        • 事务:就是业务请求,对应一个或者多个操作。
          • 如支付请求,包括服务器查询用户余额,支付安全校验等多个操作。
          • 一个业务请求发送给服务器后,最终会定位到服务器对应的业务请求的代码,既有可能是一段代码也有可能是多段代码。
      • QPS :
        • 说明:QPS(Query Per Second)每秒查询数
          • 衡量web服务器处理能力一个重要指标
        • 应用:控制服务器每秒处理指定请求数(如:控制服务器达到每秒60QPS,服务器的性能各项性能指标是否正常)。

image-20240111181554157

image-20240111181255838

点击数

  • 说明:点击数是衡量Web服务器处理能力的一个重要指标。
  • 提示:
    • 点击数不是通常一般人认为的访问一个页面就是1次点击数,点击数是该页面包含的元素(图片、链接、框架等)向Web服务器发出的请求数量。
    • 通常我们也用每秒点击次数(Hits per Second)指标来衡量Web服务器的处理能力。
  • 注意:只有web项目才有此指标。

错误率

  • 说明:*错误率指系统在负载情况下,失败业务的概率。错误率=(失败业务数/业务总数)100%。
  • 提示:
    • 不同系统对错误率要求不同,但一般不超过千分之五;
    • 稳定性较好的系统,其错误率应该由超时引起,即为超时率。
  • 注意:
    • 大多系统都会要求错误率无限接近于0
    • 错误率是一个性能指标不是功能上的随机bug

资源利用率

  • 说明:是指系统各种资源的使用情况,一般用“资源的使用量/总的资源可用量×100%”形成资源利用率的数据。
  • 提示:通常,没有特殊需求的话
    • 1). 建议CPU不高于80%(±5)
    • 2). 内存不高于80%
    • 3). 磁盘不高于90%
    • 4). 网络不高于80%

性能测试流程

学习目标

  • 掌握性能测试流程

进行性能测试的原因

  • 1.功能测试需要按照流程来推进,性能测试也同样,一套完整的测试流程是一次成功性能测试的基石
  • 2.[面试]简述下性能测试过程…

性能测试流程

  1. 性能测试需求分析
  2. 性能测试计划及方案
  3. 性能测试用例
  4. 测试脚本编写/录制
  5. 建立测试环境
  6. 执行测试脚本
  7. 性能测试监控
  8. 性能分析和调优
  9. 性能测试报告总结
  • 提示:使用不同的性能测试工具时,主要流程是不变的。

性能需求分析

image-20240111203644210

  • 说明:性能需求分析是整个性能测试工作开展的基础,性能需求分析做的好不好直接影响到性能测试的结果。
  • 性能需求分析的目标:

image-20231212132708620

  • 熟悉被测系统
    • 熟悉被测系统的业务功能
    • 熟悉被测系统的技术架构
  • 明确性能测试内容
    • 从业务角度明确测试内容
      • 确定关键业务。即:用户使用频率较高的业务功能
    • 从技术角度明确测试内容
      • 如:通常逻辑复杂度较高的业务也是CPU密集运算较大的地方,考量服务器CPU在预定性能指标下是否达标
      • 如:通常数据量较大的业务很占用系统内存,考量服务器内存在预定性能指标下是否达标
  • 明确性能测试策略
    • 负载测试
    • 稳定性测试
    • 并发测试
  • 明确性能测试的指标
    • 无明确需求指标
      • 通过查找相关资料,和类似的系统对比,以及对未来流量的预估,确定性能测试需求的指标
    • 有明确需求指标
      • 例如,类似如下指标
        • 下订单业务并发20个用户
        • 平均响应时间要小于等于3s
        • 事务成功率为100%
        • CPU使用率小于等于85%
      • 只需要根据执行分析结果与预期指标做对比,如果有不满足的,就需要分析问题所在

性能测试计划及方案

  • 说明:性能测试实施第一份文档,也是最重要的一份文档。
  • 主要内容:
    • 项目背景
    • 测试目的
    • 测试范围
    • 测试策略
    • 风险控制
    • 交付清单
    • 进度与分工

性能测试用例

image-20231212133138460

性能测试执行

image-20240111204611970

测试脚本编写/录制

  • 说明:性能测试用例编写完成以后,接下来就需要结合用例的需要,进行测试脚本的编写工作。
  • 提示:录制或编写,根据不同的工具要注意代码冗余。

建立测试环境

  • 说明:在进行性能则试之前,需要先完成性能测试环境的搭建工作,测试环境一般包括硬件环境、软件环境及网络环境
  • 提示:一般情况下可以要求运维和开发工程师协助完成

执行测试脚本

  • 说明:先保证脚本调试通过之后,才能进入正式压测阶段
  • 执行测试脚本时,要先进行性能运行场景的设置,再运行脚本

性能测试监控

  • 性能监控就是监控服务器的各项性能指标。
    • 例如:监控CPU、内存、网络、TPS、磁盘IO等

性能分析和调优

  • 说明:性能测试分析人员经过对结果的分析以后,如果不符合性能需求则会提出性能bug,然后由开发人员进行后续的调优
  • 提示:
    • 调优-由开发人员为主导,数据库管理员、系统管理员、网络管理员、性能测试分析人员配合进行
    • 验证-由性能测试人员继续进行第二轮、第三轮…的测试,与以前的测试结果进行对比,从而确定经过调整以后系统的性能是否有提升
  • 注意:
    • 系统调优由易到难的先后顺序如下:
      • 硬件问题
      • 网络问题
      • 应用服务器、数据库等配置问题
      • 源代码、数据库脚本问题
      • 系统构架问题

性能测试报告总结

  • 性能测试总结要包含以下内容:
    • 性能测试需求覆盖情况,测试过程回顾,及测试中出现的问题(如何去分析、调优、解决的)—基本要求
    • 性能测试过程中遇到各类风险是如何控制的; 目前是否还有其他的性能风险存在
    • 经过该项目性能测试后,有那些经验和教训等内容

性能测试工具JMeter

学习目标

  1. 了解市面主流测试工具
  2. 掌握Jmeter进行HTTP接口测试时的技术要点:断言、关联、参数化、引入外部数据文件
  3. 掌握Jmeter更深入的高级用法:Jmeter函数、Jmeter属性、Jmeter的BeanShell、Jmeter录制脚本
  4. 掌握使用Jmeter进行性能测试的核心技巧

常用性能测试工具

学习目标

  1. 了解市面主流测试工具
  2. 掌握JMeter工具的优缺点

主流性能测试工具

  • LoadRunner
    • HP LoadRunner是一种工业级标准性能测试负载工具,可以模拟上万用户实施测试,并在测试时可实时检测应用服务器及服务器硬件各种数据,来确认和查找存在的瓶颈 , 支持多协议:Web(HTTP/HTML)、Windows Sockets、FTP、ODBC、MS SQL Server等协议 , 最初是Mercury公司采用C语言编写,现被HP公司收购
    • 优点 :
      • 多用户(支持数量单位万)
      • 详细分析报表
      • 支持ip欺骗
    • 缺点:
      • 收费
      • 体积庞大(单位GB)
      • 无法定制功能
  • JMeter [本阶段学习]
    • JMeter是Apache组织开发的基于Java的开源软件,用于对系统做功能测试和性能测试。
    • 它最初被设计用于Web应用测试,但后来扩展到其他测试领域,例如静态文件、Java 程序、shell 脚本、数据库、FTP、Mail等。
    • 优点:
      • 免费
      • 开源
      • 小巧(最新版-50MB左右)
      • 丰富学习资料及扩展组件
      • 应用广泛
      • 易上手
    • 缺点:
      • 不支持ip欺骗
      • 分析和报表能力相对于lr欠缺精度

两种测试工具的对比

  • 相同点:
    • 都能模拟大量用户
    • 都能支持多协议(常见的协议都支持,如:HTTP)
    • 都有监控及分析报表功能
  • 不同点:

image-20240113113635566

  • 结论 :
    • 项目日常性能测试 Jmeter 足够使用,出商业报告优先 Loadrunner

JMeter环境搭建

目标

  1. 掌握如何搭建Jmeter环境
  2. 掌握JMeter基本使用流程

安装JDK

  • JDK(Java Development Kit) 是 Java 语言的软件开发工具包

JDK下载

安装JDK

  • 双击安装包进行安装,所有步骤选择默认选项即可

配置环境变量

  • JAVA_HOME=C:\Program Files\Java\jdk1.8.0_151
  • 在Path中添加: %JAVA_HOME%\bin;%JAVA_HOME%\jre\bin;

校验

  • 打开命令行窗口,输入 java -version ,校验命令能否正常执行以及版本信息是否一致

image-20240111201016833

安装JMeter

下载

安装

  • 把下载的安装包,解压到某一目录即可
  • 提示:安装目录中不要出现空格,这将导致远程测试出现问题

环境配置

  • Jmeter环境
  1. 新建JMETER_HOME变量,并添加 jmeter 所在目录
    • 如:-> F:\Jmeter\apache-jmeter-5.1.1
  2. PATH-> %JMETER_HOME%\lib\ext\ApacheJMeter_core.jar;%JMETER_HOME%\lib\jorphan.jar;%JMETER_HOME%\lib\logkit-2.0.jar;

启动验证

  • JMeter启动有多种方式,进入JMeter安装目录下的bin目录
  • 双击 jmeter.bat 即可打开
  • 或者 双击 ApacheJMeter.jar 选择使用java程序打开
  • 或者 命令行输入: java -jar ApacheJMeter.jar

JMeter功能概要

目标

  1. 了解Jmeter文件目录的内容
  2. 了解Jmeter汉化方法
  3. 了解Jmeter主题颜色修改方法

JMeter文件目录介绍

bin目录

  • 存放可执行文件和配置文件

    • jmeter.bat:windows的启动文件

    • jmeter.log:日志文件

    • jmeter.sh:linux的启动文件

    • jmeter.properties:系统配置文件

    • jmeter-server.bat:windows分布式测试要用到的服务器配置

    • jmeter-serve:linux分布式测试要用到的服务器配置

docs目录

  • docs:是JMeter的api文档,可打开 api/index.html页面来查看

printable_docs目录

  • printable_docs的usermanual子目录下的内容是JMeter的用户手册文档
  • usermanual下component_reference.html是最常用到的核心元件帮助文档。
  • 提示:printable_docs的demos子目录下有一些常用的JMeter脚本案例,可以作为参考

lib目录

  • 该目录用来存放JMeter依赖的jar包和用户扩展所依赖的jar包

修改默认配置

汉化配置

  • 实现JMeter界面的汉化包含两种方式:

    • 临时性: 启动JMeter->选择菜单‘Options’->Choose Language->Chinese (Simplified)

    • 永久性:

      • 找到jmeter安装目录下的bin目录,

      • 打开jmeter.properties文件,把第37行修改为“language=zh_CN”,

      • 重启JMeter即可

image-20240113120336655

修改主题

  • JMeter默认主题是黑色的,可以通过以下步骤修改:
    • 启动JMeter -> 选择菜单‘选项’ -> 外观 -> Windows(选择自己喜欢的主题即可)

元件作用域和执行顺序

目标

  1. 熟悉元件的类型与各自的功能
  2. 熟悉元件之间彼此作用域
  3. 掌握元件执行顺序

元件的基本介绍

  • 元件:多个类似功能组件的容器(类似于类)。

  • 常见的元件类型有:

    • 取样器

    • 逻辑控制器

    • 前置处理器

    • 后置处理器

    • 断言

    • 定时器

    • 测试片段

    • 配置元件

    • 监听器

  • 组件:实现独立的某个功能(类似于方法)

元件作用域

  • 在JMeter中,元件的作用域是靠测试计划的树形结构中元件的父子关系来确定的

  • 提示: 核心是取样器,其他组件都是以取样器为核心运行的,组件添加的位置不同,生效的取样器也不同。

  • 作用域的原则

    • 取样器:元件不和其他元件相互作用,因此不存在作用域的问题;
    • 逻辑控制器:元件只对其子节点中的取样器和逻辑控制器作用;
    • 其他六大元件:除取样器和逻辑控制器元件外,如果是某个取样器的子节点,则该元件对其父子节点起作用;
    • 如果其父节点不是取样器,则其作用域是该元件父节点下的其他所有后代节点(包括子节点,子节点的子节点等);
  • 提示:以上元件中还没开始学习,暂时理解jmeter这种树形结构结构影响作用域即可。

元件执行顺序

  • 同一个作用域下不同类型元件 :

    • 配置元件(config elements)

    • 前置处理程序(Per-processors)

    • 定时器(timers)

    • 取样器(Sampler)

    • 后置处理程序(Post-processors)

    • 断言(Assertions)

    • 监听器(Listeners)

  • 提示:

    • 前置处理器、后置处理器、断言等元件功能对取样器起作用(如果在它们的作用域内没有任何取样器,则不会被执行)

    • 如果在同一作用域范围内有多个同一类型的元件,则这些元件按照它们在测试计划中的上下顺序依次执行

JMeter使用示例

目标

  1. 了解jmeter使用方式
  2. 掌握如何使用线程组
  3. 掌握HTTP请求使用
  4. 掌握察看结果树使用

JMeter第一个案例

  • 需求:使用JMeter访问百度首页接口,并查看请求和响应信息

  • 操作步骤 :

    • 启动JMeter
    1. 在‘测试计划’下添加‘线程组’
    2. 在‘线程组’下添加‘HTTP请求’取样器
    3. 填写‘HTTP请求’的相关请求数据
    4. 在‘线程组’下添加‘察看结果树’监听器
    5. 点击‘启动’按钮运行,并查看结果
image-20240111225013727

重点组件

  • 线程组
  • HTTP取样器
  • 查看结果树
  • 提示:无论哪个案例基本都需要以上三个组件,在这里先讲解以上组件。

线程组

  • 说明:线程组是控制JMeter将用于执行测试的线程数,也可以把一个线程理解为一个测试用户。

  • 添加线程组

    • 位置:右键点击‘测试计划’ –> 添加 –> 线程(用户) –> 线程组
  • 线程组的特点

    • 模拟多人操作
    • 线程组可以添加多个,多个线程组可以并行或串行
    • 取样器(请求)和逻辑控制器必须依赖线程组才能使用
    • 线程组下可以添加其他元件下组件
  • 线程组分类

    • 线程组
      • 普通的、常用的线程组,可以看做一个虚拟用户组,线程组中的每一个线程都可以理解为一个虚拟用户
    • setUp线程组
      • 一种特殊类型的线程组,可用于执行预测试操作
    • tearDown线程组
      • 一种特殊类型的线程组,可用于执行测试后工作
  • 线程组参数详解

image-20240111225430676
  • 取样器错误后要执行的动作

    • 继续:如果取样器里的执行出现错误失败的时候,请求不会停止,继续执行。
    • 启动下一进程循环: 忽略错误,线程当前循环错误,执行下一个循环。
    • 停止线程: 只限当前线程停止,不影响其他线程执行
    • 停止测试: 当前执行的线程全部执行完毕后结束
    • 立即停止测试: 立刻停止
  • 线程属性

    • 线程数:虚拟用户数
    • Ramp-Up时间(秒):启动全部虚拟用户数所需要的时间
    • 循环次数:指定次数或勾选永远
    • 延迟创建线程直到需要:测试开始的时候,所有线程就被创建完。勾选了此选项,那么线程只会在合适的需要用到的时候创建.
    • 调度器:勾选后,调度器配置才能使用;
  • 调度器配置

    • 持续时间(秒):设置脚本压测持续时间
    • 启动延迟(秒):启动延迟时间

HTTP请求

image-20240111225551402
  • 位置: 选中线程组->右键->添加->取样器->HTTP请求 作用: 向服务器发送http及https请求
  • 协议:向目标服务器发送HTTP请求时的协议,可以是http或者是https ,默认值为http 。
  • 服务器名称或IP :HTTP请求发送的目标服务器名称或IP地址。
  • 端口号:目标服务器的端口号,默认值为80 。
  • 方法:发送HTTP请求的方法,可用方法包括GET、POST、HEAD、PUT、OPTIONS、TRACE、DELETE等。
  • 路径:目标URL路径(不包括服务器地址和端口)
  • Content encoding :内容的编码方式,默认值为iso8859
  • 同请求一起发送参数:GET请求时url中附带参数可以通过此方式添加消息体数据:POST/PUT请求JSON数据存放地

查看结果树

image-20240111225703417

  • 位置: 选中测试计划/线程组->右键->添加->监听器->察看结果树 作用: 查看请求请求和响应结果
  • 取样结果:查看响应信息头信息、响应状态码
  • 请求:查看请求相关信息(url、方法、参数)
  • 响应:查看响应信息

JMeter案例-访问百度

image-20240113151729761

  • 要求:模拟10个用户并行执行:

image-20240113151757088

  • 要求:模拟10个用户5s内启动完成:

image-20240113151920096

  • 要求:模拟2个用户各循环3次:

image-20240113152014535

  • 要求:模拟2个用户运行30s:

image-20240113152237311

  • 要求:模拟2个用户等待10s后开始执行

image-20240113152341703

HTTP请求携带参数案例

  • 案例—: GET请求, URL为 http:/ /www.baidu.com/S?wd=test要求:使用HTTP请求-路径来传递get请求参数

image-20240113153440064

  • 案例二: GET请求, URL为https:/ /www.baidu.com/S?wd=test要求:使用HTTP请求-参数列表来传递get请求的参数

image-20240113153814394

  • 案例三:POsT请求,URL为https://www.baidu.com/S,请求体为:wd=test(form表单)要求:使用HTTP请求-参数列表来传递POST请求的form格式参数

image-20240113153959902

  • 案例四:POsT请求,URL为http://www.baidu.com/S,请求体为:wd=test(form表单)要求:使用HTTP请求-消息体数据来传递POST请求的form格式参数

image-20240113154144983

JMeter参数化

目标

  • 掌握JMeter中常用的参数化方式
    • 思考:如果循环访问某一请求10次,要求每次请求发送不同的参数值,该怎么做?

定义

  • 参数化测试:把测试数据组织起来,用不同的测试数据调用相同的测试方法。
  • 本质:实现测试数据与测试方法的分离

JMeter参数化常用方式

  • 用户定义的变量
  • 用户参数
  • CSV Data Set Config
  • 函数

用户定义的变量

  • 添加方式:测试计划 –> 线程组–> 配置元件 –> 用户定义的变量

场景

image-20240113155241345

image-20240113155301090

操作步骤

  • 1.添加线程组

  • 2.添加用户定义的变量

  • 3.添加HTTP请求

  • 4.添加查看结果树

  • 用户定义的变量

image-20240111231814816

HTTP请求设置

image-20240111231842098

用户参数

  • 作用:针对同一组参数,当不同的用户来访问时,可以获取到不同的值

  • 添加方式:测试计划 –> 线程组–> 前置处理器 –> 用户参数

场景

  • 请求:https://www.baidu.com
  • 要求:第一次请求附带参数:name="张三"&age=28;第二次请求附带参数:name="李四"&age=30

image-20240113160006555

image-20240113160025694

操作步骤

  • 1.添加线程组

  • 2.添加用户参数

  • 3.添加HTTP请求

  • 4.添加查看结果树

  • 线程组设置 :

image-20240111231947230

  • 用户参数设置

image-20240111232018465

  • HTTP请求设置
    • 参数化格式:${参数名}

image-20240111232045453

  • 运行结果

image-20240111232059004

CSV 数据文件设置

  • 作用:让不同用户在多次循环时,可以取到不同的值

  • 添加方式:测试计划 –> 线程组–> 配置元件 –> CSV 数据文件设置

场景

  • 请求:https://www.baidu.com
  • 要求:循环3次,每次请求时附带参数username,password,code的值不相同

操作步骤

  • 1.定义CSV数据文件

  • 2.添加线程组

  • 3.添加CSV 数据文件设置

  • 4.添加HTTP请求

  • 5.添加查看结果树

  • 定义CSV数据文件 :

image-20240113161223600

  • 线程组设置

image-20240111232218408

  • CSV 数据文件设置

image-20240111232233167

  • HTTP请求设置

image-20240111232247737

参数详解

  • 文件名:CSV文件路径
  • 文件编码:文件编译字符编码,一般设置UTF-8
  • 变量名称:多个变量时,使用英文逗号分隔
  • 忽略首行:True为忽略,False为不忽略,默认值:False
  • 分隔符:如文件中使用的是逗号分隔,则填写逗号;如使用的是制表符,则填写\t;
  • 是否允许带引号: CSV文件中的内容是否允许带引号
  • 遇到文件结束符再次循环:当读取文件到结尾时,是否再从头读取文件,False=当读取文件到结尾时,停止读取文件
  • 遇到文件结束符停止线程:当“遇到文件结束符再次循环”一项为False时起效;True:当读取文件到结尾时,停止进程
  • 线程共享模式:共享模式一般默认即可
    • 所有线程:该文件在所有线程之间共享,所有线程循环取值,线程一取第一行,线程二取下一行
    • 当前线程组:各个线程组分别循环取值
    • 当前线程:每个文件分别为每个线程打开

函数(__counter)

  • 作用 : 计数函数,一般做执行次数统计使用;
  • 位置:在菜单中选择–> 选项 –> 函数助手对话框

函数助手

image-20240111232427709

  • 参数设置
    • TRUE,每个用户有自己的计数器;FALSE,使用全局计数器
    • Name of variable in which to store the result (optional):用于存储结果的变量名(可选)
    • 生成-复制

参数化调用

image-20240111232452163

运行结果

image-20240111232505034

变量作用域问题

  • CSV的作用域是针对线程的,只有两种情况:
  • 对所有线程组中的线程生效
  • 父节点是测试计划,并且线程共享模式是“所有线程”时,对所有线程组中的线程生效
  • 对当前线程组中的线程生效
  • 父节点是某个线程组时,只会对当前线程组生效
  • 用户定义的变量作用域针对的是测试计划
  • 无论用户定义的变量组件放在哪里,他都会针对整个测试计划生效

JMeter断言

定义

  • 断言:让程序自动判断预期结果和实际结果是否一致。

  • 提示:

    • JMeter在请求的返回层面有个自动判断机制(响应状态码)

    • 但是请求成功了,并不代表结果一定正确,因此需要检测机制提高测试准确性。

  • JMeter中常用断言:

    • 响应断言

    • JSON断言

    • 持续时间断言(Duration Assertion)

响应断言

响应断言

  • 作用:对HTTP请求的任意格式的响应结果进行断言
  • 位置:测试计划 –> 线程组–> HTTP请求 –> (右键添加) 断言 –> 响应断言
  • 参数:

image-20240114114348173

参数配置介绍

  • 测试字段:要检查的项(实际结果)

    • 响应文本: 来自服务器的响应文本,即主体

    • 响应代码: 响应的状态码,例如:200

    • 响应信息: 响应的信息,例如:OK

    • Response Headers: 响应头部

    • Request Headers: 请求头部

    • Request Data: 请求数据

    • URL样本: 请求URL

    • Document(text): 响应的整个文档

    • 忽略状态:忽略返回的响应状态码

  • 模式匹配规则:比较方式

    • 包括:文本包含指定的正则表达式

    • 匹配:整个文本匹配指定的正则表达式

    • Equals:整个返回结果的文本等于指定的字符串(区分大小写)

    • Substring:返回结果的文本包含指定字符串(区分大小写)

    • 否:取反

    • 或者:如果存在多个测试模式,勾选代表逻辑或(只要有一个模式匹配,则断言就是OK),不勾选代表逻辑与(所有都必须匹配,断言才是OK)

    • 注意:Equals和Substring模式是普通字符串,而包括和匹配模式是正则表达式

  • 测试模式:预期结果

    • 即填写你指定的结果(可填写多个),按钮【添加】、【删除】是进行指定内容的管理

案例练习

  • 请求:https://www.baidu.com

  • 检查:让程序检查响应数据中是否包含“百度一下,你就知道”

  • 操作步骤:

    • 添加线程组
    • 添加HTTP请求
    • 添加响应断言
    • 添加查看结果树

image-20240114114625111

小结

  • (1)什么时候可以使用响应断言?

    • 任意HTTP请求的响应结果,都可以使用响应断言
  • (2)使用“响应断言”的操作步骤?

    • 添加线程组

    • 添加HTTP请求

    • 添加响应断言

      • 测试字段:要检查的项(实际结果)
      • 模式匹配规则:比较方式
      • 测试模式:预期结果
    • 添加查看结果树

JSON断言

介绍

  • 作用:对HTTP请求的JSON格式的响应结果进行断言
  • 位置:测试计划 –> 线程组–> HTTP请求 –> (右键添加) 断言 –> JSON断言

image-20240114114833339

  • 参数介绍:
    • Assert JSON Path exists:用于断言的JSON元素的路径(实际结果)

    • Additionally assert value:如果您想要用某个值生成断言,请选择复选框

    • Match as regular expression:使用正则表达式断言

    • Expected Value:期望值(期望结果)

    • Expect null:如果希望为空,请选择复选框

    • Invert assertion (will fail if above conditions met):反转断言(如果满足以上条件则失败)

案例练习

image-20240114114940921

小结

  • (1)什么时候可以使用JSON断言?
    • 对HTTP请求的响应结果为JSON格式时,可以使用JSON断言
  • (2)使用“JSON断言”的操作步骤?
    • 添加线程组
    • 添加HTTP请求
    • 添加JSON断言
      • 填写Assert JSON Path exists(实际结果-json路径)
      • 勾选Additionally assert value
      • 填写Expected Value(期望结果)
    • 添加查看结果树

断言持续时间

介绍

  • 作用:检查HTTP请求的响应时间是否超出要求范围
  • 位置:测试计划 –> 线程组–> HTTP请求 –> (右键添加) 断言 –> 断言持续时间

image-20240114115103058

  • 参数介绍:
    • 持续时间(毫秒):HTTP请求允许的最大响应时间(单位:毫秒)。 超过则认为失败

案例

  • 请求: https://www.jd.com

  • 检查:让程序检查响应时间是否大于100毫秒

  • 操作步骤:

    • 添加线程组

    • 添加HTTP请求

    • 添加断言持续时间

    • 添加查看结果树

image-20240114125003115

小结

  • (1)什么时候可以使用断言持续时间?

    • 测试HTTP请求的响应时间是否满足要求时,可以使用断言持续时间
  • (2)使用“断言持续时间”的操作步骤?

    • 添加线程组

    • 添加HTTP请求

    • 添加断言持续时间

      • 填写持续时间(允许的最大响应时间,单位:ms)
    • 添加查看结果树

总结

  • (1)什么是断言?

    • 让程序自动判断预期结果和实际结果是否一致。
  • (2)3种断言方式有何不同?如何选择适当的方式?

    • 响应断言:

      • 场景:可以针对任意格式的响应数据进行断言
    • JSON断言:

      • 场景:当响应数据为JSON格式时,优先使用JSON断言
    • 断言持续时间:

      • 场景:检查HTTP请求的响应时间是否满足要求时,使用断言持续时间
    • 提示:

      • Jmeter会自动判断响应状态码(如果状态码为4xx/5xx,判定为失败)

JMeter关联

介绍

  • 关联:当请求之间有依赖关系,比如一个请求的入参是另一个请求返回的数据,这时候就需要用到关联处理。

  • JMeter中常用的关联方法:

    • 正则表达式提取器

    • XPath提取器

    • JSON提取器

正则表达式提取器

介绍

  • 作用:针对任意格式的响应数据进行提取
  • 位置:测试计划 –> 线程组–> HTTP请求 –> (右键添加) 后置处理器 –> 正则表达式提取器

image-20240114125300194

  • 参数介绍:
    • 引用名称:存放提取出的值的参数名称,供下一个请求引用,如填写title,则可用${title}引用它
    • 正则表达式:
      • 左边界(.*?)右边界
      • ():括起来的部分就是要提取的。
      • .:匹配任何字符串。
      • *:0次或多次。
      • ?:不要太贪婪,在找到第一个匹配项后停止。
    • 模板:用$$引用起来,如果在正则表达式中有多个提取值,则可以是$2$$3$等等,表示解析到的第几个值给title。
      • 如:$1$表示解析到的第1个值
    • 匹配数字:0代表随机取值,-1代表全部取值,1代表取第一个值
    • 缺省值:如果参数没有取得到值,那默认给一个值让它取。

案例

  • 1、请求:http://www.itcast.cn/ ,获取网页的title值

  • 2、请求:https://www.baidu.com/ ,把获取到的title作为请求参数

  • 操作步骤:

    • 添加线程组

    • 添加HTTP请求-传智播客

    • 添加正则表达式提取器

    • 添加HTTP请求-百度

    • 添加查看结果树

image-20240114125532357

image-20240114125537596

小结

  • (1)什么时候可以使用正则表达式提取器?

    • 任意格式的响应数据,都可以使用正则表达式提取器进行提取
  • (2)使用“正则表达式提取器”的操作步骤?

    • 添加线程组

    • 添加HTTP请求-传智播客

    • 添加正则表达式提取器

      • 引用名称:存放提取出的值的参数名称,如填写title
      • 正则表达式:左边界(.*?)右边界
      • 模板:用$$引用起来,表示解析出第几个()的值
      • 匹配数字:1表示第1个值,-1表示所有取值
  • 添加HTTP请求-百度

    • 引用正则表达式中的引用名称。如:用${title}引用它
  • 添加查看结果树

XPath提取器

介绍

  • 作用:针对HTML格式的响应结果数据进行提取

  • 位置:添加方式:测试计划 –> 线程组–> HTTP请求 –> (右键添加) 后置处理器 –> XPath提取器

  • 参数介绍:

    • Use Tidy (tolerant parser):
      • 当需要处理的页面是HTML格式时,必须选中该选项
      • 当需要处理的页面是XML或XHTML格式时,取消选中该选项。
    • 引用名称:存放提取出的值的参数名称
    • XPath Query:用于提取值的XPath表达式
    • 匹配数字:如果XPath路径查询出许多结果,则可以选择提取哪个。
      • 0:表示随机,-1:表示提取所有结果,1表示第一个值
    • 缺省值:参数的默认值

image-20240114130150080

案例

  • 1、请求:http://www.itcast.cn/ ,获取网页的title值

  • 2、请求:https://www.baidu.com/ ,把获取到的title作为请求参数

  • 操作步骤:

    • 添加线程组
    • 添加HTTP请求-传智播客
    • 添加XPath提取器
    • 添加HTTP请求-百度
    • 添加查看结果树

image-20240114130258901

小结

  • (1)什么时候可以使用XPATH提取器?
    • 针对HTML格式的响应数据,可以使用XPATH提取器进行提取
  • (2)使用“Xpath提取器”的操作步骤?
    • 添加线程组
    • 添加HTTP请求-传智播客
    • 添加XPATH提取器
      • 勾选Use Tidy (tolerant parser)
      • 引用名称:存放提取出的值的参数名称。如:填写title
      • XPath Query:用于提取值的XPath表达式
      • 匹配数字:0:表示随机,-1:表示提取所有结果,1表示第一个值
    • 添加HTTP请求-百度
      • 引用正则表达式中的引用名称。如:用${title}引用它
    • 添加查看结果树

JSON提取器

介绍

  • 作用:针对JSON格式的响应结果数据进行提取

  • 位置:添加方式:测试计划 –> 线程组–> HTTP请求 –> (右键添加) 后置处理器 –> JSON提取器

  • 参数介绍:

    • Names of created variables:存放提取出的值的参数名称

    • JSON Path Expressions:JSON路径表达式

    • Match No:如果JSON路径匹配出许多结果,则可以选择提取哪个。

      • 0:表示随机,-1:表示提取所有结果,1表示第一个值
    • Default Values:参数的默认值

image-20240114130501596

案例

image-20240114130550588

小结

  • (1)什么时候可以使用JSON提取器?
    • • 针对JSON格式的响应数据,可以使用JSON提取器进行提取
  • (2)使用“JSON提取器”的操作步骤?
    • 添加线程组
    • 添加HTTP请求-天气
    • 添加JSON提取器
      • Names of created variables:存放提取出的值的参数名称。如:city
      • JSON Path Expressions:用于提取值的JSON路径表达式
      • Match No: 0:表示随机,-1:表示提取所有结果,1表示第一个值
    • 添加HTTP请求-百度
      • 引用正则表达式中的引用名称。如:用${city}引用它
    • 添加查看结果树

JMeter属性

配置函数

  • __setProperty函数:将值保存成JMeter属

image-20240114130741527

  • __property函数:在其他线程组中使用property函数读取属性

image-20240114130802405

函数执行

  • __setProperty函数执行(保存JMeter属性):
    • 需要通过BeanShell取样器来执行

image-20240114130842129

  • __property函数(读取属性)
    • 在其他线程组中使用property函数

image-20240114130902808

案例

image-20240114130955481

小结

  • (1)什么时候需要使用JMeter属性?
    • 需要实现跨线程组的数据传递时,可以使用JMeter属性
  • (2)使用“JMeter属性”的操作步骤?
    • 添加线程组1
    • 添加HTTP请求-天气
    • 添加JSON提取器
    • 添加BeanShell取样器(将JSON提取器提取的值保存为JMeter属性)
      • 保存JMeter属性:${__setProperty(pro_city,${city},)}
    • 添加线程组2
    • 添加HTTP请求-百度(读取JMeter属性)
      • 读取JMeter属性:${__property(pro_city,,)}
    • 添加查看结果树

image-20240114131038623

总结

  • (1)什么是关联?

    • 当请求之间有依赖关系,比如一个请求的入参是另一个请求返回的数据,这时候就需要用到关联处理。
  • (2)几种关联方式有何不同?如何选择适当的方式?

    • 同一个线程组内,多个请求之间的关联:

      • 如果响应数据为JSON格式,优先使用JSON提取器进行关联

      • 如果响应数据为HTML格式,优先使用XPath提取器进行关联

      • 如果JSON提取器和XPath提取器都无法实现关联,使用正则表达式提取器进行补充 —— 针对任意格式的响应数据

    • 不同线程组之间,多个请求之间的关联:

      • JSON提取器 + JMeter属性

      • XPath提取器 + JMeter属性

      • 正则表达式提取器 + JMeter属性

JMeter录制脚本

录制原理

  • JMeter录制脚本:在没有接口文档的旧项目当中,快速录制web页面产生的http接口请求,帮助编写接口测试脚本。

  • JMeter录制脚本原理:

    • 正常请求过程

image-20240114171450388

  • 录制时,JMeter作为代理服务器来拦截和转发请求与响应数据
    • JMeter录制过程

image-20240114171523678

录制脚本操作步骤

  • 01 添加HTTP代理服务器,并进行配置
    • 加HTTP代理服务器:
      • 测试计划(右键)->非测试元件->HTTP代理服务器
      • 配置代理服务器的参数
  • 02 开启windows操作系统的浏览器代理

image-20240114171648706

  • window 10 代理设置

image-20240114171706376

  • 03 启动代理服务器,开始录制

image-20240114171758272

image-20240114171805662

image-20240114171810536

  • 04 在浏览器页面中进行操作,成功后,就能在JMeter当中看到抓取到的接口请求了。

image-20240114171847030

小结

  • (1)什么时候需要使用JMeter录制脚本?
  • • 在没有接口文档的旧项目当中,通过录制http接口请求的方式,来快速编写接口测试脚本。
  • (2)JMeter录制脚本的操作步骤?
    • 添加HTTP代理服务器,并进行配置
      • • 设置端口:代理服务器的端口号
      • • 目标控制器:录制的脚本放到哪个容器(线程组)中
      • • Requests Filtering(过滤条件 – url匹配正则表达式):
        • • 包含模式:包含此项。如:.*localhost.*
        • • 排除模式:不包含此项 如:.*.jpg .*.png .*.js
  • 开启windows操作系统的浏览器代理
    • • 配置浏览器代理:JMeter代理服务器的IP、端口号
  • 启动代理服务器,开始录制
  • 在浏览器页面中进行操作,成功后,就能在JMeter当中看到抓取到的接口请求了

JMeter直连数据库

使用场景

image-20240114172132376

关键配置

  • 直连数据库的关键配置:
    • 添加MySQL驱动jar包
    • 方式一:在测试计划面板点击“浏览…“按钮,将你的JDBC驱动添加进来
    • 方式二:将MySQL驱动jar包放入到lib/ext目录下,重启JMeter

image-20240114172217667

  • 配置数据库连接信息

    • 添加方式:测试计划 –> 线程组–> (右键添加) 配置元件 –> JDBC Connection Configuration
  • 参数介绍:

    • Variable Name: mysql数据库连接池名称(JDBC请求时要引用)

    • Database URL: jdbc:mysql://localhost:3306/tpshop2.0

    • 组成:协议 + 数据库IP + 数据库端口 + 连接的数据库名称

    • JDBC DRIVER class: com.mysql.jdbc.Driver(MySQL驱动包位置固定格式 —— 下拉框选择)

    • Username: root(连接数据库用户名,如实填写)

    • Password:(MySQL数据库密码,如实填写,如果密码为空不写)

image-20240114172247651

  • 添加JDBC请求

    • 添加方式:测试计划 –> 线程组–> 取样器 –> JDBC Request
  • 参数介绍:

    • Variable Name:数据库连接池的名字,需要与JDBC Connection Configuration的Variable Name Bound Pool名字保持一致

    • Query Type:

      • 查询操作:选择“Select Statement”

      • 增加、删除、修改操作:选择“Update Statement”

    • Query:填写的SQL语句,未尾不要加“;”

    • Variable names:保存SQL语句返回结果的变量名

image-20240114172333394

案例一

  • 连接tpshop商城数据库获取商品名包含:小米手机5 的商品id

  • 准备工作:

    • 1、启动tpshop数据库服务器
    • 2、添加MySQL驱动jar包
  • 操作步骤:

    • 添加线程组
    • 添加 JDBC Connection Configuration
    • 添加 JDBC request
    • 添加查看结果树

案例二

  • 1、连接tpshop商城数据库获取商品名包含:小米手机5 的商品id(假设上一个案例的查询结果ID为65)

  • 2、在tpshop首页中搜索商品名”小米手机5”,请求URL:http://127.0.0.1/Home/Goods/search.html 请求方法:GET, 请求参数:q=小米手机5

  • 3、在搜索的响应数据中检查是否有该商品对应的商品链接:/Home/Goods/goodsInfo/id/65.html

  • 操作步骤:

    • 添加线程组
    • 添加 JDBC Connection Configuration
    • 添加 JDBC request
    • 添加 HTTP请求 - 搜索商品
    • 在搜索HTTP请求下,添加响应断言,检查响应结果中的字符 是否包含 商品URL(URL中含ID)
    • 添加查看结果树

小结

  • (1)什么时候需要使用JMeter直连数据库?
    • • 用作请求的参数化
    • • 用作结果的断言
    • • 清理测试数据
    • • 准备测试数据
  • (2)JMeter直连数据库?
    • 添加MySQL驱动jar包
      • 在测试计划面板点击“浏览…“按钮,将你的JDBC驱动添加 —— 本脚本可用
      • 将MySQL驱动jar包放入到lib/ext目录下,重启JMeter —— 所有脚本可用
    • 配置数据库连接信息
      • 数据库连接池名称、数据库URL(协议 + 数据库IP + 数据库端口 + 连接的数据库名称)、数据库驱动包(下拉框选择)、数据库用户名密码
    • 添加JDBC请求
      • 数据库连接池名称、 Query Type、SQL语句、查询结果保存的变量名

JMeter逻辑控制器

介绍

  • 逻辑控制器: 可以按照设定的逻辑控制取样器的执行顺序

  • JMeter中常用的逻辑控制器:

    • 如果(If)控制器

    • 循环控制器

    • ForEach控制器

如果(If)控制器

介绍

  • 作用:If控制器用来控制它下面的测试元素是否运行

  • 位置:测试计划 –> 线程组–> (右键添加) 逻辑控制器 –> 如果(If)控制器

  • JS语法形式 :

image-20240114172759578

  • 函数形式

image-20240114172808931

案例

  • 1、使用‘用户定义的变量’定义一个变量name,name的值可以是‘baidu’或‘itcast’

  • 2、根据name的变量值实现对应网站的访问

  • 操作步骤:

    • 添加线程组

    • 用户定义的变量

    • 添加If控制器,判断name是否等于baidu

    • 添加HTTP请求,用来访问百度

    • 添加If控制器,判断name是否等于itcast

    • 添加HTTP请求,用来访问传智播客

    • 添加查看结果树

小结

  • (1)IF控制器的作用是什么?

    • 用来控制它下面的测试元素是否运行
  • (2)使用“IF控制器”的操作步骤?

    • 添加线程组

    • 用户定义的变量

    • 添加If控制器,判断name是否等于baidu

      • 不勾选 Interpret Condition,'${name}' == 'baidu‘
      • 勾选,${__jexl3('${name}' == 'baidu',)}
    • 添加HTTP请求,用来访问百度

    • 添加If控制器,判断name是否等于itcast

    • 添加HTTP请求,用来访问传智播客

    • 添加查看结果树

循环控制器

介绍

  • 作用:通过设置循环次数,来实现循环发送请求
  • 位置:测试计划 –> 线程组–> (右键添加) 逻辑控制器 –> 循环控制器
  • 参数介绍:

image-20240114173027411

案例

  • 循环访问百度10次

  • 操作步骤:

    • 添加线程组

    • 添加循环控制器

    • 添加HTTP请求

    • 添加查看结果树

小结

  • (1)循环控制器的作用是什么?

    • • 通过设置循环次数,来实现循环发送请求
  • (2)使用“循环控制器”的操作步骤?

    • 添加线程组

    • 添加循环控制器 —— 设置循环次数

    • 添加HTTP请求

    • 添加查看结果树

  • 思考:线程组属性可以控制循环次数,那么循环控制器有什么用?

ForEach控制器

介绍

  • 作用:
    • 一般和用户自定义变量或者正则表达式提取器一起使用,读取返回结果中一系列相关的变量值。
    • 该控制器下的取样器都会被执行一次或多次,每次读取不同的变量值。
  • 位置:测试计划 –> 线程组–> (右键添加) 逻辑控制器 –> ForEach控制器

image-20240114173230526

  • 参数介绍:
    • 输入变量前缀:要读取的输入变量的固定前缀

    • 开始循环字段:要读取的输入变量后缀数字的最小值-1

    • 结束循环字段:要读取的输入变量后缀数字的最大值

    • 输出变量名称:读取输入变量的值后保存的新变量名,用于后续HTTP请求来引用

image-20240114173249562

案例一

  • 1、有一组关键字 [hello,python,测试],使用用户定义的变量存储

  • 2、要依次取出关键字,并在百度搜索,例如:https://www.baidu.com/s?wd=hello

  • 操作步骤:

    • 添加线程组
    • 添加用户定义的变量
    • 添加ForEach控制器
    • 添加HTTP请求-百度
    • 添加查看结果树

image-20240114173417648

案例二

image-20240114173502920

小结

  • (1)ForEach控制器的作用是什么?
    • • 一般和用户自定义变量或者正则表达式提取器一起使用,读取返回结果中一系列相关的变量值
  • (2)使用“ForEach控制器”的操作步骤?
    • 添加线程组
    • 添加用户定义的变量/正则表达式提取器
      • • 返回一组变量: 相同的变量名+连续的数字后缀,如:name_1..name_3
    • 添加ForEach控制器
      • • 输入变量前缀:要读取的输入变量的固定前缀,如:name
      • • 开始循环字段:要读取的输入变量后缀数字的最小值-1,如:0
      • • 结束循环字段:要读取的输入变量后缀数字的最大值,如:3
      • • 输出变量名称:读取输入变量的值后保存的新变量名,如word
    • 添加HTTP请求-百度
      • • 引用ForEach控制器中保存的新变量名,如:${word}
    • 添加查看结果树

JMeter定时器

同步定时器

介绍

  • 同步定时器:阻塞线程(累积一定的请求),当在规定的时间内达到一定的线程数量,这些线程会在同一个时间点一起释放,瞬间产生很大的压力。

  • 提示:在JMeter中叫做同步定时器,在Loadrunner中又叫集合点

参数设置

  • 位置:测试计划 –> 线程组–> HTTP请求 –> (右键添加) 定时器 –> Synchronizing Timer

image-20240114173818302

  • 参数介绍:
    • Number of Simulated Users to Group by:模拟用户的数量,即指定同时释放的线程数数量。

    • 若设置为0,等于设置为线程组中的线程数量

    • Timeout in milliseconds:超时时间,即超时多少毫秒后同时释放指定的线程数;

    • 如果设置为0,该定时器将会等待线程数达到了设置的线程数才释放,若没有达到设置的线程数会一直死等。

    • 如果大于0,那么如果超过Timeout in milliseconds中设置的最大等待时间后还没达到设置的线程数,Timer将不再等待,释放已到达的线程。默认为0

案例

  • 模拟100个用户同时访问百度首页,统计各种高并发情况下运行情况

  • 操作步骤:

    • 添加线程组,设置线程数=100

    • 添加HTTP请求

    • 添加同步定时器,并发数可分别设置20/30人

    • 添加查看结果树

    • 添加监听器-聚合报告

image-20240114173906207

小结

  • (1)什么时候需要使用同步定时器?
    • 测试抢购、秒杀或者抢红包等高并发的场景时使用
  • (2)使用同步定时器的操作步骤?
    • 添加线程组,设置线程数为n
    • 添加HTTP请求
    • 添加同步定时器
      • 设置并发线程数:同时发送请求的虚拟用户数
      • 设置超时时间:
        • 建议设置:不设置的话,若没有达到设置的线程数会一直死等
        • 不能设置太小:等待时间后还没达到设置的线程数,会释放已到达的线程
    • 添加查看结果树
    • 添加监听器-聚合报告

常数吞吐量定时器

介绍

  • 作用:让JMeter按指定的吞吐量执行,以每分钟为单位。
  • 位置:测试计划 –> 线程组–> HTTP请求 –> (右键添加) 定时器 –> Constant Throughput Timer

image-20240114174129839

  • 参数介绍:

    • Target throughput(in samples per minute):目标吞吐量。注意这里是每个用户每分钟发送的请求数
  • 案例要求:

    • 模拟用户真实的业务场景要求:20 QPS

    • 如果线程数设置为1,则目标吞吐量设置为 20 * 60 = 1200

    • 如果线程数设置为2,则目标吞吐量设置为 20 * 60 / 2 = 600

案例

  • 用户以 20QPS (20 次/s) 的频率访问百度首页,持续一段时间,统计运行情况

  • 操作步骤:

    • 添加线程组,循环次数设置成永远

    • 添加HTTP请求

    • 添加常数吞吐定时器

    • 添加查看结果树

    • 添加监听器-聚合报告

      • • 查看聚合报告的 Throughput 字段,实际值围绕设置的QPS值上下波动

image-20240114174242230

小结

  • (1)什么时候需要使用常数吞吐量定时器?

    • • 需要按指定的吞吐量发送请求时,可以使用常数吞吐量定时器
  • (2)使用常数吞吐量定时器的操作步骤?

    • 添加线程组,循环次数设置成永远

    • 添加HTTP请求

    • 添加常数吞吐定时器

      • 设置目标吞吐量:每个用户每分钟发送的请求数
      • 计算方法:要求QPS * 60 / 线程数
    • 添加查看结果树

    • 添加监听器-聚合报告

JMeter分布式

引入

  • 在使用JMeter进行性能测试时如果项目需要支持 10000 用户并发但是单台电脑只能支持 10O0 个用户并发该怎么处理?
    • Jmeter分布式测试

分布式执行原理

image-20240114174517989

  • JMeter分布式测试时,选择其中一台作为控制机(Controller),其它机器做为代理机(Agent)。
    • 执行时,控制机会把脚本发送到每台代理机上

    • 代理机拿到脚本后就开始执行,代理机执行时不需要启动JMeter界面,可以理解它是通过命令行模式执行的。

    • 执行完成后,代理机会把结果回传给控制机,控制机会收集所有代理机的信息并汇总。

分布式配置

  • 配置 —— 修改 bin/jmeter.properties 文件:

  • 代理机:

    • 修改服务端口: 保证每个代理机都能正常启动。如果是在同一台机器上演示需要使用不同的端口,多台机器可以不修改。例如:server_port=2999
    • 将RMI SSL设置为禁用。例如:server.rmi.ssl.disable=true
  • 控制机:

    • 配置代理机远程地址:配置每个代理机的IP+port,多个代理机之间用‘,’连接
      • 例如: remote_hosts=192.168.182.100:1099, 192.168.182.101:2999
    • 将 RMI SSL设置为禁用。例如:server.rmi.ssl.disable=true

分布式执行

  • 执行
    • 代理机(命令行方式启动):

    • 进入bin目录,运行jmeter-server.bat文件,启动 JMeter

image-20240114174802928

  • 控制机(界面方式启动):
    • 进入bin目录,运行jmeter.bat文件,启动JMeter
    • 选择菜单:运行–>远程启动/远程全部启动

image-20240114174820403

练习

  • 1、请求:https://www.baidu.com

  • 2、一台控制机和两台执行机,做分布式;要求控制机启动,两台执行机执行,反馈结果

  • 操作步骤:

    • 配置代理机一,并启动

    • 配置代理机二,并启动

    • 配置控制机,并启动

    • 添加线程组

    • 添加HTTP请求 – 百度

    • 添加查看结果树

小结

  • (1)什么时候需要使用分布式?
    • 单台测试机无法满足用户要求的负载量时,使用多台机器来模拟
  • (2)JMeter分布式测试的原理?
    • 执行时,控制机会把脚本发送到每台代理机上
    • 代理机拿到脚本后就开始执行,接收服务器返回的响应
    • 执行完成后,代理机会把结果回传给控制机
  • (3)JMeter分布式的配置和使用?
    • 配置:
      • 代理机:修改服务端口server_port,禁用RMI SSL开关
      • 控制机:配置代理机远程地址remote_hosts,禁用RMI SSL开关
    • 使用:
      • 代理机:命令行方式启动,运行jmeter-server.bat文件
      • 控制机:运行jmeter.bat文件,启动JMeter,运行–>远程启动/远程全部启动