书籍目录
1- JMeter 概述
2- 下载与安装
3- 界面介绍
4- 目录结构
5- 核心组件
6- 基础配置
7- 测试计划
8- 线程组
9- HTTP 协议
10- HTTP Request 取样器
11- HTTP 信息头管理器
12- 查看结果树
13- 实例:录制登录脚本
14- HTTP 请求默认值
15- HTTP Cookie 管理器
16- HTTP 缓存管理器
17- 用户定义的变量
18- 计数器
19- 随机变量
20- CSV 数据文件设置
21- 用户参数
22- 正则表达式提取器
23- JSON 提取器
24- 调试取样器
25- 实例:查看电子书
26- 数据输入函数
27- 数据计算函数
28- 如果(If)控制器
29- 事务控制器
30- 循环控制器
31- ForEach 控制器
32- 交替控制器
33- 仅一次控制器
34- 随机控制器
35- 随机顺序控制器
36- 吞吐量控制器
37- Switch 控制器
38- 固定定时器
39- 统一随机定时器
40- 同步定时器
41- 响应断言
42- JSON 断言
43- 大小断言
44- 断言持续时间
45- 常用监听器
46- HTTP 代理服务器
47- 自动录制 WEB 脚本
48- 优化脚本
49- JDBC Connection Configuration
50- JDBC Request
51- JMeter 连接数据库
52- 数据库 insert、select、update、delete 操作
53- 数据库 INSERT 批量数据
54- 数据库 INSERT 加密数据
55- 获取 Select 结果集中某个值
56- 非GUI模式负载测试
57- HTML测试报表分析
490
JMeter 接口性能测试
免费
共57小节
Apache JMeter 是 Apache 组织基于 Java 开发的一款非常优秀开源的压力测试工具。我们将介绍JMeter的安装和使用场景、核心组件,以及Jmeter连接数据库的操作。相信,通过本书的学习,您将对JMeter不在陌生,并能很好地完成自己的项目测试!
离线

焦小灰

私信

1- JMeter 概述

大家好,本书给大家介绍下接口压力测试工具-- JMeter

通过本书的阅读,您将了解 JMeter 应用场景,掌握 JMeter 常用核心组件和接口脚本录制的方法和技巧、熟知 JMeter 连接数据库进行增删改查操作,批量生成测试数据,以及 JMeter 进行压力测试实例,从而更好地应对实际应用中的性能问题。相信,通过本书的学习,您将对 JMeter 不在陌生,并能很好地完成自己的项目测试!

1.1 简介

Apache JMeter 是 Apache 公司基于 Java 开发的压力测试工具,用于对软件做压力测试。因为其简单易用,现在也被社区作为接口测试工具。

Apache Software Foundation 的 Stefano Mazzocchi 是 JMeter 的最初开发人员。起初是为了测试 Apache JServ 的性能(一个后来被Apache Tomcat 项目替代的项目)。后续的开发者重新设计了 JMeter,增强了 GUI 并添加了对功能测试的支持。

我们希望看到随着开发人员利用插件架构的优势,JMeter 的能力能够迅速扩展。将来开发的主要目标使得 JMeter 尽可能地变成一个有用的回归测试工具,而不仅是 JMeter 的压力测试能力。

1.2 原理

JMeter的基本原理是模拟多用户并发访问应用程序,通过发送HTTP请求或其他协议请求,并测量响应时间、吞吐量、并发用户数、错误率等性能指标,以评估应用程序的性能和稳定性。

1.3 应用场景

  • 功能/回归测试

通过创建带有断言的脚本来验证程序返回了你期望的结果;为了最大限度的灵活性,JMeter 允许使用正则表达式创建断言

JMeter 无法验证 JS 程序,也无法验证页面UI,所以必须要和 selenium 配合来完成web2.0应用的测试

  • 数据库测试

通过 JMeter JDBC元件对数据库进行增删改查,也可以批量生成测试数据

  • 压力测试

JMeter 最初被设计用于 Web 应用测试,但后来扩展到其他测试领域,它可以用于测试静态和动态资源,例如静态文件、Java 小服务程序、 CGI脚本、Java对象、数据库、FTP服等器等等。JMeter可以用于对服务器、网络或对象模拟巨大的负载,来自不同压力类别下测试它们的强度和分析整体性能

1.4 特点

  • 开源免费

因为 JMeter 开源免费、简单易用且功能强大,所以得到广泛应用

  • 支持多协议

JMeter 支持多种协议,比如 HTTPHTTPSJavaFTPTCP

  • 支持录制脚本

JMeter 支持通过录制/回放方式获取测试脚本,可以录制WEB、APP不同架构的脚本

  • 模拟多用户并发

JMeter 可以用于对服务器、网络或对象模拟巨大的负载,来自不同压力类别下测试它们的强度和分析整体性能

  • 支持多种测试结果显示

支持多种测试结果收集和显示方式,包括聚合报告、图形结果、树形结果和控制台输出等,便于性能分析和优化

  • 支持插件和扩展

JMeter 支持插件和扩展,可以扩展其功能和性能,以满足特定的性能测试需求,比如 jxl.jar包、mysql-connector-j-8.1.0驱动等

1.5 JMeter 与 LoadRunner

比较点 JMeter LoadRunner
免费 开源免费 需破解,破解的并发数用户数有限制,如果需要更多并发需使用商业版
安装 体积小、易安装 体积大、安装时间长
跨平台 Java 编写,支持多种操作系统和跨平台操作 界面仅支持 windows,压力机支持 Linux
功能性方面 比较强大,常用协议使用时与 LR 相差不大 非常强大,协议多
界面体验 稍弱
脚本录制 比较方便 非常方便
性能指标分析 界面稍弱 界面友好、功能强大
学习成本 入门快,学至后面需要掌握 Java 语言 入门较快,学至后面需要 C 语言
软件性能 中等
  • 在目前市场来讲,Jmeter 为必备技能、LoadRunner 为加强技能(个人技能)

  • Jmeter 为一款轻量级、跨平台、功能强大的压力测试工具,目前市场热度已然超过 LoadRunner

工具只是一种形式,无论是性能测试还是功能自动化测试,在学至后面,本质是一种测试编程,工具只是简化了一些功能,但并不能完全替代;Jmeter、LoadRunner 任意掌握一种,就算以后有需要学习其它的,也会变得简单很多。

2- JMeter 下载与安装

2.1 配置 Java 环境

因为 jMeter 运行依赖 Java 环境,所以在安装 jMeter 之前需要安装配置 jdk

2.1.1 下载 jdk

官网下载:https://www.oracle.com/java/technologies/downloads/#java8-windows

注意:官网下载需要登录,没有可以注册,需要下载 jdk1.8 以上版本,也可以选择 Java archive 历史版本,根据自己的电脑配置选择想要的版本

Description

下载完成

Description

2.1.2 安装 jdk

双击 jdk.exe安装包一直下一步安装,就可以了

Description

Description

2.1.3 配置 jdk 环境变量

  • 计算机—>右键属性—>高级系统设置—>环境变量

    Description

配置系统环境变量:

  • 新增JAVA_HOME变量,值是jdk安装路径

  • 添加CLASSPATH变量,值 .;%JAVA_HOME%\lib\dt.jar;%JAVA_HOME%\lib\tools.jar;

  • 添加path变量,值 %JAVA_HOME%\bin;%JAVA_HOME%\jre\bin;

  • 打开cmd,输入 java -version 验证 jdk 是否配置成功

    Description

    可以看到 jdk 版本号,至此,我们的Java环境算是配好了。

2.2 JMeter 下载与安装

2.2.1 JMeter 下载

官网下载:https://jmeter.apache.org/

点击Download Releases —> 选择Binaries压缩文件,进行下载

这是最新版本,也可以选择 Archive 历史版本下载。

Description

下载完成后,直接解压就可以

Description

2.2.2 配置 Jmeter 环境变量

配置系统环境变量:

  • 新增JMETER_HOME,值用jmeter的安装路径

  • 添加CLASSPATH变量,值是 %JMETER_HOME%\lib\ext\ApacheJMeter_core.jar;%JMETER_HOME%\lib\jorphan.jar;

  • 添加path变量,值 %JMETER_HOME%\bin;

  • 打开cmd,输入 Jmeter --version 验证 jdk 是否配置成功

    image

    可以看到 JMeter 版本号,说明环境配置成功

2.3 启动jmeter

双击bin目录下的 jmeter.bat 文件

Description

我们发现Jmeter已经打开,就可以进行接口测试了!

注意:使用Jmeter时,不要关闭这个命令窗口,不然Jmeter会退出

Description
Description

至此,我们的 JMeter 就安装完成了。

3- JMeter 界面介绍

JMeter 有 2 种运行模式 CLIGUICLI 模式后面压力测试的时候给大家讲解,本节主要说明 JMeter GUI 的图形用户界面。

JMeter 图形用户界面可以分为三部分:

image

3.1 菜单工具栏

3.1.1 菜单栏

菜单栏和工具栏有些功能是重叠的

image

1. File/文件: 新建、保存、打开、重启、退出测试计划等操作

2. Edit/编辑: 选中JMeter元件可以复制、粘贴、禁用、删除等操作,不同的元件 Edit 菜单略有不同

3. Search/查找: 击后弹出查找对话框,支持正则

4. Run/运行: 运行脚本,有启动、忽略定时器启动、停止、关闭、清除等

5. Options/选项: 这里可以设置缩放页面大小、展开折叠目录树、修改语言、日志级别等

6. tools: 函数助手、导出报告

3.1.2 工具栏

工具栏包含了常用的功能按钮,总共24个
image

1. 新建测试计划

2. 模版: 主要是一些请求不知道怎么设置时可以选择预制的一些模板,不怎么常用

3. 打开: 打开 **.jmx 脚本文件

4. 保存测试计划: 保存当前计划为 .jmx 脚本文件

5. 删除: 删除目录树中选中的元件,如果是父节点,那么其子节点也会一同被删除

6. 复制: 复制元件

7. 粘贴: 粘贴元件

8. 全部展开: 全部展开当前测试计划的目录树

9. 全部折叠: 全部折叠当前测试计划的目录树

10. 禁用或启用: 禁用或启用元件,如果是父节点,那么其子节点也会一同被禁用

11. 启动: 启动测试计划

12. 不停顿开始: 启动测试计划,忽略定时器

13. 停止: 直接把所有线程停掉,类似于“杀进程”

14. 关闭: 等当前线程执行完成后结束线程,从实际效果来看,停止比关闭更快

15. 清除: 清除响应数据,比如查看结果树,聚合报告,但不能清除日志控制台

16. 全部清除: 清除全部数据,包括日志

17. 查找: 点击后弹出查找对话框,支持正则

18. 清除查找

19. 函数助手: 在做参数化时会用到,点击后弹出对话框

20. 帮助文档: 点击后,浏览器会打开JMeter官方帮助文档

21. 脚本执行耗时,精度为秒

22. 错误日志个数: 点击后会打开日志控制台

23. 正在运行线程数 / 总线程数

24. 运行状态: 启动运行测试计划后变绿色

3.2 目录树

目录树,是一个树状结构的目录,根节点只有 1 个叫测试计划,每 1 个测试计划就是 1 个**.jmx 测试脚本。

在根节点测试计划下,可以添加线程组、配置元件、监听器、定时器、前置处理器、后置处理器、断言、Test Fragment、非测试元件等 JMeter 组件。

image

在测试计划下,必须添加线程组,因为 JMeter 就是用线程来模拟用户的。

添加了线程组以后,在线程组下可以添加取样器、逻辑控制器、前置处理器、后置处理器、断言、定时器、Test Fragment、配置元件、监听器。

注意:取样器和逻辑控制器在测试计划中不能添加,只能在线程组中添加

image

3.3 元件属性面板

元件属性面板区是用来编辑元件属性的,当在左侧目录树选中某个元件后,右侧的属性面板区会切换到当前选中元件的属性项。

启动 JMeter 后的默认面板区是测试计划的属性面板,因为启动后只有测试计划根节点,属性面板区是使用 JMeter 时访问最多的一块区域。

4- JMeter 目录结构

由于Jmeter是一款开源免安装软件,解压即可用,所以我们需要对其目录结构有所了解,这样可以更方便的使用 JMeter 以及为后续需要的持续集成做准备。

image

4.1 backups

备份的 .jmx 脚本目录,防止误删脚本,所有的脚本都会自动备份在里面

image

4.2 bin

可执行文件目录,该目录存放的是Jmeter的主jar包、相关的启动脚本、配置文件和日志文件等。

image

  • examples:目录中有CSV样例

  • Jmeter.bat:windows下 jmeter 的启动脚本

里面可以对 jmeter 启动时的很多参数进行配置,比如修改 JVM 内存大小:

set HEAP=-Xms1g -Xmx1g -XX:MaxMetaspaceSize=1024m

-Xms:JVM初始分配的堆内存。表示初始化JAVA堆的大小及该进程刚创建出来的时候,他的专属JAVA堆的大小,一旦对象容量超过了JAVA堆的初始容量,JAVA堆将会自动扩容到-Xmx大小。

-Xmx:JVM最大允许分配的堆内存,按需分配。表示java堆可以扩展到的最大值,在很多情况下,通常将-Xms和-Xmx设置成一样的,因为当堆不够用而发生扩容时,会发生内存抖动影响程序运行时的稳定性。

这里我们将 -Xms  -Xmx设置成 1个g

MaxMetaspaceSize:jvm中的元数据区, 默认是256,一般设置为1024m就够了

配置内存大小,不能超过物理内存的50%
  • shutdown.cmd:windows下jmeter关闭文件

  • stoptest.cmd:windows下jmeter测试停止文件

  • jmeter.log:jmeter运行日志文件,比如输出信息、警告、报错都在这里进行了记录

  • jmeter.sh:linux的启动文件

  • jmeter.properties:系统配置文件,JMeter核心文件,Jmeter有80%的配置操作都是在该文件中进行的

其中系统配置文件 jmeter.properties 中的SSL设置重点关注如下几个:

指定HTTPS协议层:https.default.protocol=TLS

指定SSL版本:https.default.protocol=SSLv3

设置启动的协议:https.socket.protocols=SSLv2Hello SSLv3 TLSv1

缓存控制,控制SSL是否可以在多个迭代中重用:https.use.cached.ssl.context=true

修改配置文件,一般都需要重启才会生效
  • jmeter-server.bat:windows分布式测试要用到的服务器配置,该脚本是用来启动远程代理的,用于联机负载的

  • jmeters-server:linux分布式测试要用的服务器配置

注意:每一个 .cmd 文件都对应一个 .sh 文件,.sh 是 Linux 下的对应功能的文件

4.3 docs

该目录存放的是 jmeter 官方的API文档,主要是帮助工程师去了解和二次开发 Jmeter

image

4.4 extras

扩展插件目录,该目录下存放的是 Jmeter 和其他应用集成所需要的一些文件和模板,目录下的文件提供了 ant 支持
image

4.5 lib

所用到的插件目录,里面全是jar包。

该目录是 jmeter 启动时的默认 classpath ,这就意味着所有在 jmeter 运行过程中,需要被引用(import)的类或者jar包都必须存放在该目录下,jmeter 会自动在jmeter_HOME/libext目录下寻找需要的类,lib 下存放 JMeter 所依赖的外部jar:如 jxl.jar、mysql-connector-j-8.1.0.jar`等。

其中 lib\ext 目录下存放有 Jmeter 依赖的核心jar包,ApacheJMeter_core.jar、ApacheJMeter_java.jar 在写 client 端需要引用,JMeter 插件包也在此目录下。

image

4.6 licenses

软件许可证书文件,不用管

4.7 printable_docs

jmeter 用户手册,其中 component_reference.html 是最常用的核心元件帮助手册

image

至此,JMeter 目录结构我们都有所了解。

5- JMeter 核心组件

JMeter 涉及的组件共有八大类,每一类下面有好多个元件,而日常工作中,我们只需要掌握一些核心元件即可满足测试需求。

image

5.1 逻辑控制器(Logic Controller)

JMeter官网对逻辑控制器的解释是:Logic Controllers determine the order in which Samplers are processed,意思是说 逻辑控制器可以控制取样器(samplers)的执行顺序。

由此可知,控制器需要和取样器一起使用,否则控制器就没有什么意义了。 放在控制器下面的所有的采样器都会当做一个整体,执行时也会一起被执行。

image

JMeter提供了17种逻辑控制器,它们各个功能都不尽相同,大致可分为2种类型:

(1)用于控制 test plan(测试计划)中 sampler(取样器)节点发送请求的逻辑顺序的控制器,常用的有:

  • If Controller(如果if控制器)
  • switch Controller(Switch控制器)
  • Runtime Controller、Loop Controller(循环控制器)

(2)用来组织可控制的 sampler 节点,也就是对测试计划中的取样器进行分组,方便JMeter统计执行结果,以及运行脚本时的控制操作等。常用的有:

  • Transaction Controller(事务控制器)
  • Throughput Controller(吞吐量控制器)

注意:逻辑控制器是线程组内部元件,所以逻辑控制器只能在线程组中添加

5.2 配置元件(Config Element)

JMeter的配置元件(config element)用于提供对静态数据的配置支持,可以为取样器设置默认值和变量。

配置元件有很多的功能:读取文件数据,设置公共请求参数,赋予变量值等,以便后续取样器使用。

image

常用的配置元件:

  • CSV数据文件设置

  • HTTP信息头管理器

  • HTTP Cookie管理器

  • HTTP请求默认值

  • JDBC Connection Configuration

  • 用户定义的变量

5.3 前置处理器(Pre Processors)

前置处理器用于在实际的请求发出之前对即将发出的请求进行特殊处理。

在取样器发出请求之前执行一些操作,如果将前置处理器附加到取样器元件,则它将在该取样器元件运行之前执行。前置处理器主要是用来处理,请求在实际发送之前的一些准备工作,比如取样器参数设置、环境变量设置、脚本预处理等操作。

例如:当URL中有 sessionID 一类的 session 信息时,可以通过该处理器填充发出请求实际的 sessionID

image

5.4 定时器(Timer)

用户实际操作时,并非是连续点击,而是存在很多停顿的情况,例如:用户需要时间阅读文字内容、填表、或者查找需要点击的链接等。为了模拟用户实际情况,在性能测试中我们需要考虑操作时间。若不认真考虑操作时间很可能会导致测试结果的失真。例如,预估的可支撑用户数可能会偏小。

在性能测试中,访问请求之间的停顿时间被称之为等待时间。

那么如何模拟这种停顿呢?我们可以借助JMeter的定时器元件实现。

JMeter中的定时器一般被我们用来设置延迟与同步。定时器的执行优先级高于Sampler(取样器),在同一作用域(例如控制器下)下有多个定时器存在时,每一个定时器都会执行,如果想让某一定时器仅对某一 Sampler 有效,则可以把定时器加在此 Sampler 节点下。

默认情况下,JMeter线程按顺序执行取样器而不会暂停,可以添加定时器(Timer)来设置等待时间,类似于LoadRunner里面的“思考时间”。

常用的定时器:

  • Bean Shell Timer

  • Constant Throughput Timer

  • 固定定时器

提示:定时器常用于控制客户端 QPS 的手段

image

5.5 取样器(Sampler)

取样器(Sampler)是用来模拟用户操作的,向服务器发送请求以及接收服务器的响应数据。

image

取样器在性能测试中通常要进行这三个工作:

  • 向服务器发送请求

  • 记录响应信息

  • 记录响应时间的最小单元

取样器是按照测试计划树的顺序从上到下执行的。且取样器配合控制器使用,可以修改取样器的执行顺序和次数

注意:取样器是线程组内部的元件,也就是说取样器只能在线程组中添加

5.6 后置处理器(Post Processors)

用于对 Sampler 发出请求后得到的服务器响应进行处理。一般用来提取响应中的特定数据,类似LoadRunner中的关联。

后置处理器常用于:处理响应数据,提取某个值。

例如:我们在做接口测试的时候,经常会遇到一个接口的请求参数是另一个接口的响应结果,这个时候就需要用到后置处理器来处理我们的请求参数。比如系统登录成功后我们要获取 Token,在后面业务操作中服务器会验证这个 Token,获取 Token 这个过程,就是用后置处理器中的正则表达式提取器来完成。

image

5.7 断言(Assertions)

断言是自动化测试中最重要且绕不开的一个概念,让自己的程序尽可能像人一样去做判断,这是自动化测试需要实现的重要功能。

JMeter中的断言用于检查测试中得到的响应数据等是否符合预期结果,断言一般用来设置检查点,用以保证性能测试过程中的数据交互与预期一致。(它的作用和LoadRunner中的检查点类似)

JMeter中断言的原理: 在Request的返回层面,增加一层判断机制,因为Request成功了,并不代表结果一定正确。

一个Sampler可以添加多个断言,根据你的检查需求来添加相应的断言,多个断言属于并行操作。当Sampler下所有的断言都通过了,那么才算是请求成功

image

5.8 监听器(Listener)

监听器是对测试结果进行处理和可视化展示的组件,能够显示取样器请求和响应细节以及请求结果,包括消息头,请求的数据,响应的数据。

image

常用的监听器:

  • 查看结果树

  • 聚合报告等

  • 图形结果

注意:

(1)监听器放的位置不同,查看的结果也不同

1. 在线程组下添加监听器,查看线程组下所有请求的结果;

2. 放在具体某个请求下,只查看此请求的结果;

3. 若放在某个控制器节点下,则查看此控制器下节点执行的结果;

(2)监听器推荐做调试用,在实际运行压测时,应该禁用。因为大量请求时,启用监听器时打印的日志比较多,影响压力性能结果

(3)不同的监听器,通过不同的方式,展示服务器响应信息,但是它们原始结果数据都是一样的

(4)JMeter监听器有两种方式存储监听记录

1. 默认保存方式:CSV格式。占用磁盘比较少,推荐使用这种方式保存。

2. xml保存方式:保存数据最全面,但是占用内存大

5.9 组件执行顺序

组件作用域

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

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

作用域原则

  • 取样器不和其他组件相互作用,因此不存在作用域的问题;

  • 逻辑控制器组件只对其子节点中的取样器和逻辑控制器作用;

  • 除取样器和逻辑控制器外,如果是某个取样器的子节点,则该组件对其父子节点起作用;

  • 如果其父节点不是取样器, 则其作用域是该元件父节点下的其他所有后代节点(包括子节点, 子节点的子节点等)

执行顺序

逻辑控制器->配置元件->前置处理器->定时器->取样器->后置处理器->断言->监听器

  • 配置元件优先执行(非控制器内),用户自定义配置元件优先执行(无论是否在控制器内)

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

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

6- JMeter 基础配置

在实际工作中,JMeter 默认的一些配置是不能满足我们的测试需求,所以就需要对 JMeter 的基础配置进行一些修改,以最大的满足工作需求。

6.1 修改编码格式

JMeter 默认编码格式为ISO-8859-1,而我们程序中经常使用的是UTF-8编码格式,由于响应页面和 JMeter 编码格式不统一导致响应结果中经常会出现乱码,所以需要将 JMeter 的编码格式设置为UTF-8来解决乱码问题。

修改 bin 目录下 jmeter.properties 文件中的sampleresult.default.encoding=ISO-8859-1改为UTF-8并去掉注释符号

修改步骤:

  1. 进入 JMeter 的 bin 目录下,找到jmeter.properties文件,以文本形式打开

  2. 找到# sampleresult.default.encoding这个参数,此行默认是注释的(同时可以看到默认编码格式为ISO-8859-1)

  3. 复制此行将注释去掉,并将编码格式设置为UTF-8,保存文件

  4. 重启 JMeter 生效(一定要重启)

image
image

6.2 修改内存

JMeter 默认内存为 256m,实际工作中在进行大数据、高并发压测的过程性,有时会遇上 JMeter 卡死现象,使得测试无法进行,查看日志显示:java.lang.OutOfMemoryError: Java heap space

原因: 运行 JMeter 机器的内存,占用较高,超过了 JMeter 设置的内存上限,内存溢出。

为了避免内存溢出问题,我们需要给 JMeter 配置足够大的内存。

修改 bin 目录下JMeter.bat文件中的set HEAP=-Xms1g -Xmx1g -XX:MaxMetaspaceSize=256m改为1024m

修改步骤:

  1. 进入 JMeter 的 bin 目录下,找到 JMeter.bat 文件,以文本形式打开

  2. 找到set HEAP=-Xms1g -Xmx1g -XX:MaxMetaspaceSize=256m

  3. 256改为1024,保存文件

  4. 重启 JMeter 生效

image
image

-Xms:JVM初始分配的堆内存。表示初始化JAVA堆的大小及该进程刚创建出来的时候,他的专属JAVA堆的大小,一旦对象容量超过了JAVA堆的初始容量,JAVA堆将会自动扩容到-Xmx大小。

-Xmx:JVM最大允许分配的堆内存,按需分配。表示java堆可以扩展到的最大值,在很多情况下,通常将-Xms和-Xmx设置成一样的,因为当堆不够用而发生扩容时,会发生内存抖动影响程序运行时的稳定性。

这里我们将 -Xms -Xmx设置成 1个g,MaxMetaspaceSize:jvm中的元数据区,默认是256,一般设置为1024m就够了,配置内存大小,不能超过物理内存的50% 。

6.3 页面汉化

6.3.1 永久性

修改 JMeter 默认语言为中文,重启 JMeter 后生效,这种是永久性的,每次打开都是中文。

修改 bin 目录下 jmeter.properties 中的 language=en 改为 language=zh_CN

修改步骤:

  1. 进入 JMeter 的 bin 目录下,找到jmeter.properties文件,以文本形式打开

  2. 找到language=en

  3. language=en改为language=zh_CN,保存文件

  4. 重启 JMeter 生效

image
image

6.3.2 临时性

在界面修改语言为中文,立即生效,这种是临时性的,重启 JMeter 后又会变为英文。

菜单选择 Options -> Choose Language -> Chinese(Simplified)

image

6.4 外观主题

JMeter 外观主题默认是 Darcula 暗黑色系

菜单选择 选项 -> 外观(选择自己喜欢的主题)

image

我们根据个人的需求对这些配置进行修改完成后,就可以正式使用啦!

7- 测试计划(Test Plan)

测试计划是JMeter中的最上层容器,包含了所有需要执行的测试元件,可以在这里设置全局参数和属性,用来描述一个测试方案,包含与本次性能测试所有相关的功能,也就说本次测试的所有内容是于基于一个测试计划。

换个说法就是一个测试计划就对应一个JMeter测试脚本。在 JMeter GUI 中,只能编辑一个测试计划,如果需要新创建一个测试计划,就要开启一个新的 JMeter GUI 窗口界面。

7.1 界面展示

image

7.2 参数说明

名称

  • 测试计划的名称,可进行编辑

注释

  • 对于测试没有任何作用,仅用户记录用户可读的注释信息

用户定义的变量

  • 相当于用户自定义变量元件功能,测试计划的变量是全局的,而用户自定义变量元件是线程组下的

独立运行每个线程组(例如在一个组运行结束后启动下一个)

  • JMeter线程组与线程组之间,默认并发运行,勾选此选项,就会变成串行运行

主线程结束后运行 tearDown 线程组

  • 默认是从上到下执行;交替控制器、随机控制器、随机顺序控制器和循环控制器等可以改变取样器的执行顺序

函数测试模式

  • 只有当你需要记录每个请求从服务器取得的数据到文件时才需要选择函数测试模式。选择这个选项很影响性能。
  • 通常我们进行调试脚本时,会选中以确保正确配置 JMeter 并确保服务器返回预期结果,这将很有用。
  • 但是当我们进行负载测试时,则应禁用此选项(默认情况下处于禁用状态)

添加目录或 jar 包到 ClassPath

  • 可以引入测试项目特有的 jar,我们在引用插件时,有两种方式:
  • 把插件的 jar 包放到 JMeter 的 lib 目录下,JMeter 自动识别
  • 在测试计划的“添加目录或 jar 包到 ClassPath ”中,添加jar包,就不用把jar包放到 lib 目录下

7.3 要素

JMeter中一个脚本就是一个测试计划,也是一个管理单元,JMeter 的请求模拟与并发数设置都在脚本文件中一起设置,不像 LoadRunner 把脚本与虚拟用户设置分开。

测试计划只能有一个

  • JMeter 测试计划类似 LoadRunner Controller 中的测试场景,同一时刻场景故然只能有一个
  • JMeter 脚本在 GUI 中显示时是树型结构,测试计划是根节点,根节点当然只能有一个

测试计划中至少要有一个线程组

  • JMeter 负裁是通过线程组驱动的,所以计划中至少要出现一个线程组
  • JMeter 测试计划支持多个线程组
  • 我们可以在计划下面建立多个线程组,类似 LoadRunner 中的 Group 方式的场景,我们可以把JMeter 计划理解成LoadRmmer 中的 Group 方式场景,把不相关联的业务分布在不同的线程组中( LoadRunner 中的不同 Group)

测试计划中至少要有一个取样器

  • 测试的目的就是要模拟用户请求,没有取样脚本就毫无意义

至少要有一个监听器

  • 测试结果用来衡量系统性能,我们需要从结果中分析系统性能

8- 线程组(Thread Group )

线程组元件是任何一个测试计划的起点,在一个测试计划中的所有元件都必须在某个线程组下,所有的任务都是基于线程组。

无论你用 JMeter 做哪种测试,都必须添加使用 JMeter 线程组,线程组在 JMeter 中占据主导地位,它是任何一个测试计划的起点,所有的逻辑控制器、取样器、处理器、监听器都必须放在线程组之下,也就是说你若使用 JMeter 做接口测试或性能测试,那么线程组是必不可少的。本节为大家介绍 JMeter 的线程组。

线程(用户)下有三个元件,分别是steUp线程组、tearDown线程组、线程组。

image

8.1 steUp线程组

一种特殊的 threadGroup ,可用于执行预测试操作;它的行为完全像一个正常的线程组元件,不同的是执行顺序。
它会在普通线程组执行之前被触发。

应用场景: 测试数据库操作功能时,用于执行打开数据库连接的操作

8.2 tearDown线程组

默认情况下,如果测试按预期完成,则TearDown线程组将会运行。如果你不想要运行它,则需要从测试计划界面中取消掉
选中主线运行结束后运行teardown线程组”的复选框。

应用场景: 用于执行关闭数据库连接的操作,或者清理测试数据

image

8.3 线程组

这个就是我们通常添加运行的线程,通俗的讲 一个线程组,可以看做一个虚拟用户组,线程组中的每个线程都可以理解为一个虚拟用户。

8.3.1 界面展示

位置:测试计划 -> 右键 -> 添加 -> 线程(用户)-> 线程组

image

8.3.2 参数说明

在取样器错误后要执行的动作

  • continue(继续): 取样器发生错误,忽略错误,继续执行接下来的请求,默认选项

  • Start Next Thread Loop(启动下一进城循环): 取样器发生错误,忽略错误 停止当前线程循环,执行下一个循环

  • Stop Thread(停止线程): 当前线程运行完毕后,停止所有线程

  • Stop Test)停止测试: 停止测试计划,如果一个测试计划下有多个线程组,那么所有线程组都会停止

  • Stop Test Now(立即停止测试): 整个测试计划会立即停止运行

    线程数

  • 模拟用户数,多个线程用于模仿对服务器的并发访问

  1. Jmeter java 进程下启动的线程,用来模拟真实用户数,1线程数 = 1用户数
  2. windows下,2g的 java内存,1m 的栈空间,最大启动线程数=1000
  3. Linux下,2g的 java内存,1m 的栈空间,最大启动线程数=2000
  4. 在Jmeter中,先启动线程,再运行线程,后释放线程【启动线程并运行,释放线程】
  5. 线程数建议不超过1000

例如,1个线程组里面有10个请求,线程数为10个,跑完脚本后得到:(10个线程数)10个人,每个人都要跑这10个请求,
所以并发数=10*10=100

Ramp-Up时间

  • 设置启动所有线程需要的时间,即线程从启动-运行-释放的总时间,默认为 1 秒
  • 如果 ramp-up 时间内,所有线程不能启动运行完的话,时间则会顺延下去
  • 注意:在负载测试的时候,尽量把 Ramp up 时间设置大一些,让性能曲线平缓,容易找到瓶颈点
  • Ramp-up 需要设置足够长的时间,来避免在测试刚开始时工作量过大;

  • 假如需要大量线程的话,不建议设置成0,0 表示瞬时加压,启动线程的时间无限趋近于 0,
    如果设置为 0 ,JMeter 将在测试开始时就启动全部线程并立即发送请求,这样很容易让服务器达到饱满状态,且瞬间会增加很大的负载量,容易让服务器超载,这样是不合理的;不合理的原因并不是因为平均压力值过高,而是因为所有线程都在初始状态时一起并发访问,从而引起不正常的初始访问峰值,不符合正常操作场景,可以通过 Jmeter 的聚合报告看到这种情况;

  • Ramp-up还必须足够短,保证最后一个线程在第一个线程完成之前开始运行;

  • 如果 Ramp-up 过大,则会降低访问峰值的负载,即没有达到预期的压力峰值,无法获取准确的服务器最大负载情况,具体的表现为:后期一些线程还没有启动,初期启动的部分线程已经释放结束了【导致实际并发量会小于预期并发量】。

如何确定一个合理的 Ramp-up?

  • 首先,让初始点击率接近平均点击率,前提是确定合理的访问量
  • 初始的 ramp-up = 平均点击率= 总线程/点击率;
    假如线程数=100,点击率=10次/s,则 ramp-up = 100/10 = 10s

循环次数

  • 设置线程组中的每个线程循环次数,默认是 1 次
  • 可以理解为线程的迭代次数、重复发起请求的次数,每个线程循环次数

如果勾选永远,那么 jmeter 将以最大的可能去发送请求,以此测试出最大并发数,线程组中的线程永久执行下去,需要手动停止。

image
比如上图:10s 内启动并运行 10 个线程,一共启动 10 个线程,总共发送 20 个请求(10*2),每秒启动一个线程,然后运行2次

Same user on each iteration

每次迭代使用相同的线程

延迟创建线程直到需要

  • 默认情况下,测试开始的时候,所有线程就被创建完了。勾选此项后,取样器开始执行时才会被创建,避免资源浪费

官方英文
When selected, JMeter will allocate threads according to the ramp up times. Otherwise all threads are allocated to the JVM process the moment the test is started, regardless of ramp up time.

(翻译)选中后,JMeter将根据 Ramp-up 时间来分配线程。 否则,无论 Ramp-up 时间如何设定,所有线程都将在测试开始时分配给 JVM 进程。

调度器

  • 线程调度器包含持续时间、启动延迟两个选项,调度器的作用就是控制每个线程组运行的持续时间以及它在多少秒后再启动。

当线程组运行完持续时间后,会逐步释放线程,不会一下子把所有线程释放掉,而释放线程也是需要时间的,所以测试计划总的时间(右上角的时间)会 > 持续时间+启动延迟。

Duration (seconds) :持续时间,线程组运行的持续时间
Startup Delay (seconds):启动延迟,测试计划开始后,线程组的线程将在多少秒后再启动运行

调度器和循环次数的关系:

  1. 循环次数有固定值且 ≠ -1,持续时间不会生效,以循环次数为准
  2. 循环次数设置为永远或 -1 时,持续时间才会生效

简单理解:

  • 线程组是一个测试计划的开始点
  • 在一个测试计划中的所有元件都必须在某个线程组下
  • 线程组决定 JMeter 执行测试计划的线程数
  • 每个线程都会独立的运行测试计划,互不干扰,多个线程用于模仿对服务器的并发访问

9- HTTP 协议

现在的互联网应用前后端是分离的,客户端和服务器端通过接口服务进行通信,其本质就是“http协议+json数据”。学习HTTP协议有助于测试人员定位bug和提高录制测试脚本的效率,所以本节对http协议进行讲解。

HTTP(Hyper Text Transfer Protocol): 全称 超文本传输协议,是一个简单的请求-响应协议,它详细规定了浏览器和万维网(WWW)服务器之间互相通信的规则,通过因特网传送万维网文档的数据传送协议,是基于应用层的协议。

image

HTTP协议是基于 TCP/IP 通信协议来传递数据的,其中 HTTP1.0、HTTP1.1、HTTP2.0 均为 TCP 实现,HTTP3.0 基于 UDP 实现。现主流使用 HTTP1.1 和 HTTP3.0

9.1 HTTP 工作原理

当浏览器向服务器发出请求时,它向服务器传递了一个数据块,就是http请求,服务器接受请求后,根据请求返回响应的内容,就是http响应。

image

  • 基于客户端访问的URL进行识别,与服务器进行连接建立;

  • 客户向服务器提出请求;

  • 服务器接受请求,并根据请求返回相应的文件作为应答;

  • 客户与服务器关闭连接

9.2 HTTP请求

image

  • 请求行: 请求方式、URL、协议/版本,他们之间使用空格隔开

  • 请求头(header): 描述客户端的基本信息,从而把客户端相关的信息告知服务器

  • 请求体(body): 提交到服务器的数据

常用的请求方法

根据HTTP标准,HTTP请求可以使用多种请求方法。

HTTP1.0定义了三种请求方法:GET、POST、HEAD方法;HTTP1.1新增了五种请求方法:OPTIONS、PUT、DELETE、TRACE 和 CONNECT 方法。

方 法 描述
GET (查询)发送请求来获得服务器上的资源,请求体中不会包含请求数据,请求数据放在协议头中,明文显示,不安全
POST (新增)向服务器提交数据进行处理请求,数据被包含在请求体中。例如提交表单或者上传文件
PUT (修改)向服务器提交资源,并使用提交的新资源,替换掉服务器对应的旧资源
DELETE (删除)请求服务器删除指定的资源,通常用于删除文件、删除数据等场景
HEAD 类似于GET请求,只不过返回的响应中没有具体的内容,用于资源的头部信息;通常用于检查资源是否存在、获取资源的元数据等场景。HEAD请求的特点是只返回响应头部信息,不返回响应体,可以减少网络流量和服务器负载
CONNECT HTTP/1.1协议中预留给能够将连接改为管道方式的代理服务器
OPTIONS 用于向服务器请求获取某个资源所支持的HTTP请求方式,通常用于Web API的开发和调试。OPTIONS请求的特点是只返回支持的请求方式,不返回响应体,可以帮助开发者了解Web API的使用方法
TRACE 回显服务器收到的请求,主要用于测试或诊断

9.3 HTTP响应

image

  • 状态行: HTTP协议版本、状态码和状态码,他们之间使用空格隔开

  • 响应头: 描述服务器的基本信息。响应头部由多行 键/值对 组成,每行的键和值之间用英文的冒号分隔

  • 响应体: 响应体中存放的,是服务器响应给客户端的资源内容

常见的响应状态码

  • 1**:信息错误,服务器收到请求,需要请求者继续执行操作(实际开发中很少遇到1**类型的状态码)

  • 2**:成功,请求被成功执行并处理

  • 3**:重定向,需要进一步操作以完成请求

  • 4**:客户端错误,请求包含语法错误,接口路径不对

  • 5**:服务器错误,服务器在处理请求的过程中发生了错误

状态码 说明
100 服务器仅接收到部分请求,但是一旦服务器并没有拒绝该请求,客户端应该继续发送其余的请求
200 请求成功
204 无内容。服务器成功处理,但未返回内容。在未更新网页的情况下,可确保浏览器继续显示当前文档
304 当测试实体自上次检索以来是否被修改时,出现此结果
400 客户端请求的语法错误,服务器无法理解
401 请求要求用户的身份认证
403 服务器理解请求客户端的请求,但是拒绝执行此请求
404 服务器无法根据客户端的请求找到资源
500 服务器内部错误,无法完成请求
501 服务器不支持请求的功能,无法完成请求
503 由于超载或系统维护,服务器暂时的无法处理客户端的请求。延时的长度可包含在服务器的Retry-After头信息中

9.4 URL

Internet上每一信息资源都有统一的且在网上唯一的地址,该地址就叫URL(Uniform Resource Locator,统一资源定位符),它是 统一资源定位符

协议+IP+端口号+路径+参数

https://www.ydcode.cn/forum/article/queryForumArticleById/id/160
    
默认端口号:http 80   https 443

image
image

9.5 特点

  • 基于客户/服务器模式
    在WWW中,“客户”与“服务器”是一个相对的概念,只存在于一个特定的连接期间,即在某个连接中的客户在另一个连接中可能作为服务器

  • 无连接
    客户与服务器之间的HTTP连接是一种一次性连接,它限制每次连接只处理一个请求,当服务器返回本次请求的应答后便立即关闭连接,下次请求再重新建立连接。这种一次性连接主要考虑到WWW服务器面向的是Internet中成千上万个用户,且只能提供有限个连接,故服务器不会让一个连接处于等待状态,及时地释放连接可以大大提高服务器的执行效率

  • 无状态
    即服务器不保留与客户交易时的任何状态。这就大大减轻了服务器记忆负担,从而保持较快的响应速度,因此每个请求都是独立的(需要cookie和session、token等对客户端浏览器做标识)

  • 灵活
    HTTP允许传输任意类型的数据对象。正在传输的数据类型由Content-Type加以标记

10- HTTP Request 取样器

HTTP 请求(HTTP Request)是 JMeter 中的一种取样器,用于模拟 HTTP 请求。

在 JMeter 接口测试中,接口调试是非常重要的一环,Jmeter是一款功能强大的接口测试工具,支持多种取样器,其中 HTTP Request 取样器被广泛使用。

HTTP Request 取样器是模拟 HTTP 请求,支持多种请求方法和数据类型,是 JMeter 中最常用的取样器,具有灵活性和扩展性,因此被广泛使用。

HTTP Request 取样器主要分为基本属性和高级属性,只有用到 JMeter进行接口测试,必然会填写取样器基本属性,所有此处必须掌握。

10.1 界面展示

位置:线程组 -> 右键 -> 添加 -> 取样器 -> HTTP 请求。

可以看到取样器的主要属性有:协议、服务器名称或IP地址、端口号、方法、路径、请求体以及参数。

image

10.2 参数说明

10.2.1 基本说明

名称

  • 本属性用于标识一个取样器,建议使用一个有意义的名称,比如登录

注释

  • 对于测试没有任何作用,仅用户记录用户可读的注释信息

Web服务器

  • 协议: 向目标服务器发送HTTP请求时的协议,可以是http或者是https,如果不填写,默认值为 http ,不区分大小写

  • 服务器名称或IP: HTTP请求发送的目标服务器名称或IP地址,比如 www.baidu.com

  • 端口号: 目标服务器的端口号,默认值为80,https的端口为443

HTTP 请求

  • 方法: 发送HTTP请求的方法,常用方法有 GET、POST、PUT、DELETE … 等

  • 路径 目标接口路径,比如登录接口路径 /member/loginAndRegister

  • 内容编码: 内容的编码格式,默认值为 ISO-8859-1,一般都填入utf-8,或者在 HTTP信息头管理器元件中添加 Content-Type=application/json;charset=UTF-8

  • 自动重定向: 如果选中该项,发出的 http 请求得到响应是301/302,JMeter 会重定向到新的界面

  • 跟随重定向: Http Request 取样器的默认选项,但响应Code是3XX时(比如301是重定向),自动跳转至目标地址

  • keep Alive: Http Request 取样器的默认选项,JMeter 和目标服务器之间使用 Keep-Alive 连接方式进行 HTTP 通信

  • 对POST使用 multipart/from-data: 当发送 HTTP POST 请求时使用,取决于数据类型 Content-Type,一般不勾选

  • 与浏览器兼容的头: 当勾选 multipart/form-data 时,勾选此项会截掉http请求头中的 Content-Type 和 Content-Transfer-Encoding,而只发送Content-Disposition部分

  • 参数: 请求数据类型为 Content-Type=text/plain,可以将请求参数填写在本表单中,表单中的每一行是一个参数值对,此时内容编码设置为UTF-8,防止参数值内含有中文,如下图所示:
    image

  • 消息体数据: 请求数据类型为 Content-Type=application/json,可以将请求参数以json的形式填写在这里,如下图所示:
    image

  • 文件上传: 同请求一起发送的文件信息,参数名称就是发送文件对应的参数, MINE Type为资源媒体类型。

10.2.2 高级说明

这是 HTTP Request 取样器的 GUI 高级界面,我们可以看到主要属性有:客户端实现、从HTML文件嵌入资源、源地址、代理服务器、其他任务。

image

客户端实现

  • 实现: 发送 HTTP 请求的方式,可选项为 java 和 HttpClient4,默认为 HttpClient4

  • 连接: 连接超时时间设置,单位为毫秒

  • 响应: 响应超时时间设置,单位为毫秒

从HTML文件嵌入资源

  • 从HTML文件获取所有内含的资源: 当该选项被选中时,JMeter 在发出 HTTP 请求并获得响应的 HTML 文件内容后,还对该HTML进行解析并获取 HTML 中包含的所有资源(图片、css、flash等)
  • 并行下载: 设置是否使用自设资源池,勾选后可设置大小
  • 数量: 资源池大小,默认为6
  • 网址必须匹配: URL 匹配过滤,填写此项则只会下载与此内容项匹配的 URL 的资源

源地址

  • 仅适用于具有HTTPClient实现的HTTP请求,此属性用于启用IP欺骗。它会覆盖此示例的本地IP地址
  1. 选择IP/主机名:使用特定的IP地址或(本地)主机名
  2. 选择设备:选择该设备的第一个可用地址,该地址可以是IPv4或IPv6
  3. 选择设备IPv4:选择设备名称的IPv4地址(例如eth0,lo,em0等)
  4. 选择设备IPv6:选择设备名称的IPv6地址(例如eth0,lo,em0等)

JMeter主机必须具有多个IP地址(即IP别名,网络接口,设备),该值可以是主机名,IP地址或网络接口设备,例如“ eth0 ”或“ l0”或“ wlan0 ”
如果定义了属性httpclient.localaddress,则该属性用于所有HttpClient请求。

代理服务器

  • 若请求需要通过代理访问,在此处设置代理信息

保存响应为MD5哈希

  • 选中该项,在执行时仅记录服务端响应数据的 MD5 值,而不记录完整的响应数据。在需要进行数据量非常大的测试时,建议选中该项以减少取样器记录响应数据的开销

11- HTTP 信息头管理器

HTTP 信息头管理器(HTTP Header Manager)是 JMeter 中的一种配置元件,用于存储 HTTP 请求头。

我们知道一个 HTTP 请求发送请求到服务器,请求报文包含:请求行、请求头、请求体。请求行和请求体可以在 HTTP Request 取样器中填写,那么请求头是在哪填写哪?

HTTP 信息头管理器是给 HTTP 请求自定义信息头,也就是 HTTP 请求头需要在 HTTP 信息头管理器中填写。

JMeter不是浏览器,因此其行为并不和浏览器完全一致。HTTP信息头管理器用于尽可能模拟浏览器的行为,里面通常放请求头的内容。

比如:

  • Content-Type: application/json;charset=UTF-8 请求数据类型
  • User-Agent: Mozilla/5.0 模拟浏览器

11.1 界面展示

位置:线程组 -> 右键 -> 添加 -> 配置元件 -> HTTP信息头管理器

image

11.2 参数说明

名称

  • 本属性用于标识一个取样器,建议使用一个有意义的名称,比如登录

注释

  • 对于测试没有任何作用,仅用户记录用户可读的注释信息

添加

  • 添加一行,名称和值为 key=Value

从剪贴板添加

  • 复制一个 key:Value格式数据,点击此按钮可以快速把复制的数据粘贴到信息头储存管理器中

删除:

  • 点击此按钮,会删除选中一行数据

载入

  • 选择保存测试计划的HTML文件快速打开

保存测试计划

  • 保存的是 HTML 格式的文件

11.3 常见的 HTTP 请求头

image

请求体 说明
Accept application/json,text/plain,*/* 浏览器可以接受服务器回发的类型。Accept: */* 代表浏览器可以处理所有类型
Accept-Encoding gzip, deflate, br 浏览器申明自己接收的编码方法,通常指定压缩方法,是否支持压缩,支持什么压缩方法
Accept-Language zh-CN,zh;q=0.9 浏览器申明自己接收的语言
Connection keep-alive 长连接,当一个网页打开完成后,客户端和服务器之间用于传输HTTP数据的TCP连接不会关闭,如果客户端再次访问这个服务器上的网页,会继续使用这一条已经建立的连接。Connection:close 代表一个Request完成后,客户端和服务器之间用于传输HTTP数据的TCP连接会关闭,当客户端再次发送Request,需要重新建立TCP连接
Content-Type application/x-www-form-urlencoded,text/xml,application/json、binary 数据类型,HTTP 中的 post 请求使用最多的 Content-Type 类型是application/json
Host 比如 www.ydcode.cn 当前请求要被发送的目的地,仅包括域名和端口号,在任何类型请求中,request都会包含此header信息,通常从HTTP URL中提取出来的
Origin 比如 https://ydcode.cn 当前请求资源所在页面的协议和域名,用来说明请求从哪里发起的,这个参数一般只存在于CORS跨域请求中,普通请求没有这个header!如果有Origin参数,我们可以看到response有对应的header:Access-Control-Allow-Origin
Referer 比如https://ydcode.cn/onLineBookList 当前请求资源所在页面的完整路径:协议+域名+查询参数(注意不包含锚点信息),所有类型的请求都包含此header
Authorization 这是header中的Token
User-Agent Mozilla/5.0 浏览器信息

11.4 作用域

HTTP 信息头管理器可以添加到测试计划下面,也可以添加到线程组下,或者添加到 HTTP 请求下。添加的位置不同,其作用域也不一致:

image

  • 将 HTTP 信息头管理器父类是测试计划,生效范围是测试计划下所有请求,即全局范围;

  • 将 HTTP 信息头管理器父类是线程组,生效范围是该线程组下所有请求;

  • 将 HTTP 信息头管理器父类是 HTTP 请求,则只针对当前请求生效;

生效优先级:取样器 > 线程组 > 测试计划,比如如果 HTTP 请求中有,则生效HTTP请求下的,如果没有,则生效线程组下的。

12- 查看结果树

查看结果树(View Results Tree)是 JMeter 中的一种监听器,可以查看取样器的请求参数、响应结果。

在 JMeter 中录制接口测试脚本的时候,需要进行调试和查看接口的请求结果是否正常,这个时候就可以使用察看结果树,它可以查看取样器的请求参数和响应结果,是 JMeter 最常用的元件之一。

察看结果树组件中展示了每一个取样器请求的结果、请求信息和响应信息。我们可以通过察看结果树组件中的内容,来分析脚本是否存在问题。

12.1 界面展示

位置:线程组 -> 右键 -> 添加 -> 监听器 -> 查看结果树

image

12.2 参数说明

所有数据写入一个文件

  • 文件名: 可以通过浏览,选择一个文件,这样 JMeter 在执行的过程中,会将所有的信息输出到文件,也支持打开一个结果文件进行浏览

  • 显示日志内容:

仅日志错误:表示只输出报错的日志信息
仅成功日志:表示只输出正常响应的日志信息
不勾选:表示输出所有的信息

查找

  • 在输入框中输入想查询的信息,点击查找(Search),可以在请求列表中进行查询,并在查询出的数据上加上红色的边框

结果

  • 类型切换: 默认Text,有RegExp Tester、XPath Tester、JSON Path Tester、HTML、JSON、XML…

  • 结果列表: 通常执行成功的请求是绿色,失败显示红色

其实,当我们没有加断言时,显示绿色并不一定就是成功了,只代表请求成功了,显示红色说明响应失败了。所以要想确定请求返回的是正确的,必须要加上断言,只有断言成功才会显示绿色。

  • Scroll automotically?: 自动滚动,勾选后,当请求很多时,滚动条会自动向下滚动

  • 取样器结果: 取样器的详细结果,可以切换取样器的显示方式Raw(纯文本)/Parsed(表单)

  • 请求: 显示当前取样器发送的详细请求内容,支持查找

  • 响应数据: 显示请求得到的响应内容,支持查找

12.3 取样器结果

image

字段 说明
Thread Name 线程名称
Sample Start 请求开始时间
Load time 加载时长,这个时间是我们测试常用的时间,也是整个请求的消耗时间,从发送到接收完成全程消耗的时间
Connect Time 链接时间
Latency 延迟,表示从请求发送到刚开始接收响应时的时间
Size in bytes 接收的数据字节总大小
Sent bytes 发送的字节大小
Headers size in bytes 响应头中的字节大小
Body size in bytes 响应体中的字节大小
Sample Count 发送的请求数
Error Count 错误数
Data type 数据类型
Response code 响应码
Response message 响应说明
HTTPSampleResult fields 其他附加信息

12.4 作用域

查看结果树可以添加到测试计划下面,也可以添加到线程组下,或者添加到 HTTP 请求下。添加位置不同,其作用域也不同:

image

  • 在线程组下添加查看结果树,查看线程组下所有请求的结果;

  • 放在具体某个请求下,只查看此请求的结果;

  • 在测试计划下添加查看结果树,查看测试计划下所有请求的结果

特别注意:在进行压力测试时,因为大量请求,启用查看结果树时打印的日志比较多,消耗内存和CPU,占用大量资源,影响压力测试性能结果,所以压测时应禁止使用,建议只做接口功能测试或在调试脚本验证时使用。

13- 实例:录制登录脚本

我们前面学习了 HTTP Request 取样器、HTTP 信息头管理器和查看结果树元件,在 JMeter 中就可以满足简单的 HTTP 请求的发送,这节就给大家结合 Fiddler 演示 JMeter发 起一个 HTTP请求?

首先,我们使用 Fiddler 抓取云端源想登录接口信息,如下:

image

13.1 添加线程组

打开 JMeter 后,我们需要在测试计划下创建线程组,属性都使用默认,无需修改。

测试计划 -> 右键 -> 添加 -> 线程(用户)-> 线程组

image

13.2 添加 HTTP 信息头管理器

在线程组下添加 HTTP 信息头管理器,我们需要模拟浏览器发送请求,根据 Fiddler 抓取的接口填写请求头。

线程组 -> 右键 -> 添加 -> 配置元件 -> HTTP信息头管理器

  • Content-Type: application/json

  • User-Agent: Mozilla/5.0

image

注意:如果POST请求中的参数为json格式,一定要在信息头管理器中加上Content-Type: application/json,表示发送的body为json格式的数据,否则 JMeter会报参数格式错误

13.3 添加 HTTP 请求

在线程组下添加 HTTP 请求,根据 Fiddler 抓取的接口填写对应的信息。

线程组 -> 右键 -> 添加 -> 取样器 -> HTTP 请求

  • 协议: https

  • 服务器名称或IP: www.ydcode.cn

  • 端口号: 443,因为服务器填写的是域名,所有此处可不填

  • 请求方法: POST

  • 路径: /member/loginAndRegister

  • 内容编码: UTF-8

  • 参数: {“phoneNumber”:“12********3”,“code”:“1****0”,“inviterNo”:“undefined”,“source”:0}

image

13.4 添加查看结果树

在线程组下添加查看结果树,查看是否登录成功

线程组 -> 右键 -> 添加 -> 监听器 -> 查看结果树

image

运行脚本,我们在查看结果树中可以看到登录请求颜色是绿色,且 Response Body 返回了预期的数据,这说明我们用 JMeter 录制登录脚本成功了。

14- HTTP 请求默认值

HTTP 请求默认值(HTTP Request Defaults)是JMeter 的一种配置元件,用于提取多个 HTTP 请求的重复数据。

使用场景:
它的界面看上去和 HTTP Request 基本一样,为何会出现这种情况?

在实际工作中录制测试脚本时,一个线程组或者测试计划下会存在很多个 HTTP 请求,这些请求中某些数据是一样的,比如协议、IP、端口号等。那么对这些重复一样的数据,在添加 HTTP 请求时,就会感觉很麻烦,所以 HTTP 请求默认值就是在诺干个 HTTP 请求存在重复的内容,把重复的内容提取出来,只需要定义一次就可以了,即使这些数据发生了变化,我们只需修改 HTTP 请求默认值就可以了,无需每个HTTP 请求都得修改。

14.1 界面展示

位置:线程组 -> 右键 -> 添加 -> 配置元件 -> HTTP 请求默认值

因为它的界面和 HTTP Request 基本一样,大家可以翻看前面的 HTTP Request ,所以这里就不介绍每个字段的含义了。

image

14.2 作用域

HTTP 请求默认值可以添加到测试计划下面,也可以添加到线程组下,或者添加到 HTTP 请求下。添加的位置不同,其作用域也不一致:

image

  • 将 HTTP 请求默认值父类是测试计划,其作用域是测试计划下所有 HTTP 请求,即全局范围;

  • 将 HTTP 请求默认值父类是线程组,生效范围是该线程组下所有 HTTP 请求;

  • 将 HTTP 请求默认值父类是 HTTP 请求,则只针对当前 HTTP 请求生效。

生效优先级:HTTP请求自己填写的参数 > HTTP请求下的HTTP请求默认值 > 线程组下的HTTP请求默认值 > 测试计划下的HTTP请求默认值

14.3 实例

我们以登录接口为例,看看HTTP请求默认值的实现。

1. 添加 HTTP 请求默认值

  • 把协议和域名提取出来,这样之后的所有 HTTP 请求就不需要重复填写协议和域名了。
    image

2. HTTP 请求设置

  • 已经在HTTP请求默认值中设置的属性,在HTTP请求中就可以不需要填写。
    image

3. 运行查看结果

  • 可以看到请求路径成功取到了HTTP请求默认值设置的协议和域名。
    image

15- HTTP Cookie 管理器

HTTP Cookie 管理器(HTTP Cookie Manager)是 JMeter 中的一种配置元件,用于自动存储Cookie。

什么是 Cookie?

  1. 由于HTTP协议是无状态的协议,所以服务端需要记录用户的状态时,就需要用某种机制来识具体的用户,这个机制就是Session。比如购物车,当你点击下单按钮时,由于HTTP协议无状态,所以并不知道是哪个用户操作的,所以服务端要为特定的用户创建了特定的Session,用于标识这个用户,并且跟踪用户,这样才知道购物车里面有几本书。这个Session是保存在服务端的,有一个唯一标识。

  2. 服务端如何识别特定的客户?这个时候Cookie就登场了。每次HTTP请求的时候,客户端都会发送相应的Cookie信息到服务端。实际上大多数的应用都是用 Cookie 来实现Session跟踪的,第一次创建Session的时候,服务端会在HTTP协议中告诉客户端,需要在 Cookie 里面记录一个Session ID,以后每次请求把这个会话ID发送到服务器,我就知道你是谁了。有人问,如果客户端的浏览器禁用了 Cookie 怎么办?一般这种情况下,会使用一种叫做URL重写的技术来进行会话跟踪,即每次HTTP交互,URL后面都会被附加上一个诸如 sid=xxxxx 这样的参数,服务端据此来识别用户。

  3. Cookie其实还可以用在一些方便用户的场景下,设想你某次登陆过一个网站,下次登录的时候不想再次输入账号了,怎么办?这个信息可以写到Cookie里面,访问网站的时候,网站页面的脚本可以读取这个信息,就不需要每次重新登录。

总结一下:
Session是在服务端保存的一个数据结构,用来跟踪用户的状态,这个数据可以保存在集群、数据库、文件中;
Cookie是客户端保存用户信息的一种机制,用来记录用户的一些信息,也是实现Session的一种方式。

使用场景: 如果你有一个 HTTP 请求,如果其返回结果里包含一个 Cookie,那么 Cookie 管理器会自动将该 Cookie 保存起来,而且以后所有的对该网站的请求都使用同一个 Cookie。相当于把 Cookie 提取出来自动设置为这个线程下的全局变量。

注意:Cookie 是作用在线程级别的,不同线程的 Cookie 彼此完全独立

15.1 界面展示

位置:线程组 -> 右键 -> 添加 -> 配置元件 -> HTTP Cookie 管理器

image

15.2 参数说明

每次反复清除Cookies?

  • 每次迭代时,都将 Cookies 清空

Use Thread Group configuration to control cookie clearing

  • 线程组去配置清空 Cookie

线程组中 Same user on each iteration 参数只有存在HTTP Cookie 管理器,且勾选管理器当中 Use Thread Group configuration to control cookie clearing 参数时才会自动设置 Cookie 给下次迭代使用!!其他情况下该参数对结果不造成影响,不会自动设置Cookie。

Cookie 策略:

  • 默认选择 standard

存储在Cookie管理器中的Cookie(User-Defined Cookies)

  • 自定义 Cookie,可以手动添加

添加HTTP Cookie 管理器,不选任何参数时,保持默认,Cookie 管理器会自动设置,第一次请求产生的Cookie会自动带入第二次请求当中去,以此实现Cookie的传递。

值得注意的是:Cookie本就是信息头中的一部分,所以当在HTTP信息头管理器中添加了Cookie字段,那就没必要再在HTTPCookie管理器中添加值,甚至也不用加HTTPCookie管理器组件,避免发送重复Cookie;相对而言,在HTTPCookie管理器中传入了Cookie的值,那么在信息头中也不用再添加Cookie的字段

16- HTTP 缓存管理器

HTTP 缓存管理器(HTTP Cache Manager)是 JMeter 中的一种配置元件,用于模拟浏览器缓存功能。

什么是浏览器缓存?

浏览器缓存源于这个issue, 为什么每个网页都要下载相同的数据?为什么不下载一次后重复使用?

浏览器缓存是一个临时存储位置的文件,下载有你的浏览器显示网站。缓存包括html, files, CSS Style sheets, JavaScript 和 multi-media 多媒体文件等。

当你第一次访问网页时,浏览器会把所有文件都下载到缓存中,下次当你再次访问该页面,浏览器就检查更新的内容,并只下载那些未存储在缓存中的文件,这种机制减少了带宽的使用,有助于更快的加载网页。

使用场景: JMeter 每次都会重新下载所有资源,为了模拟用户通过浏览器操作真实的行为,需要添加 HTTP 缓存管理器模拟浏览器缓存功能,注意是静态缓存(图片等),动态缓存(json、xml)不在范围内,主要用于web页面的性能测试。

16.1 界面展示

位置:线程组 -> 右键 -> 添加 -> 配置元件 -> HTTP 缓存管理器

image

16.2 参数说明

在每次迭代中清除缓存?

Use Thread Group configuration to control cache clearing

  • 使用线程组配置去控制缓存清空,默认不选

Use Cache-Control/Expires header when processing GET requests:

  • 默认选中,Jmeter 将根据当前时间检查CacheControl/Expires值。如果时间戳是将来的,并且请求方法是GET,那么Sampler会立即返回,而不需要从Server请求URL。

缓存中元素的最大数量

  • JMeter 保存所有缓存资源在 RAM。默认情况下,缓存管理器在每个虚拟用户的缓存中最多存储5000个条目,如果增加这个值,Jmeter将相应地消耗更多的内存,它会导致“OutOfMemory”异常。为了避免这种行为,你应该在jmeter.bat中调整JVM 内存大小。

HTTP缓存管理器在实战中较少应用,这里可以不做过多的了解。

17- 用户定义的变量

用户定义的变量(User Defined Variables )是 JMeter 中的一种配置元件,用于定义和管理变量。

使用场景: 变量是一种存储数据的容器,可以在测试过程中动态地改变变量的值。通过用户定义变量,可以为测试脚本提供灵活的数据输入,实现更加真实的性能测试;该元件更多用于设置全局变量,常用于数据库地址,测试环境、开发环境地址等常量配置

用户定义的变量可以跨线程传参,在启动运行时获取一次值,在运行过程中,不在动态获取值。

17.1 界面展示

位置:线程组 -> 右键 -> 添加 -> 配置元件 -> 用户定义的变量

JMeter 中引用变量格式为: ${变量名}

在JMeter中,用户定义变量是通过添加“User Defined Variables”元件来配置的。在这个元件中,我们可以添加多个变量,每个变量都有一个名称和一个值。在测试过程中,可以通过引用这些变量来使用它们的值。

image

自定义用户变量(User Defined Variables)在配置元件中,是第一个执行的,不论放在哪个位置都是第一个执行;使用自定义用户变量的好处在于,可以做到统一修改,使用时只需引用变量即可。

通常用于进行脚本的参数化,将多个场景出现的常量采用变量统一替换,简化脚本,方便维护。

在配置用户定义变量时,需要注意:

  1. 变量名称不能重复,每个变量都应该有一个唯一的名称,这样可以避免混淆和错误;

  2. 变量的值可以是任意类型的数据,可以是字符串、数字、布尔值等,根据测试场景的需要,可以选择合适的数据类型;

  3. 变量的值可以通过其他变量来引用,这样可以实现变量之间的关联和依赖关系;

  4. 变量的值可以在测试计划中的任何地方使用,包括线程组、HTTP请求等元件中。通过使用变量,可以灵活地修改和控制测试场景。

通过使用用户定义变量,我们可以实现很多复杂的测试场景,比如:

  • 来模拟多个用户的并发访问

  • 可以使用变量来控制请求的频率和持续时间

  • 可以使用变量来模拟不同的用户行为

  • 可以使用变量来传递参数和数据

  • 可以使用变量来验证返回结果等等。

除了用户定义的变量元件之外,JMeter 测试计划也带有用户定义的变量,因此通常用户定义的变量元件的父类不会是测试计划。

image

生效优先级:HTTP请求下的用户定义的变量 > 线程组下的用户定义的变量

17.2 实例

比如好多个接口请求路径中都有页码、页数,那么我们就可以通过用户定义的变量来定义一次就可以了,如果需要更改,我们只需更改一次变量的值,不需要每个接口路径都修改。

1. 添加用户定义的变量

  • 添加变量 page:1 和 pageSize:20
    image

2. 引用变量

  • 在请求路径中引用变量 ${page}、${pageSize}
    image

3. 运行查看结果

  • 我们可以看到查看结果树中的请求路径成功引用到了我们定义的变量
    image

一般仅将测试计划中不需要随迭代发生改变的参数(只取一次值的参数)设置在此处。多个 HTTP 请求存在重复的参数,把重复的参数提取出来,只需要定义一次就可以了。

18- 计数器

计数器(Counter)是 JMeter 中的一种配置元件,用于生成有序数字。

使用场景: 通常用于统计和模拟序列等

18.1 界面展示

位置:线程组 -> 右键 -> 添加 -> 配置元件 -> 计数器

image

18.2 参数说明

Starting value

  • 初始值,比如设置为1,计数器将从1开始计,输出1、2、3、4、5、6…,如果不填写,默认为0

递增

  • 每次迭代后,给计数器增加的值,比如设置为2,计数器输出1、3、5、7、9、11…,如果不填写,默认为0

Maximum value

  • 最大值,计数器输出达到最大值时,自动重置初始值;如果不填写,默认的最大值为2^63-1

数字格式

  • 输出数字的格式,比如“000”,输出为001、002、003…或“USER_000”将输出USER_001、USER_002、USER_003…如果未指定,则输出1、2、3…,非必填

引用名称

  • 变量名,例如:age,引用$(age},必填

与每用户独立的跟踪计数器

  • 默认不勾选,不勾选是全局的,所有线程共用,勾选后每个线程是独立的,有自己的值
    image

在每个线程组迭代上重置计数器

  • 可选,仅勾选与每用户独立的跟踪计数器时可用,勾选后,输出是初始值
    image

18.3 实例

生成1-100的序号,格式为000。

1. 添加 JSR223 Sampler,用于查看日志

  • 线程组 -> 右键 -> 添加 -> 取样器 -> JSR223 Sampler,复制下面代码到JSR223 Sampler脚本中:
log.warn("线程号:"+ctx.getThreadNum()+",随机数:"+vars.get("var"));

// 注意:var 是随机变量的变量名

2. 修改日志级别为WARN,并选中日志查看

3. 计数器设置如下:

  • Starting value:1
  • 递增:1
  • Maximum value:不填
  • 数字格式:000
  • 引用名称:var
  • 与每用户独立的跟踪计数器:不选
  • 线程组中线程数设置为100

4.启动后结果如下:
可以看到生成了1-100的序号
image

19- 随机变量

随机变量(Random Variable)是 JMeter 中的一种配置元件,用于生成随机数字。

使用场景: 当脚本中不同变量需要不同数字参数值时,该元件仅用于生成随机数字

19.1 界面展示

位置:线程组 -> 右键 -> 添加 -> 配置元件 -> 用户定义的变量

image

19.2 参数说明

输出变量

  • 变量名称: 变量名,例如:age,引用$(age},必填
  • 输出格式: 随机数输出格式。比如“000”,输出为001、002、003…或“USER_000”将输出USER_001、USER_002、USER_003…如果未指定,则输出1、2、3…,非必填

配置随机发生器

  • 最小值: 生成的最小随机数,必填
  • 最大值: 生成的最大随机数,必填
  • 随机种子: 随机函数的种子,供随机数生成器使用的seed构造器。如果为空,则使用默认的Random构造器,非必填

随机种子是什么?

随机种子是用于产生随机输出的值。
由于随机数函数实际上只是一个函数,输出的“随机”值总是基于种子。换句话说,如果您使用相同的种子值为随机输出生成器播种,您将得到相同的“随机”结果。这使您可以轻松地使用完全相同的随机值重复测试,只需传入相同的种子即可

选项

  • 每线程(用户)?: 默认False,如果设置为False,那么所有线程共享同一个随机数生成器,如果设置为True,那么每个线程独享各自的随机数生成器。

提示:无特殊需求的情况下,建议Seed for Random function不填,Per Thread(User)?设置为False,也就是这两项全部默认

19.3 实例

1. 添加 JSR223 Sampler,用于查看日志

  • 线程组 -> 右键 -> 添加 -> 取样器 -> JSR223 Sampler,复制下面代码到JSR223 Sampler脚本中:
log.warn("线程号:"+ctx.getThreadNum()+",随机数:"+vars.get("random_number"));

// 注意:random_number 是随机变量的变量名

2. 修改日志级别为WARN,并选中日志查看

19.3.1 生成1个1-100的随机数

随机变量设置如下:

  • 变量名称:random_number
  • 输出格式:不填
  • 最小值:1
  • 最大值:100
  • 随机种子:不填
  • 每线程(用户)?:False
    线程组中线程数设置为1,启动后结果如下:
    可以看到生成了1个在1-100之间的随机数
    image

19.3.2 生成10个1-1000的随机数,输出格式至少3位数

随机变量设置如下:

  • 变量名称:random_number
  • 输出格式:000
  • 最小值:1
  • 最大值:1000
  • 随机种子:不填
  • 每线程(用户)?:False
    线程组中线程数设置为10,启动后结果如下:
    可以看到设置了输出格式,生成的都是在1-1000之间3位数值不一样的随机数
    image

19.3.3 模拟2个用户,生成10个1-1000的随机数

随机变量设置如下:

  • 变量名称:random_number
  • 输出格式:不填
  • 最小值:1
  • 最大值:1000
  • 随机种子:不填
  • 每线程(用户)?:False
    线程组中线程数设置为2,循环次数设置为5,启动后结果如下:
    可以看到10个数据随机数都不一样,线程内的值不一样,线程与线程之间的值也不一样
    image

19.3.4 模拟3个用户,生成1-1000的随机数,线程组运行2次,且2次随机值一样

随机变量设置如下:

  • 变量名称:random_number
  • 输出格式:不填
  • 最小值:1
  • 最大值:1000
  • 随机种子:1
  • 每线程(用户)?:False
    线程组中线程数设置为3,循环次数设置为1,连续启动 2 次后结果如下:
    可以看到随机种子一样,2次运行结果生成的随机数也是一样的
    image

19.3.5 模拟10个用户,生成1-1000的随机数,且每个随机数都一样

随机变量设置如下:

  • 变量名称:random_number
  • 输出格式:不填
  • 最小值:1
  • 最大值:1000
  • 随机种子:1
  • 每线程(用户)?:True
    线程组中线程数设置为10,循环次数设置为1,启动后结果如下:
    可以看到设置了随机种子,每线程(用户)?选True后,生成的随机数都是一样的
    image

20- CSV 数据文件设置

CSV 数据文件设置(CSV Date Set Config)是 JMeter 中的一种配置元件,用于数据参数化。

使用场景: CSV 数据文件设置从文件里面读取数据,并将这些数据作为参数传递请求,其可以将请求参数放在一个csv文件中,然后通过 CSV 数据文件设置元件读取出来,用来做压测,也就是把文件中的内容,通过变量获取到,支持 csv、txt 格式文件,这样可以在测试运行时模拟不同的用户、输入或数据组合,增加测试的复杂性和覆盖范围。比如用 Jmeter 模拟100个不同的用户登录,我们不可能手动一个一个输入这100个账号密码登录,怎么才能让 Jmeter 自动登录这100个账号呢? CSV Data Set Config 就可以对数据进行参数化实现这种需求。

这种方式是通常所指的参数化。数据存储在文件中,该种参数化方式取值范围大,灵活性强,适用于大量测试数据时的使用。

CSV文件是指“逗号分隔值”(Comma-Separated Values)文件,它是一种简单的文件格式,用于存储表格数据,

例如电子表格或数据库,可以用记事本和Excel打开。

20.1 界面展示

位置:线程组 -> 右键 -> 添加 -> 配置元件 -> CSV 数据文件设置。

JMeter 中引用变量格式为: ${变量名}

image

20.2 参数说明

文件名

  • 可以填文件名称,也可以填路径,如果是名称的话,默认读取bin目录下的文件,点击“浏览”选择文件

文件编码

  • 如果数据文件包含中文或其他特殊字符,则需要确保使用正确的编码,通常选择 UTF-8

变量名称

  • 数据文件中每列数据的变量名称,每个变量名称应该用逗号或其他分隔符分开,与数据文件中的列对应,后面以 ${变量名} 的形式引用,确保数据文件中的数据和参数的顺序一致

忽略首行

  • 选择True,从数据文件第二行开始读取数据
  • 选择False,从数据文件第一行开始读取数据

分隔符

  • CSV 文件中字段之间的分隔符,默认为逗号,,但也可以设置其他字符,例如分号;或制表符\t

是否允许带引号?

  • True:数据文件包含引号时,实际的数据为引号中的数据,比如参数文件中的数据为"1,2",当使用该参数时,实际取得值为1,2
  • False:默认为False,参数文件包含引号时,实际取得值为全部的值。比如参数文件中的数据为"1,2",当使用该参数时,实际取得值为"1,2"会取成两个参数

遇到文件结束符再次循环?

  • True:默认为True,当数据文件的所有数据行都被使用后,JMeter 将重新从文件的开头开始执行数据,比如 csv 文件共有 10 条记录,但线程数有 15 个,循环 10 次后,重头开始循环取值。
  • False:当所有数据执行完后,测试会停止,数据文件不再循环遍历取值。

遇到文件结束符停止线程?

  • True:如果设置为True,当所有数据行用完后,直接停止线程。
  • False:默认为False,当执行完数据文件中所有参数后,相关的线程组将继续执行。

线程共享模式

  • 所有线程:参数文件对所有线程共享,这包括同一测试计划中的不同线程组
  • 当前线程组:只对当前线程组中的线程共享
  • 当前线程:仅当前线程获取

20.3 实例

我们以云端源想登录功能举例,对账号和密码进行参数化,因为是测试数据,所以大家不必纠结数据是否对错,我们只需学习元件的功能。

1. 创建CSV文件

  • CSV 数据文件设置支持 .txt.csv格式的文件,我们创建一个.csv文件,并创建测试数据。
    image
    Description

2. 添加元件

  • 添加CSV 数据文件设置元件,因为我们的csv文件中第一行是账号和密码,我们传参时不取第一行,从第二行开始的,所以忽略首行选择True,其他设置如下图:
    注意:所有属性前后不能有空格,,是英文逗号
    image

3. 引用变量

  • 在HTTP请求中设置参数变量,Jmeter的变量格式是 ${变量名},这样Jmeter就可以获取到 csv 文件中的数据
    image

4. 设置线程组

  • 我们通过设置线程组的循环次数来轮巡dneglu.csv文件中的数据,因为我们模拟了10条数据,所以循环次数设置为10。
    image

5. 查看运行结果

  • 我们可以看到请求成功,并且请求中的参数取到了我们dneglu.csv文件中的数据
    image

通过例子我们知道了CSV数据文件设置用来提供对静态数据配置的支持,可以为取样器提供需要的变量,通常所指的参数化。数据存储在文件中,该种参数化方式取值范围大,灵活性强,适用于大量测试数据时的使用。

21- 用户参数

用户参数(User Parameters)是 JMeter 中的一种前置处理器,用于数据参数化。

使用场景: 用户参数和 CSV Date Set Config 功能一样,都是对数据进行参数化,可以为每一个线程的用户变量指定不同值,在用户参数数据不多时,我们可以用用户参数元件,更多时我们采用 CSV Date Set Config。

21.1 界面展示

位置:取样器 -> 右键 -> 添加 -> 前置处理器 -> 用户参数

image

21.2 参数说明

名称

  • 测试计划的名称,可进行编辑

注释

  • 没有实际作用,仅用户记录用户可读的注释信息

每次迭代更新一次

  • 控制参数取值的变化规则
  • 如果选中该选项,则参数的值在每个迭代中保持不变,在新的迭代开始时取下一个可用值; 如果取消取中该选项,则参数的值在每个其作用域内的Sampler发出请求时取下一个可用值

参数

  • 添加变量:横着添加一行变量信息,此变量会应用于每个用户
  • 删除变量:删除所选中的一行数据
  • 添加用户:竖着添加一个用户信息,一个用户就是一组测试数据
  • 删除用户:删除所选中的一列数据
  • 向上和向下按钮:就是上下移动所选中变量的位置

21.3 实例

对手机号和验证码进行参数化

用户参数设置如下:

  • 取样器 -> 右键 -> 添加 -> 前置处理器 -> 用户参数
  • 添加三条测试数据:2个变量,3个用户
    image

线程组设置如下:

  • 线程数设置为3
    image

启动结果如下:

  • 可以看到登录的参数获取到了用户参数的数据
    image
    image

22- 正则表达式提取器

正则表达式提取器(Regular Expresion Extractor)是 JMeter 中的一种后置处理器,用于提取取样器请求或者响应结果的某个字段作为变量。

使用场景: 正则表达式提取器用于提取请求响应结果中的某个值,存储为指定的变量,用于后续的接口调用,实现接口关联。比如获取 Token 这个过程,就可以用正则表达式提取器来完成。

接口关联:

在开展接口测试的过程中,我们会发现很多接口之间存在数据依赖,需要我们动态从前面的接口返回中提取数据,也就是我们通常说的关联。通俗来讲就是把上一次请求结果中的部分数据截取出来保存为参数,用来传递给下一个请求使用。Jmeter中的关联是如何实现呢?

正则表达式提取器和 JSON 提取器都可以实现接口关联,这节我们先来认识正则表达式提取器。

正则表达式:是一种字符串匹配的模式,对满足匹配条件的字符串进行提取、替换的操作

22.1 界面展示

位置:取样器 -> 右键 -> 添加 -> 后置处理器 -> 正则表达式提取器

JMeter 中引用变量格式为: ${变量名}

image

22.2 参数说明

Apply to

  • 应用范围,选默认的Main sample only就行了

Main sample and sub-samples:对所有主请求和子请求生效
Main sample only:只对子请求有效
Sub-samples only :只对主请求生效
JMeter Variable Name to use:要使用的JMeter变量名

要检查的字段

  • 用来指定元件所处理的数据的来源部分,默认选择主体

主体:从响应体中获取数据,不包含响应头,最常用
Body(unescaped):响应体,替换了所有HTML转义符;不建议使用
Body as a Document:从不同类型的文件中提取数据;影响性能,不建议使用
信息头:从响应头中获取数据
Request Headers:从请求头中获取数据
URL:从URL中获取数据
响应代码:从响应代码中获取数据
响应信息:从响应信息中获取数据

引用名称

  • 将通过正则表达式截取到的值,存到变量中,指定该变量的名称,提取到的多个值将会以变量名_g1、变量名_g2来使用;比如填写token,则可用${token}引用它。

表达式:

  • 通过左右两边不变的边界来提取中间变的返回值,测试常用表达式:(.*?)

():括起来的部分就是需要提取内容
. :匹配任何字符串(除换行符 \n 之外)
\d:匹配任意一个数字
*:匹配 0 次或多次
+:匹配一次或多次
?:在找到第一个匹配项后停止

模板

  • 如果正则表达式有多个提取结果,则提取结果是数组形式,模板$1$、$2$ … 表示把提取到的第几个值赋值给变量,从1开始匹配,若只有一个结果,只能是$1$

$0$:取正则表达式提取的所有值
$1$:取正则表达式提取的第1个值
$2$:取正则表达式提取的第2个值
$1$,$2$:取正则表达式提取的第1个和第2个值,注意:第一个括号中的值与第二个括号中的值连接方式就依赖于它们之间是用什么分隔符,如$1$,$2$,它们之间是用逗号来分隔的,那么取到的第一个值与第二个值连接方式就是逗号分隔

匹配数字(0代表随机)

  • 根据正则表达式所能匹配到的值,非必传

0:代表随机匹配一个值,默认
1:代表匹配第1个值
2:代表匹配第2个值
-1:代表匹配所有值,但是这种情况下引用变量时,就必须要指名引用哪个变量值,如引用名称是token,那么后续引用此变量时,就需要用${token_1}或${token_n}来匹配对应的值

缺省值

  • 正则表达式匹配不到值的时候取该值,非必传,使用空默认值勾选后,提取不到值时,则返回空字符串

22.3 验证表达式是否正确

在查看结果树的结果区切换数据格式为 RegExp Tester,右侧会出现表达式的输入框,输入自己写好的表达式,点击Test,看是否取到你想要的数据,取到则说明表达式正确,否则需要优化表达式。
image

22.4 实例 — 提取Token

在访问网站其他接口时,服务器会验证用户身份 Token,如果 Token 失效或者没有,服务器就会返回状态码 401,提示我们没有访问权限,那么如何解决 401 问题呢?

我们就需要使用正则表达式提取器把登录后接口返回的 Token 提取出来,在后续的访问中引用提取的变量就可以了。

下面这段代码是用户登录后的响应信息:

{
  "code": 200,
  "message": "成功",
  "data": {
    "id": 34,
    "username": "12166880003",
    "no": "9065731695376993",
    "nickname": "星空漫步者",
    "avatar": "https://ydcqoss.ydcode.cn/ydcq/1695193788-6El18K.jpg",
    "phone": "12166880003",
    "type": 0,
    "position": 0,
    "imToken": "OImLI5nZsqrYrgpY9bJsSuYVk+/GPvrWM0+FzIU/Npwy7jPis5t+JphjelNK8pmEC+7ycEdItP0=@6tul.cn.rongna
    "imUserId": "8e79bc1607ed4629b05b5f92207cd2b0",
    "loginToken": "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJleHBpcmVUaW1lIjoxNzAyNTI1NDc2NjYwLCJ1c2VySWQiOjM
  }
}

22.4.1 提取一个字段的值

提取一个 loginToken 的值,设置如下:

  • 引用名称:loginToken
  • 正则表达式:“loginToken”:“(.*?)”
  • 模版:$1$
  • 匹配数组:0
    image
    测试结果:
    image

22.4.2 提取多个字段的值

提取 username 和nickname,设置如下:

  • 引用名称:name
  • 正则表达式:“username”:“(.?)“,“no”:“9065731695376993”,“nickname”:”(.?)”
  • 模版:$1$,$2$
  • 匹配数组:0
    image
    测试结果: 需要哪个值就引用那个变量名,比如${name_g1}、${name_g2}…
    image

22.4.3 一个字段匹配多个值

在响应体中,一个字段有多个值,如下图,我们需提取所有的 name:

{
    "code": 200,
    "data": {
        "title": "TypeScript入门教程",
        "bankBookItemVOList": [
            {
                "isFree": 1,
                "name": "TypeScript介绍",
                "id": 1,
                "describe": "",
                "content": ""
            },
            {
                "isFree": 1,
                "name": "TypeScript安装和环境搭建",
                "id": 2,
                "describe": "",
                "content": ""
            },
            {
                "isFree": 1,
                "name": "基础类型",
                "id": 3,
                "describe": "",
                "content": ""
            },
    "message": "成功"
}
  • 引用名称:name
  • 正则表达式:“name”:“(.*?)”
  • 模版:$0$
  • 匹配数组:-1
    image
    测试结果: 需要哪个值就引用那个变量名,比如${name_1_g1}、${name_2_g1}、${name_3_g1}…
    image

注意:正则表达式提取器依附在需要获取数据的某个采样器之下,数据一般从“查看结果树“的响应数据获取。

23- JSON 提取器

JSON 提取器(JSON Extractor)是 JMeter 中的一种后置处理器,用于提取 JSON 格式的响应数据中的某个字段作为变量。

使用场景: JSON 提取器用于提取请求响应结果中的某个值或者某一组值,存储为指定的变量,用于后续的接口调用,实现接口关联,使用方法比正则表达式提取器简单,所以如果接口响应数据为 json 格式的,我们优先使用json提取器。

23.1 界面展示

位置:取样器 -> 右键 -> 添加 -> 后置处理器 -> JSON 提取器

JMeter 中引用变量格式为: ${Names of created variables}

image

23.2 参数说明

Apply to

  • 应用范围,选默认的Main sample only就行了

Main sample and sub-samples:作用于主请求和子请求
Main sample only: 只对子请求有效
Sub-samples only :只对主请求生效
JMeter Variable Name to use:要使用的JMeter变量名

Names of created variables

  • 将通过 JSON 表达式提取的值,存到变量中,指定该变量的名称,多个变量名通过分号;隔开

JSON Path expression

  • JSON Path表达式,比如$.data.bankBookItemVOList[0].name,多个表达式也是用;隔开

如果遇到key的value值为一个List,则使用.key[n]获取下标为n的元素,其中n为list中元素的编号(下标从0开始计算)
例如 $.data.bankBookItemVOList[0].name,表示从返回数据的bankBookItemVOList中取下标为0的数据,然后再取 name 对应的值

Match No.(0 for Random)

  • 取第几个数值。0 表示随机,不填默认为 0,-1 匹配所有,1 匹配第一个值,多个数值通过分号;隔开

Compute concatenation var (suffix_ALL)

  • 匹配到的所有数值并保存,默认不选即可

Default Values

  • 缺省值,匹配不到值的时候取该值,默认为空即可,也可以填 error,多个缺省值通过分号;隔开

JSON 提取器把提取到的值存储为指定的变量,用于后续的接口调用,使用方法比正则表达式提取器简单,所以如果接口响应数据为json格式的,我们优先使用 JSON 提取器。

23.3 验证表达式是否正确

在查看结果树的结果区切换数据格式为 JSON Path Tester,右侧会出现表达式的输入框,输入自己写好的表达式,点击Test,看是否取到你想要的数据,取到则说明表达式正确,否则需要优化表达式

image

23.4 实例

下面这段代码是电子书详情的响应信息:

{
    "code": 200,
    "data": {
        "cost": 0,
        "browseCount": 199,
        "title": "TypeScript入门教程",
        "authorId": 55,
        "bankBookItemVOList": [
            {
                "isFree": 1,
                "name": "TypeScript介绍",
                "id": 1,
                "describe": "",
                "content": ""
            },
            {
                "isFree": 1,
                "name": "TypeScript安装和环境搭建",
                "id": 2,
                "describe": "",
                "content": ""
            },
            {
                "isFree": 1,
                "name": "基础类型",
                "id": 3,
                "describe": "",
                "content": ""
            },
        ],
        "itemCount": 19,
        "id": 1,
        "describe": "TypeSript是微软研发的编程语言,并于2012年正式发布,主要用于开发大型应用程序。",
        "status": 1
    },
    "message": "成功"
}

23.4.1 提取一个字段的值

提取 title 的值,设置如下:

  • Names of created variables:title
  • JSON Path expression:$.data.title
  • Match No.(0 for Random):0
  • Compute concatenation var (suffix_ALL):默认不选
  • Default Values:error
    image
    image

23.4.2 提取多个字段的值

提取 第一个 name 和 title 的值,设置如下

  • Names of created variables:name;title
  • JSON Path expression:$.data.bankBookItemVOList[0].name;$.data.title
  • Match No.(0 for Random):0;0
  • Compute concatenation var (suffix_ALL):默认不选
  • Default Values:error;error
    image
    image

23.4.3 一个字段匹配多个值

提取 响应体内所有 name 的值,设置如下:

  • Names of created variables:title
  • JSON Path expression:$..name
  • Match No.(0 for Random):-1
  • Compute concatenation var (suffix_ALL):默认不选
  • Default Values:error
    image
    image
  • JMeter 匹配到的多个值,会自动命名为 key_1,key_2,…,key_n,后续可以根据命名直接调用,
  • 如果勾选了Compute concatenation var(suffix_ALL),会把所有匹配到的数据放在key_ALL这个字段中,也可以作为变量直接调用
  • 会自动生成一个变量key_matchNr,标识匹配到的数据数量
    image

23.5 正则表达式提取器和 JSON提取器的区别

在 JMeter 中,正则表达式和 JSON 提取器都是用于从响应数据中提取所需内容,但它们的使用场景略有不同。

  • 正则表达式提取器适用于处理非结构化或不规则格式的响应数据

  • 而 JSON 提取器适用于处理结构化的 JSON 响应数据

正则表达式提取器是 JMeter 的内置功能,用于从响应数据中提取特定模式的文本。它适用于那些响应数据中的内容没有明确定义结构的情况。例如,当响应数据是自由格式的文本、HTML、XML 或其他非结构化数据时,可以使用正则表达式提取器来捕获信息,需要编写适当的正则表达式来匹配并捕获所需的内容。

JSON 提取器是 JMeter 的插件,专门用于从 JSON 格式的响应数据中提取数据。它针对 JSON 数据结构进行了优化,并提供了更便捷的方式来解析和提取 JSON 数据。可以使用 JSON 提取器根据 JSON 路径表达式来定位和提取 JSON 对象、数组或属性中的值。JSON 提取器更适用于处理结构化的响应数据,如 API 响应返回的 JSON 格式数据。

24- 调试取样器

调试取样器(Debug Sampler)是 JMeter 中的一种取样器,可以对 Jmeter 中的过程值(属性、变量、系统属性)进行输出。

使用场景: 调试取样器通常是在脚本调试过程中使用,在正式进行压力测试中不建议使用次元件,比如进行脚本调试时,我想知道正则表达式提取器或 json提取器提取的值是否正确、某些参数化的变量取值是否正确

24.1 界面展示

位置:线程组 -> 右键 -> 添加 -> 取样器 -> 调试取样器

image

24.2 参数说明

JMeter 属性: 是否查看JMeter属性,默认为False

JMeter 变量: 是否查看运行时变量,默认为True

系统属性: 是否查看系统属性,默认为False

JMeter 属性和系统属性在 Jmete r的 bin 的jmeter.properties中定义,一般都不会变,我们在调试脚本时,通常都是查看 JMeter 变量。

24.3 实例

查看正则表达式提取登录的 Token 值。

1. 添加HTTP请求

  • 登录接口设置如下
    image

2. 添加正则表达式提取器

  • 正则表达式提取器设置如下
    image

3. 添加调试取样器

  • 参数都保持默认就行
    image

4. 运行结果如下:

  • 我们可以看到loginToken的值是提取成功了
    image
    其中响应数据我们还可以看到 JMeter 的变量:
    1. JMeterThread.last_sample_ok=true(表示最后一个sample运行成功)
    2. START.HMS=103021(sample 开始运行时间,精确到秒)
    3. START.MS=1702348221449(sample 开始运行时间,精确到毫秒)
    4. START.YMD=20231212(sample 运行的日期)
    5. TESTSTART.MS=1702375941832(sample 测试运行时间,毫秒)

这都是 JMeter 中SampleResult 对象记录的,JMeter 用它来计算响应时间。

25- 实例:查看电子书

在使用 JMeter 进行接口测试时,我们会发现很多接口之间存在着数据关联,如何实现这些关联呢?这节给大家实例演示使用正则表达式提取器和 JSON 提取器实现接口数据关联。

需求: 使用 JMeter 模拟用户在云端源想智能学习平台查看在线书籍中的第一本电子书。

25.1 获取接口信息

从需求中可以看出业务流程是登录 —> 电子书列表 —> 电子书详情,那么我们就需要获取这三个接口的信息,我们使用 Fiddler 抓取相关接口信息,如下:

  • 登录
    image
  • 在线书籍列表
    image
  • 电子书详情
    image

25.2 添加线程组

打开 JMeter 后,我们需要在测试计划下创建线程组,属性都使用默认,无需修改

  • 测试计划 -> 右键 -> 添加 -> 线程(用户)-> 线程组
    image

25.3 添加 HTTP 信息头管理器

在线程组下添加 HTTP 信息头管理器,我们需要模拟浏览器发送请求,根据 Fiddler 抓取的接口填写请求头

  • 线程组 -> 右键 -> 添加 -> 配置元件 -> HTTP信息头管理器
    image

25.4 添加 HTTP 请求默认值

我们把HTTP请求重复的数据 协议和域名、内容编码填写到这里

  • 线程组 -> 右键 -> 添加 -> 配置元件 -> HTTP 请求默认值
    image

25.5 添加登录请求

在线程组下添加 HTTP 请求,根据 Fiddler 抓取的登录接口填写对应的信息。

  • 线程组 -> 右键 -> 添加 -> 取样器 -> HTTP 请求
    image

25.6 添加正则表达式提取器_Token

因为接下来的请求服务器验证了 Token,所以我们需要把 Token 在 HTTP信息头管理器中设为全局变量,在登录接口下添加正则表达式提取器

  • 登录请求 -> 右键 -> 添加 -> 后置处理器 -> 正则表达式提取器
    image
  • 引用Token,设为全局变量
    image

25.7 添加查看在线书籍列表

在线程组下添加 HTTP 请求,根据 Fiddler 抓取的在线书籍列表接口填写对应的信息

  • 线程组 -> 右键 -> 添加 -> 取样器 -> HTTP 请求
    image

25.8 添加 JSON 提取器

因为是查看在线书籍中的第一本电子书,要从电子书列表中获取到某本电子书的 bankElectronicBookId,所以需要在电子书列表接口下添加 JSON 提取器。

  • 电子书列表的 HTTP 请求 -> 右键 -> 添加 -> 后置处理器 -> JSON 提取器
    image

25.9 添加查看电子书详情

查看第一本,引用 JSON 提取器中的变量 ${BookId}

  • 线程组 -> 右键 -> 添加 -> 取样器 -> HTTP 请求
    image

25.10 添加查看结果树

在线程组下添加查看结果树,验证是否成功查看在线书籍中的第一本电子书

  • 线程组 -> 右键 -> 添加 -> 监听器 -> 查看结果树
    image

我们可以看到已经成功查看在线书籍中的第一本电子书。

26- 数据输入函数

26.1 __FileToString 函数

__FileToString 是 JMeter 函数助手中的一种数据输入函数,用于读取指定文件的全部数据。

1. 界面展示

位置:Tools —> 函数助手对话框 —> 选择 __FileToString

image

参数 描述 必填
输入文件的全路径 要读取的文件绝对路径
File encoding if not the platform default (opt) 读取文件的编码方式,如果没有指明就使用平台默认的方式
存储结果的变量名(可选) 重用此函数计算的值的引用名,引用${变量名}

2. 函数演示

  • 读取下面文件的全部数据
    image

  • 生成函数
    ${__FileToString(C:/Users/Administrator/Desktop/denglu.csv,phone)}
    image

26.2 __CSVRead 函数

__CSVRead 是 JMeter 函数助手中的一种数据输入函数,用于读取指定文件内某一列的数据。

__CSVRead 函数和 CSV Data Set Config元件功能基本相同,它两的区别:

  • _CSVRead 不适合于读取数据量很大的文件,因为整个文件都会被存储到内存之中,影响性能结果,对于较大的文件,建议使用配置元件CSV Data Set Config。
  • _CSVRead 读取不同的数据需要设置线程组的线程数,而 CSV Data Set Config 是设置循环次数。
  • _CSVRead 支持从多个文件中读取。

1. 界面展示

位置:Tools —> 函数助手对话框 —> 选择 __CSVRead
image

参数 描述 必填
用于获取值的CSV文件|*别名 要读取的文件绝对路径
CSV文件列号|next |*alias 读取文件内列数下标值,默认是从 0 开始读取,0表示读取文件中的第一列数据,1表示读取文件第二列数据

2. 函数演示

  • 读取下面文件的第一列和第二列
    image

  • 生成函数
    第一列数据:${__CSVRead(C:/Users/Administrator/Desktop/denglu.csv,0)}
    第二列数据:${__CSVRead(C:/Users/Administrator/Desktop/denglu.csv,1)}
    image

26.3 __StringFromFile 函数

__StringFromFile 是 JMeter 函数助手中的一种数据输入函数,用于读取指定文件内某一行的数据。

  • 如果不希望文件内某个格式字符被翻译,需要为它加上单引号;注意"."是格式字符,必须被单引号所包含
    1. 界面展示

位置:Tools —> 函数助手对话框 —> 选择 __StringFromFile
image

参数 描述 必填
输入文件的全路径 要读取的文件绝对路径
存储结果的变量名(可选) 重用此函数计算的值的引用名,引用${变量名}
Start file sequence number (opt) 初始序列号(如果省略这一参数,终止序列号会作为一个循环计数器)
Final file sequence number (opt) 终止序列号(如果省略这一参数,序列号会一直增加下去,不会受到限制)

2. 函数演示

  • 读取下面文件的第一行
    image

  • 生成函数
    ${__StringFromFile(C:/Users/Administrator/Desktop/denglu.csv,phone,)}
    image

27- 数据计算函数

27.1 __counter 函数

__counter 是 JMeter 函数助手中的一种计数器函数,用于统计函数的使用次数,从1开始,每调用这个函数一次它就会自动加 1。

使用方式:统计哪个参数或者元件的执行次数,需要把函数表达式写在参数或者元件名称后面

1. 界面展示

位置:Tools —> 函数助手对话框 —> 选择 __CSVRead

image

参数 描述 必填
TRUE,每个用户有自己的计数器;FALSE,使用全局计数器 TRUE,那么每个用户有自己的计数器,可以用于统计每个线程执行了多少次。如果是FALSE,那就使用全局计数器,可以统计出这次测试共运行了多少次
存储结果的变量名(可选) 重用此函数计算的值的引用名,引用${变量名}

2. 函数演示
查看总共发送了多少次登录请求。

  • 生成函数:${__counter(FALSE,counter)}
    image

  • 把函数表达式粘贴到HTTP请求名称后面
    设置线程组循环次数:5,线程数:2
    image

  • 运行结果
    可以看到登录请求总共运行了10次
    image

27.2 __intSum 函数

__intSum 是 JMeter 函数助手中的一种整数加法计算器,用来计算两个或者多个整数值的和。

1. 界面展示

位置:Tools —> 函数助手对话框 —> 选择 __intSum

image

参数 描述 必填
要添加的第一个整数 值在 -2147483648 到 2147483647 之间
要添加的第二个整数 值在 -2147483648 到 2147483647 之间
存储结果的变量名(可选) 重用此函数计算的值的引用名,引用${变量名}

2. 函数演示

// 返回结果3,并将结果存储在变量sum中,所以 ${sum}=3
${__intSum(1,2,sum)}

// 返回结果20,并将结果存储在变量sum中,所以 ${sum}=20
${__intSum(1,2,5,12,sum)}

// 如果sum值等于20,则返回结果40,1+2+5+12+${sum}
${__intSum(1,2,5,12,${sum})}

27.3 __longSum 函数

__longSum 是 JMeter 函数助手中的一种长整数加法计算器,用来计算两个或者多个整数值的和。

当值不在 -2147483648 到 2147483647 之间,就需要用 __longSum 代替 __intSum

界面展示

位置:Tools —> 函数助手对话框 —> 选择 __longSum

image

参数 描述 必填
要添加的第一个整数 值不在 -2147483648 到 2147483647 之间
要添加的第二个整数 值不在 -2147483648 到 2147483647 之间
存储结果的变量名(可选) 重用此函数计算的值的引用名,引用${变量名}

27.4 __Random函数

__Random 是 JMeter 函数助手中的一种数据计算函数,用来生成指定范围内的随机整数。。

1. 界面展示

位置:Tools —> 函数助手对话框 —> 选择 __Random

image

参数 描述 必填
一个范围内的最小值 随机数的最小值
一个范围内允许的最大值 随机数的最大值
存储结果的变量名(可选) 重用此函数计算的值的引用名,引用${变量名}

2. 函数演示

// 随机返回-10到20之间的整数
${__Random(-10,20,)}

// 随机返回0到20之间的整数,并将结果存储在变量number中,引用 ${number}
${__intSum(0,20,number)}

27.5 __RandomString 函数

__RandomString 是 JMeter 函数助手中的一种数据计算函数,用来生成指定范围和长度的随机字符串。

在有的时候有些参数是不断变化的,我们如果利用__CSVRead去做,还是要准备很多不同的数据,但是我们如果用__RandomString 的话,那么就可以减少这个问题的干扰。

__RandomString不需要提前准备测试数据,只需要设置指定的字符集,函数会从字符集中随机生成指定长度的数据,而__CSVRead 需要提前准备测试数据,对于需要大量测试数据场景,建议使用__RandomString。

函数__RandomString 对于某些场景来说,非常方便,但是他有个缺点是会生成重复的数据,所以我们也要根据自身的使用场景来选择使用那种函数。因此在不允许重复数据的场景下请使用 CSV Date Set Config 元件。

1. 界面展示

位置:Tools —> 函数助手对话框 —> 选择 __RandomString

image

参数 描述 必填
Random string length 生成字符串的数字长度
Chars to use for random string generation 用于生成字符串的字符集合
存储结果的变量名(可选) 重用此函数计算的值的引用名,引用${变量名}

2. 实例演示

  • 需求1:随机生成8位数
表达式:${__RandomString(8,0123456789,)}
  • 需求2:随机生成6位数的大写字母+数字,并存到变量number中
${__RandomString(6,0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ,number)}

28- 如果(If)控制器

如果(If)控制器(If Controller)是 JMeter 的一种逻辑控制器,用于控制其下面的后代元件是否执行,如果为 true 则执行,false 则不执行。

使用场景: 如果(If)控制器在实际的性能脚本场景中应用非常广泛,主要用来根据上个请求执行结果判断是否执行 If 控制器里面的请求。比如登录和添加购物车两个请求,判断当前用户是否登录,如果登录则执行下面的加入购物车请求,如果没有登录则不执行加入购物车请求

28.1 界面展示

位置:线程组 -> 右键 -> 添加 -> 逻辑控制器 -> 如果(If)控制器

image

28.2 参数说明

Expression(must evaluate to true or false)

  • 表达式
  • 结果必须是 true 或 false,也就是说,在右边文本框中输入的条件值必须是true 或 false
 JMeter 内置的两种函数 表达式:
 	_jexl3:${__jexl3(${test}==1)}
 	_groovy:${__groovy(${test}==1)}
 
==:等于,如 1==1 或 ${__jexl3(1==1,)}

> 、<:大于、小于,如 2>1,1<2,或 ${__jexl3(2>1,)}    

>=、`<=`:大于等于、小于等于,如 2>=1 ,或 ${__jexl3(2>=1,)} 

!=、!:不等于,非,如 "y"!="n",非 则取 != 的反值

多条件可用:|| 或,&& 和,如:2<5 && 2>1,${__jexl3(2<5 && 2>1,)}

另外,如果字符串必须要用引号,变量都认为字符串的形式,如:${_jexl3("${ischildren}"=="y",)}

Interpret Condition as Variable Expression?

  • 将条件解释为变量表达式,默认勾选
  • 如果勾选了,Expression 中不能直接填写条件表达式,需要借助函数 JMeter 内置函数 _jexl3 或者 _groovy 将条件表达式计算为 true/false,比如
  • 如果不勾选,直接输入我们需要判断的表达式,判断表达式为真时,执行if控制器下的请求,例如“1!=2”,则一定会执行下面的http请求
For performance it is advised to check "Interpret Condition as Variable Expression"
and use _jexI3 or _groovy evaluating to true or false or a variable that contains true or false.
${JMeterThread.last sample_ ok} can be used to test if last sampler was successful

翻译:
为了提高性能,建议选中“Interpret Condition as Variable Expression?”,
和使用 _jexI3或 _groovy,判断为true或false或包含true或false的变量。
${JMeterThread.last-sample_ok} 可用于测试最后一个采样器是否成功

这段话就是提示,建议采用 `_jexl3` or `_groovy` 表达式,以提高性能,也就是默认的方式。
IF 控制器 只能作用于其下的子项

Evaluate for all childern?

  • 是否每次执行子取样器的时候,都执行一次if控制器,一般不勾选
  • 勾选:if控制器会在其节点下的每个取样器之前执行一次,根据表达式结果判断是否执行该取样器
  • 不勾选:if控制器只在入口处执行一次,根据表达式结果判断是否执行该取样器

28.3 实例

1. 添加线程组

2. 添加用户定义的变量

  • 添加变量 test:1
    image

3. 添加如果(If)控制器

4. 添加调试取样器

  • 在如果(If)控制器下添加调试取样器
  • 线程组 -> 右键 -> 添加 -> 逻辑控制器 -> 如果(If)控制器

5. 添加查看结果树

28.3.1 _jexI3函数表达式写法

  • 函数助手生成表达式:
    image

  • 如果(If)控制器设置如下:
    表达式:${__jexl3(${test}==1)}
    image

  • 运行结果如下:
    IF 控制器 中的 表达式:${__jexl3(${test}==1)} 返回值为 true,所以调试取样器会执行
    image
    修改用户定义的变量 test:2,运行后IF 控制器 中的 表达式返回值为 false,所以调试取样器不会执行
    image

28.3.2 _groovy函数表达式写法

  • 函数助手生成表达式:
    image

  • 如果(If)控制器设置如下:
    表达式:${__groovy(vars.get(“test”)==“1”)}
    image

  • 运行结果如下:
    IF 控制器 中的 表达式:${__groovy(vars.get("test")=="1")} 返回值为 true,所以调试取样器会执行
    image
    修改用户定义的变量 test:2,运行后IF 控制器 中的 表达式返回值为 false,所以调试取样器不会执行
    image

29- 事务控制器

事务控制器(Transaction C ontroller)是 JMeter 的一种逻辑控制器,用于统计其节点下所有请求的执行消耗时间。

使用场景: 事务响应时间是性能测试重要的指标,事务控制器可以统计其节点下的取样器执行消耗时间,生成一个额外的样本,这样能够将它的所有子元素作为一个计量单元进行监听,事务控制器本身不包含任何业务逻辑,只是组合出一个新的计量单元。

29.1 界面展示

位置:线程组 -> 右键 -> 添加 -> 逻辑控制器 -> 事务控制器

image

29.2 参数说明

Generate parent sample

  • 勾选,则聚合报告中只显示事务控制器的数据,聚合报告会将事务控制器及其下的取样器执行情况均统计,最终仅以事务控制器作为结果显示出来
  • 不勾选,则聚合报告中所有的取样器都显示,默认不勾选
    比如下图是不勾选的,事务控制器仅作为独立的取样器进行展示,所有的请求均显示出来了
    image

Include duration of timer and pre-post processors in generated sample

  • 是否在生成的取样器中统计包括定时器、前置处理/后置处理的延迟时间,默认是不勾选。如勾选,则在请求前后加上定时器、前置处理/后置处理器,那么会将定时器时间包含到响应时间里面

29.3 实例

1个用户访问某本电子书详情,统计访问电子书详情的所用时间。

1. 事务处理器设置如下:

  • 勾选Generate parent sample
    image

2. 添加登录、电子书列表、电子书详情的HTTP请求

  • 在事务处理器下添加登录、电子书列表、电子书详情的HTTP请求
    image

3. 添加查看结果树

4. 运行结果如下:

  • 可以看到实物控制器节点下的3个请求接口,其取样器结果的 Load time:1127,也就是次用户从登录到访问电子书详情所用时间为 1127 ms
    image

30- 循环控制

循环控制器(Loop Controller)是 JMeter 的一种逻辑控制器,用于控制其节点下请求的循环次数。

使用场景: 线程组的循环次数是控制整个线程组节点下的取样器迭代次数,而循环次数元件是控制其元件节点下的取样器迭代次数。如果想使线程组下的某些取样之间器运行次数不同,循环控制器就可以解决此类问题。

30.1 界面展示

位置:线程组 -> 右键 -> 添加 -> 逻辑控制器 -> 循环控制器

image

30.2 参数说明

循环次数

  • 设置控制器节点下每个取样器的循环次数,默认是 1 次,和线程组中的循环次数类似
  • 勾选永远,表示无限循环
1. 如果同时设置了线程组的循环次数和循环控制器的循环次数,那循环控制器节点下的取样器运行的次数为两个数值相乘的结果。

2. 如果控制器循环次数勾选`永远`,线程组设置了持续时间,就会按照线程组的持续时间执行

30.3 实例

用户登录一次,访问电子书列表和详情2次。

1. 添加线程组

  • 测试计划 -> 右键 -> 添加 -> 线程(用户)-> 线程组
  • 参数默认
    image

2. 添加登录

  • 线程组 -> 右键 -> 添加 -> 取样器 -> HTTP请求
  • 名称:登录
    image

3. 添加循环控制器

  • 线程组 -> 右键 -> 添加 -> 逻辑控制器 -> 循环控制器
  • 循环次数:2
    image

4. 添加电子书列表、详情

  • 循环控制器 -> 右键 -> 添加 -> 取样器 -> HTTP请求
  • 名称:电子书列表
    image

5. 添加查看结果树

6. 启动,结果如下:

  • 可以看到登录运行了一次,循环控制器下的电子书列表和详情 运行了 2 次
    image

31- ForEach 控制器

For Each 控制器(ForEach Controller)是 JMeter 的一种逻辑控制器,用于对一组变量进行循环迭代。

使用场景: For Each 控制器是把一组变量作为入参,对这组变量的值进行遍历,再把遍历的值作为出参,被控制器节点下的取样器引用。一般搭配用户变量使用,也就是该组件通常与 JSON 提取器、正则表达式提取器等进行联合使用,比如把商品列表中的部分商品加入购物车,就会用到 ForEach 控制器。

31.1 界面展示

位置:线程组 -> 右键 -> 添加 -> 逻辑控制器 -> ForEach 控制器

image

31.2 参数说明

输入变量前缀

  • 输入变量前缀,可以在“用户自定义变量”中定义一组变量,循环控制器可以从中获取到变量对应的值,然后作为循环控制器的循环条件,还可以输出变量作为取样器的参数

开始循环字段

  • 循环变量起点,默认从0开始,如果填写是1,实际是从1+1个开始执行,以下图为例:填写0,取BookId_1的值1;填写3,取BookId_4的值5
    image

结束循环字段

  • 循环变量终点

输出变量名称

  • 输出变量名称,循环控制器生成的变量名称。后续可通过${变量名}引用

数字之前加上下划线"_"?

  • 变量前缀后是否加“_”作为分隔符。如果定义的变量名中有下划线的话就要勾选此项,否则找不到;反之,没有的话不要勾选,否则同样找不到变量

31.3 实例

JSON 提取器 + ForEach 控制器查看第2本电子书-第6本电子书

1. JSON 提取器设置

  • 电子书列表取样器 -> 右键 -> 添加 -> 后置处理器 -> JSON提取器
    image

2. ForEach 控制器设置

  • 输入变量前缀:BookIds(JSON提取器的变量名)
  • 开始循环字段:1
  • 结束循环字段:6
  • 输出变量名称:BookId
    image

3. 查看结果

  • 我们可以看到JSON提取器取到了所有电子书的id,ForEach 控制器遍历取到了第2-6的值
    image
  • 第2本电子书id
    image
  • 第3本电子书id
    image
  • 第4本电子书id
    image

32- 交替控制器

交替控制器(Interleave Controller)是 JMeter 的一种逻辑控制器,用于每次循环对控制器节点下的请求进行交替执行。

使用场景: 交替控制器包含的取样器步骤交错执行在每个循环中,线程用户依据循环的次数请求控制器中的请求数。可以将内部的元件在线程迭代时交替执行,交替控制器内部一般会有多个取样器。

32.1 界面展示

位置:线程组 -> 右键 -> 添加 -> 逻辑控制器 -> 交替控制器

image

32.2 参数说明

忽略子控制器块

  • 子控制器功能失效,由交替控制器代替
  • 勾选后,会无视节点下的所有控制器<交替控制器、随机控制器例外>,将每个取样器作为一个单独子节点执行
  • 不勾选,交替执行时,节点下次一级每个取样器、逻辑控制器都认为是一个单独子节点来交替执行

Interleave across threads

  • 跨线程交替,线程组在设置了多线程运行时,每一轮循环时,每个线程都在交替控制器中拿到新的请求
  • 勾选后,当线程组线程数大于1时,当前线程首次执行会根据线程数顺序进行交替,后续执行按自己所属线程的上一个次的执行的位置交替

比如:交替控制器下有 A B C D E 5个接口,设置线程组线程数3个,循环4次,则最终执行结果为:
线程1:执行 A B C D
线程2:执行 B C D E
线程3:执行 C D E A
image

32.3 实例

1. 添加线程组

  • 测试计划 -> 右键 -> 添加 -> 线程(用户)-> 线程组
  • 循环次数:5
    image

2. 添加3个调试取样器请求

  • 线程组 -> 右键 -> 添加 -> 取样器 -> 调试取样器
  • 名称:调试取样器_001
  • 名称:调试取样器_002
  • 名称:调试取样器_003
    image

3. 添加查看结果树

4. 启动结果如下:

  • 未加交替控制器的运行如下图:可以看到每个取样器都循环执行了5次,总共执行15个请求
    image

5. 添加交替控制器

  • 把调试取样器_002和调试取样器_003放到交替控制器节点下
    image

6. 启动结果如下:

  • 加了交替控制器的运行如下图:可以看到总共执行了10个请求,交替控制器节点下的请求每次循环都和节点外的请求交替执行
    image

33- 仅一次控制器

仅一次控制器(Once Only Controller)是 JMeter 的一种逻辑控制器,每次循环对控制器节点下的所有请求只执行一次。

使用场景: 可以让控制器内部的逻辑只执行一次,单次的范围是针对某一个线程,无论线程外面迭代多少次或者里面循环多少次,均只执行一次,单次控制器一般可用于登录,全局参数设置这种只执行一次的逻辑控制

在每个线程内,该控制器下的内容只会被执行一遍,无论循环多少次,都只执行一遍。

  • 嵌套在循环控制器之内时是个例外,每个线程组循环都会被执行一遍
  • 针对循环次数生效,对并发数(线程组数)不生效

33.1 界面展示

位置:线程组 -> 右键 -> 添加 -> 逻辑控制器 -> 仅一次控制器

image

33.2 实例

1. 添加线程组

  • 测试计划 -> 右键 -> 添加 -> 线程(用户)-> 线程组
  • 循环次数:5
    image

2. 添加3个调试取样器请求

  • 线程组 -> 右键 -> 添加 -> 取样器 -> 调试取样器
  • 名称:调试取样器_001
  • 名称:调试取样器_002
  • 名称:调试取样器_003
    image

3. 添加查看结果树

4. 启动结果如下:

  • 未加仅一次控制器的运行如下图:可以看到每个取样器都循环执行了5次,总共运行15个请求
    image

5. 添加仅一次控制器

  • 把调试取样器_002和调试取样器_003放到仅一次控制器节点下
    image

6. 启动结果如下:

  • 加了仅一次控制器运行如下图:可以看到总共只执行了7次请求,其他请求执行了5次,但是仅一次控制器下的请求只执行了一次
    image

34- 随机控制器

随机控制器(Random C ontroller)是 JMeter 的一种逻辑控制器,每次循环对控制器节点下的请求随机执行一个。

使用场景: 一般用来模拟业务的不确定性,随机控制器在线程迭代或者控制器循环的时候均会触发,随机控制器节点下的元件随机运行一个,与交替控制器不一样的是节点下的元件运行顺序不定。

34.1 界面展示

位置:线程组 -> 右键 -> 添加 -> 逻辑控制器 -> 随机控制器

image

34.2 参数说明

忽略子控制器

  • 子控制器功能失效,由随机控制器代替
  • 勾选后,会无视节点下的所有控制器<交替控制器、随机控制器例外>,将每个取样器作为一个单独子节点执行
  • 不勾选,交替执行时,节点下次一级每个取样器、逻辑控制器都认为是一个单独子节点来交替执行

34.3 实例

1. 添加线程组

  • 测试计划 -> 右键 -> 添加 -> 线程(用户)-> 线程组
  • 循环次数:5
    image

2. 添加3个调试取样器请求

  • 线程组 -> 右键 -> 添加 -> 取样器 -> 调试取样器
  • 名称:调试取样器_001
  • 名称:调试取样器_002
  • 名称:调试取样器_003
    image

3. 添加查看结果树

4. 启动结果如下:

  • 未加仅一次控制器的运行如下图:可以看到每个取样器都循环执行了5次,总共运行15个请求
    image

5. 添加随机控制器

  • 把所有调试取样器放到随机控制器节点下
    image

6. 启动结果如下:

  • 加了随机控制器运行如下图:可以看到总共执行了5个请求,每次循环在3个取样器中随机执行1个
    image

35- 随机顺序控制器

随机顺序控制器(Random Order Controller)是 JMeter 的一种逻辑控制器,每次循环对控制器节点下的请求全都执行一遍,但是执行顺序不一样。

使用场景: 控制器节点下的请求按随机顺序执行,也就是每次循环随机顺序控制器节点下的请求全部随机执行一遍,每个元件只执行一次,当控制器被触发时,将控制器下的所有子节点顺序打乱执行一遍,一般用来模拟业务的不确定性,随机顺序控制器在线程迭代或者控制器循环的时候均会触发。

35.1 界面展示

位置:线程组 -> 右键 -> 添加 -> 逻辑控制器 -> 随机顺序控制器

image

35.2 实例

1. 添加线程组

  • 测试计划 -> 右键 -> 添加 -> 线程(用户)-> 线程组
  • 循环次数:5
    image

2. 添加3个调试取样器请求

  • 线程组 -> 右键 -> 添加 -> 取样器 -> 调试取样器
  • 名称:调试取样器_001
  • 名称:调试取样器_002
  • 名称:调试取样器_003
    image

3. 添加查看结果树

4. 启动结果如下:

  • 未加仅一次控制器的运行如下图:可以看到每个请求都循环执行了5次,总共执行15个请求
    image

5. 添加随机顺序控制器

  • 把所有调试取样器放到随机控制器节点下
    image

6. 启动结果如下:

  • 加了随机顺序控制器运行如下图:可以看到总共执行了15个请求,循环了5次,每次循环的3个请求顺序都不一样
    image

36- 吞吐量控制器

吞吐量控制器(Throughput Controller)是 JMeter 的一种逻辑控制器,用来控制其节点下请求的执行次数

使用场景: 允许用户控制其节点下请求的执行次数,并无控制吞吐量的功能,一般用于部分请求执行不同的次数,比如我们有个压测场景是80%的用户访问商品A,20%的用户访问商品B,即在同一个线程组里,有10个并发,8个访问商品A,2个访问商品B,要模拟这种场景,可以通过吞吐量模拟器来实现

有两种模式:执行百分比和指定总数;吞吐量控制器不会影响取样器的 TPS,但会控制其内部逻辑的执行次数

36.1 界面展示

位置:线程组 -> 右键 -> 添加 -> 逻辑控制器 -> 吞吐量控制器

image

36.2 参数说明

这里的吞吐量是总迭代次数,总迭代次数 = 线程数 x 循环次数

Total Executions

  • 按次数计算
  • 吞吐量次数 > 总迭代次数,控制器节点下的请求按照总迭代次数执行
  • 吞吐量次数 < 总迭代次数,控制器节点下的请求按照吞吐量次数执行

Percent Executions

  • 按百分比计算
  • 最小不能为0,为0时控制器节点下的请求不执行
  • 最大不得超过100,超过100控制器节点下的请求按照总迭代次数执行

吞吐量

  • 对于 percent execution:0-100,代表执行次数的百分比,比如线程总迭代次数100,吞吐量填写30,那么就是执行30%,也就是30次
  • 对于 total executions:代表执行的总次数

Per User

  • 默认不勾选
  • 当选Total Executions时,勾选后,控制器节点下的请求按线程数执行
  • 当选percent Executions时,勾选后,控制器节点下的请求按总迭代次数执行

36.3 实例

用户登录后,总共执行10次操作,70%的操作是访问电子书列表,30%的操作是访问电子书详情

1. 添加线程组

  • 测试计划 -> 右键 -> 添加 -> 线程(用户)-> 线程组
  • 循环次数:10
    image

2. 添加仅一次控制器

  • 线程组 -> 右键 -> 添加 -> 逻辑控制器 -> 仅一次控制器

3. 添加登录请求

  • 在仅一次控制器下添加登录请求
  • 仅一次控制器 -> 右键 -> 添加 -> 取样器-> HTTP请求
  • 填写登录相关参数,此处不作多说

4. 添加吞吐量控制器

  • 名称:吞吐量控制器_电子书列表
  • 选择 Percent Executions
  • 吞吐量:70
    image

5. 添加电子书列表请求

  • 在吞吐量控制器_电子书列表下添加电子书列表请求
  • 吞吐量控制器 -> 右键 -> 添加 -> 取样器-> HTTP请求

6. 添加吞吐量控制器

  • 名称:吞吐量控制器_电子书详情
  • 选择 Percent Executions
  • 吞吐量:30
    image

7. 添加电子书列表请求

  • 在吞吐量控制器_电子书详情下添加电子书详情请求
  • 吞吐量控制器 -> 右键 -> 添加 -> 取样器-> HTTP请求

8. 添加汇总报告

  • 线程组 -> 右键 -> 添加 -> 监听器-> 汇总报告
    image

9. 启动结果如下:

  • 可以看到总共执行了11个请求,登录后执行了10次请求,查看电子书执行了7次,查看电子书详情执行了3次
    image

37- Switch 控制器

Switch 控制器(Switch Controller)是 JMeter 的一种逻辑控制器,通过给控制器中的 Value 赋值,来指定运行哪个请求。

运行场景: Switch Controller 可以应用在根据上个请求返回结果的不同,运行Switch Controller中对应的请求,例如:有个订单查询业务,查询到的订单有未支付、已支付、申请退货、等不同的状态。在Switch Controller中判断订单查询请求的订单状态,如果是未支付,则运行支付业务;已支付,则运行发货业务;申请退货,则运行退费业务。

37.1 界面展示

线程组 -> 右键 -> 添加 -> 逻辑控制器 -> Switch 控制器

image

37.2 参数说明

Switch Value

  • 表示需要执行Switch控制器中的哪一个取样器

  • Switch Value 值可以用请求下标值、请求名称和引用变量

  • 请求下标值: 如果没有赋值,或者下标值超过请求个数的话就从控制器节点下的第一个开始执行,也就是默认下标为0

  • 请求名称: 输入Switch控制器里面请求的名称,匹配与请求中的名称相同则执行该请求,注意是完全匹配,不是模糊匹配,如果没匹配到,控制器会不执行

  • 引用变量: 如果变量值是数字,相当于下标值;如果变量值是字符串,就相对于名称,会和Switch控制器里面请求的名称进行匹配

37.3 实例

37.3.1 Switch Value:下标值

1. 不填 Switch Value

  • 不填 Switch Value
    image
  • 启动结果如下:
    可以看到执行了Switch 控制器下的第1个请求查看电子书列表
    image

2. Switch Value下标值为 1

  • Switch Value:1
    image
  • 启动结果如下:
    可以看到执行了Switch 控制器下的第2个请求查看电子书详情,因为没有执行第一个请求,获取不到电子书id,所以报红了
    image

2. Switch Value下标值为 2

  • Switch Value:1
    image
  • 启动结果如下:
    可以看到执行了Switch 控制器下的第1个请求查看电子书列表,因为下标值超过请求个数,所以Switch 控制器默认为0,执行第1个请求
    image

37.3.2 Switch Value:请求名称

  • Switch Value:查看电子书列表
    image
  • 启动结果如下:
    可以看到执行了Switch 控制器下的第1个请求查看电子书列表
    image

37.3.3 Switch Value:引用变量

比如有个视频列表,根据判断视频状态进行对应操作:视频状态:0-未解锁、1-已解锁、2-录制中

  • 视频未解锁,请求解锁接口
  • 视频解锁,观看视频
  • 视频录制中,不操作

因为本节主要讲Switch 控制器,所以其他元件就不演示了,我们重点看看Switch 控制器是如何根据引用变量实现控制请求的。

1. 设置Switch Value:${__Random(0,2,type)}

  • 使用函数助手_Random随机生成数字作为下标值,来代替视频状态
    image

2. 添加HTTP请求

  • 在控制器下添加解锁视频、观看视频、不操作请求
  • 注意:此处的不操作请求可以用调试取样器代替,因为Switch控制器下标值超过请求个数时,控制器会默认下标值为0,执行其节点下的第一个请求,所以此处需添加调试取样器代替不操作请求,相当于是占位
    image

3. 启动结果如下:

  • 可以看到type=1,控制器执行的是观看视频
    image

38- 固定定时器

固定定时器(Constant Timer)是 JMeter 中的一种常用定时器,用于对每一个线程延迟固定时间。

使用场景: 如果希望每个线程在两次请求之间暂停相同的时间,可以使用此定时器。一般情况下,JMeter线程在发送请求之间是没有间歇时间的,为了更加真实地模拟用户请求情况,会将定时器用于在用户操作之间,为每个操作设置等待时间。

定时器是在每个取样器之前执行,无论定时器位置放在取样器之前还是之后,执行一个取样器时,所有当前作用范围内的定时器都会被率先执行。如果需要定时器只对其中一个取样器生效,则需要将定时器作为取样器的子节点加入。

当放置固定定时器,于两个HTTP请求之间时,它代表的含义是在上一个请求发出至完成后,开始固定定时器指定的时间,最后再发出第二个请求,并不是代表两个请求之间的发送间隔时间。

38.1 界面展示

位置:取样器 -> 右键 -> 添加 -> 定时器 -> 固定定时器

image

名称

  • 测试计划的名称,可进行编辑

注释

  • 没有实际作用,仅用户记录用户可读的注释信息

线程延迟(毫秒)

  • 线程延迟时间,默认300ms

38.2 实例

在查看电子书之前,需要登录账号,当用户还没登录时,就发起了查看电子书操作,那就会报错。此时,就需要在查看电子书之前先等待一下。这与自动化脚本中的强制等待sleep类似。比如,这里设置延迟5000毫秒,也就是5秒。

1. 未添加固定定时器

  • 首先在没有设置固定定时器时,两个请求之前的间隔时间,如图所示:可以看出请求之前的间隔时间非常的短,这样很可能会出现上诉中的所述问题
    image

2. 添加固定定时器

  • 在查看电子书下添加固定定时器,为了更好的查看效果,线程延迟时间设置为5000,也就是5s
  • HTTP请求 -> 右键 -> 添加 -> 定时器 -> 固定定时器
    image

3. 启动结果如下

  • 可以看到请求之间隔了5秒
    image

注意:固定定时器的延时不会计入单个sampler的响应时间,但会计入事务控制器的时间

39- 统一随机定时器

统一随机定时器(Uniform Random Timer)是 JMeter 中的一种常用定时器,用于对每一个线程延迟随机时间。

使用场景: 统一随机定时器和固定定时器功能基本相同,只是随机延迟时间是对每一个线程随机延迟一定时间,而固定定时器是对每一个线程随机延迟固定时间。

39.1 界面展示

位置:取样器 -> 右键 -> 添加 -> 定时器 -> 统一随机定时器

image

39.2 参数说明

名称

  • 元件的名称,可进行编辑

注释

  • 没有实际作用,仅记录用户可读的注释信息

Random Delay Maximum (in milliseconds)

  • 随机延迟时间最大值,单位:毫秒

Constant Delay Offset(in milliseconds)

  • 常量延迟时间,单位:毫秒

总延迟时间=随机时间+常量时间

39.3 实例

用户登录完成后,间隔2秒以上,访问电子书,再间隔3秒以上知识库

1. 未添加固定定时器

  • 首先在没有设置固定定时器时,请求之前的间隔时间,如图所示:可以看出请求之前的间隔时间非常的短,这样很可能会出现上诉中的所述问题
    image

2. 添加统一随机定时器

  • 在查看电子书下添加统一随机定时器,随机延迟时间设置为5000,常量延迟时间设置为2000
  • 在知识库下添加统一随机定时器,随机延迟时间设置为5000,常量延迟时间设置为3000
  • HTTP请求 -> 右键 -> 添加 -> 定时器 -> 统一随机定时器
    image
    image

3. 启动结果如下

  • 可以看到登录后间隔5s查看电子书,再次等待4秒查看知识库
    image

40- 同步定时器

同步定时器(Synchronized Timer)是 JMeter 中的一种常用定时器,用于模拟并发测试的集合点。

使用场景: 在同步定时器处,使线程等待,一直到指定的线程个数达到后,然后同时释放,可以在瞬间制造出很大的压力。它和 LoadRunner 的集合点差不多的功能,当需要进行大量用户的并发测试时,为了让用户能真正的同时执行,添加同步定时器,用户阻塞线程,直到线程数达到预先配置的数值,才开始执行取样器的操作,常应用于并发测试,比如秒杀,抢购等场景

40.1 界面展示

位置:取样器 -> 右键 -> 添加 -> 定时器 -> 同步定时器

image

40.2 参数说明

名称

  • 元件的名称,可进行编辑

注释

  • 没有实际作用,仅记录用户可读的注释信息

模拟用户组的数量

  • 阻塞线程数,比如设置为10,线程启动后,线程数在达到 10 前会一直阻塞,直到线程数到达10后会同时请求
  • 线程数大于模拟用户组的数量时,元件才会生效

超时时间

  • 阻塞时间,必须配置
  • 比如当线程数达不到阻塞线程数时,一直阻塞,当等待时间大于阻塞时间时,不再继续等待,会执行线程
  • 超时时间不能配置的太小,如果太小当用户数达不到模拟用户组的数量时,请求就会发出。

40.3 实例

模拟100个用户运行20秒,5个/s用户同时登录

1. 添加线程组

  • 线程数设置为100,Ramp—Up时间设置为20,其他参数默认
    image

2. 不添加定时器运行结果

  • 看到线程不是每秒5个执行
    image

3. 添加同步定时器

  • 线程组 -> 右键 -> 添加 -> 定时器 -> 同步定时器
  • 模拟用户组数量设置为5,超时时间设置为1000ms
    image

4. 启动结果:

  • 可以看到线程是按照同步定时器配置的5个线程一起释放的
    image

41- 响应断言

响应断言(Response Assertion)是 JMeter 中的一种断言,用于判断响应信息与预期结果的对比。

响应断言是最常用的一种断言方法,断言是在请求的返回层面增加一层判断机制,因为请求成功了,并不代表结果一定正确,因此需要断言提高测试准确性,响应断言主要是对响应结果中的文本内容进行检查,查看是否返回了我们的预期结果。

使用场景: 当响应中有明显的业务标志时,响应断言元件可以检测响应报文返回的特征值,进而判断取样器在业务上是否确定;响应断言可以适用各种返回类型的响应结果,如Test、html、application/json、application/xml等。

41.1 界面展示

位置:取样器 -> 右键 -> 添加 -> 断言 -> 响应断言

image

41.2 参数说明

Apply to:断言作用域

  • Main sample and sub-samples:作用于父节点取样器及对应子节点取样器,即对所有取样器进行断言
  • Main sample only:只作用于父节点取样器,默认选择这个
  • Sub-samples only:只作用于子节点取样器
  • JMeter Variable:只作用于jmeter变量,针对某一个变量进行断言(输入框内输入变量名称)

测试字段:断言匹配信息区域

  • 响应文本:响应结果中的 Response Body,最常用的断言字段,也是默认选择
  • 响应代码:响应结果中的 Response code,比如状态码 200
  • 响应信息:响应结果中的 Response message,比如 OK
  • 响应头:响应结果中的 Response header
  • 请求头:请求结果中的 Request Headers
  • URL样本: 请求结果中的 Request body中的地址
  • 文档(文本):通过Apache Tika从各种的文档中提取的文本进行验证,包括html、word 等等各种格式
  • 忽略状态: 一个请求多项响应断言时,忽略某一项断言的响应结果,而继续下一项断言
  • 请求数据:请求结果中的 Request Body

模式匹配规则

  • 包括:响应内容包括需要匹配断言值即代表响应成功,最常用的断言字段,也是默认选择
  • 匹配:响应内容要完全匹配断言值即代表响应成功,大小写不敏感
  • 相等:响应结果与指定的断言值完全一致,大小写敏感
  • 字符串:返回结果,包含指定的字符串
  • 否:不进行匹配

测试模式

  • 与模式匹配规则一同使用,可以直接写值也可以使用正则表达式

自定义失败消息

  • 当结果和匹配断言值不匹配时,Assertion failure message返回自定义的消息,如果不填写,默认失败时返回断言

41.3 实例

对登录接口响应进行检查,如果 Response Body 中有 "code":200,"message":"成功",表示测试通过,否则返回登录失败。

下面是登录接口的 Response Body。

{
  "code": 200,
  "message": "成功",
  "data": {
    "id": 34,
    "username": "12166880003",
    "no": "9065776993",
    "nickname": "星空漫步者",
    "avatar": "https://ydcqoss.ydcode.cn/ydcq/1695193788-6El18K.jpg",
    "phone": "12166880003",
    "type": 0,
    "position": 0,
    "imToken": "OImLI5nZsqrYrgpY9bJsSuYVk+/GPvrWM0+FzIU/Npwy7jPis5t+JphjelNK8pmEC+7ycEdItP0=@6tu
    "imUserId": "8e79bc1607ef92207cd2b0",
    "loginToken": "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJleHBpcmVUaW1lIjoxNzAyNjQwODQzNTE3LCJ1c2VySWQ
  }
}

1. 登录请求

  • 对登录接口进行测试用例参数化,因为我们只创建了5条数据,所以需要在线程组中设置循环次数为5。
    image
    image

2. 响应断言设置

  • 测试模式:"code":200,"message":"成功",自定义消息:登录失败
    image

3. 运行结果如下:

  • Response Body中有 "code":200,"message":"成功",表示通过
    image
  • Response Body中没有 "code":200,"message":"成功",表示未通过,且返回了登录失败
    image
    image

42- JSON 断言

JSON 断言(JSON Assertion)是 JMeter 中的一种断言,用于判断 JSON 格式的响应信息与预期结果的对比。

使用场景: JSON 断言检查某个字段值是否等于我们指定的断言值,所以 JSON 断言只能针对响应结果为applicaton/json格式的进行断言操作,如果是其他类型(如:Test、html),则无法使用这种断言。

42.1 界面展示

位置:取样器 -> 右键 -> 添加 -> 断言 -> JSON 断言

image

42.2 参数说明

Assert JSON Path exists

  • 需要断言的 JSON 表达式,即 JSON 元素的路径(JSONPath),检测 JSONPath 是否存在,使用 XPATH 语法书写

Additionally assert value

  • 是否额外验证根据 JSONPath 提取的值,一般会勾选验证预期值
  • 不勾选,验证 JSONPath 能否在 JSON 文档中找到路径,默认不勾选
  • 勾选,验证根据 JSONPath 提取值是否匹配预期值

Match as regular expression

  • 预期值是否可以使用正则表达式表示
  • 不勾选,预期值不能使用正则表达式表示
  • 勾选,预期值可以使用正则表达式表示,默认勾选

Expected Value

  • 预期值
  • 比如期望"code":200,表达式是$.code,JSON 断言就会在表达式提取的值中匹配200,匹配成功就表示通过
  • 必须先勾选 “Additionally assert value”,才能输入预期值
  • 预期值不填表示空字符,与 null 和 [] 不等价

Expect null

  • 默认不勾选,若预期值是 null 则勾选
  • 验证 null 值,需要勾选 “Additionally assert value”,否则找不到路径

Invert assertion(will fail if above conditions met)

  • 默认不勾选,若勾选,表示对预期值取反
  • 比如期望"code":200,表达式是$.code,勾选后,JSON 断言就会在表达式提取的值中匹配200,匹配成功就表示不通过

42.3 实例

对登录接口响应进行检查,如果 Response Body 中有 "message": "成功"表示测试通过,否则测试不通过。

下面是登录接口的 Response Body:

{
  "code": 200,
  "message": "成功",
  "data": {
    "id": 34,
    "username": "12166880003",
    "no": "9065776993",
    "nickname": "星空漫步者",
    "avatar": "https://ydcqoss.ydcode.cn/ydcq/1695193788-6El18K.jpg",
    "phone": "12166880003",
    "type": 0,
    "position": 0,
    "imToken": "OImLI5nZsqrYrgpY9bJsSuYVk+/GPvrWM0+FzIU/Npwy7jPis5t+JphjelNK8pmEC+7ycEdItP0=@6tu
    "imUserId": "8e79bc1607ef92207cd2b0",
    "loginToken": "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJleHBpcmVUaW1lIjoxNzAyNjQwODQzNTE3LCJ1c2VySWQ
  }
}

1. 登录请求

  • 对登录接口进行测试用例参数化,因为我们只创建了5条数据,所以需要在线程组中设置循环次数为5。
    image
    image

2. JSON 断言设置

  • 表达式:${message},选择 Additionally assert value,预期值:成功
    image

3. 运行结果如下:

  • Response Body 中有 "message": "成功",测试通过
    image
  • Response Body 中没有 "message": "成功",测试不通过
    image
    image

43- 大小断言

大小断言(Size Assertion)是 JMeter 中的一种断言,用于判断响应数据字节大小。

使用场景: 大小断言用于判断响应数据包中是否包含正确数量的字节数,有时候返回数据包太小了可能是数据不全的错误,通常情况下不会单独使用,而是辅助其他校验点一起使用。

43.1 界面展示

位置:取样器 -> 右键 -> 添加 -> 断言 -> 大小断言

image

43.2 参数说明

Apply to:断言作用域

  • Main sample and sub-samples:作用于父节点取样器及对应子节点取样器,即对所有取样器进行断言
  • Main sample only:只作用于父节点取样器,默认选择这个
  • Sub-samples only:只作用于子节点取样器
  • JMeter Variable Name to use:只作用于jmeter变量,针对某一个变量进行断言(输入框内输入变量名称)

响应字段大小:断言字节大小的对比值

  • 完整响应:对应Size in bytes字段值
  • 响应头:对应Headers size in bytes字段值
  • 响应的消息体:对应Body size in bytes字段值
  • 响应代码:对应 Response code的值,比如200 — 字节大小=3
  • 响应信息:对应 Response message的值,比如OK — 字节大小=2
    image

Size to Assert

  • 字节大小:断言时 size 的阈值,单位 Byte,字节大小和响应字段大小进行对比
  • =:字节大小 = 响应字段大小,表示测试通过,否则不通过
  • !=:字节大小 != 响应字段大小,表示测试通过,否则不通过
  • >:字节大小 > 响应字段大小,表示测试通过,否则不通过
  • <:字节大小 < 响应字段大小,表示测试通过,否则不通过
  • >=:字节大小 >= 响应字段大小,表示测试通过,否则不通过
  • <=:字节大小 <= 响应字段大小,表示测试通过,否则不通过

43.3 实例

对登录接口响应数据不得超过 1200 Byte,超过测试不通过,否则测试通过。

1. 大小断言设置:

  • 响应字段选择:完整响应,字节大小:1200,比较类型:<=
    image

2. 运行结果如下:

  • Size in bytes 小于1200,所以测试通过
    image
  • 如果我们修改大小断言的字节大小:1000,运行后结果如下:
    我们可以看到虽然接口请求响应成功了,但是未满足断言,所以未通过测试
    image
    image

44- 断言持续时间

断言持续时间(Duration Assertion)是 JMeter 中的一种断言,用于控制取样器的执行是否超过断言设置的时间。

  • 使用场景: 断言持续时间通常用于做性能测试,一般用于检查HTTP请求的响应时间是否超过预期值。而这个响应时间是性能测试中常关注的一个性能指标

44.1 界面展示

位置:取样器 -> 右键 -> 添加 -> 断言 -> 持续断言时间

image

44.2 参数说明

Apply to

  • Main sample and sub-samples:作用于父节点取样器及对应子节点取样器,即对所有取样器进行断言
  • Main sample only:只作用于父节点取样器,默认选择这个
  • Sub-samples only:只作用于子节点取样器

断言持续时间

  • 持续时间(毫秒):断言执行时间,单位毫秒,相当于和取样器结果的 Load time 进行对比
    image

44.3 实例

要求登录时长不得超过 2 秒,超过测试不通过,否则测试通过。
1. 断言持续时间设置

  • 断言持续时间:2000
    image

2. 运行结果如下:

  • Load time:221,小于2秒,测试通过
    image
  • 如果我们修改断言持续时间:100,运行后结果如下
    我们可以看到虽然接口请求响应成功了,但是未满足断言,所以未通过测试
    image
    image

45- 常用监听器

45.1 查看结果树(View Results Tree)

查看结果树可以查看取样器的请求参数、响应结果。

在 JMeter 中录制接口测试脚本的时候,需要进行调试和查看接口的请求结果是否正常,这个时候就可以使用察看结果树,它可以查看取样器的请求参数和响应结果,是 JMeter 最常用的元件之一。

察看结果树组件中展示了每一个取样器结果、请求和响应数据。我们可以通过察看结果树中的内容,来分析脚本是否存在问题。

位置:线程组 -> 右键 -> 添加 -> 监听器 -> 查看结果树
image

45.2 汇总报告(Summary Report)

汇总报告以表格的形式展示测试数据,可以查看事务或者取样器在某个时间范围内执行的汇总结果。

汇总报告,为测试中的每个不同命名的请求创建一个表行。这与聚合报告类似,只是它使用更少的内存。提供了最简要的测试结果信息,同时可以配置将相应的信息保存至指定的文件中(支持xml、csv格式的文件),点击保存表格数据可以保存测试数据到文件。

位置:线程组 -> 右键 -> 添加 -> 监听器 -> 汇总报告
image

label 样本 平均值 最小值 最大值 标准偏差 异常% 吞吐量 接收KB/sec 发送KB/sec 平均字节数
请求名称 请求数量 请求平均响应时间 请求的最小响应时间 请求的最大响应时间 响应时间的标准方差 请求错误率 吞吐量也就是TPS 每秒收到的千字节 每秒发送的千字节 响应平均流量

45.3 聚合报告(Aggregate Report)

聚合报告记录性能测试的总请求数、错误率、用户响应时间(中间值、90%、最少、最大)、吞吐量等,用以帮助分析被测试系统的性能。在聚合报告中,各个响应时间不能超过客户的要求,就是合格,例如不能超过响应时间2s,大于2s就是不合格的。

该监听器对于每个请求,它统计响应信息并提供请求数,平均值,最大,最小值,中位数、90%、95%、错误率,吞吐量(以请求数/秒为单位)和以kb/秒为单位的吞吐量。

位置:线程组 -> 右键 -> 添加 -> 监听器 -> 聚合报告
image

label 样本 平均值 中位数 90%百分位 95%百分位 99%百分位% 最小值 最大值 异常% 吞吐量 接收KB/sec 发送KB/sec0
请求名称 请求数量 请求平均响应时间 50%用户的响应时间 10%用户的响应时间 5%用户的响应时间 1%用户的响应时间 最小的响应时间 最大的响应时间 请求错误率 吞吐量也就是TPS 每秒收到的千字节 每秒发送的千字节

45.4 保存响应到文件(Save Responses to a file)

保存响应到文件可以将每个取样器的查看结果树中的数据保存成JSON文件,一般用于分析时排错将文件保存起来,进行查看。

此功能主要运用于非GUI模式下执行脚本的响应查看,以便于帮助我们更好的判断脚本的执行情况。当结果太大,使用结果树监听器影响图形模式时,我们可以采用响应保存监听器来处理

位置:线程组 -> 右键 -> 添加 -> 监听器 -> 保存响应到文件
image

Save conditions

  • Save Successful Responses only:仅保存成功响应
  • Save Failed Responses only:仅保存失败响应
  • Don’t save Transaction Controller Sample Result:不保存事务控制器样本结果

Save details

  • 文件名称前缀:文件路径 + 文件前缀
  • Don’tadd number to prefix:不添加数字到文件前缀
  • Don’tadd contenttype suffix:不添加文件的后缀类型
  • Add timestamp:添加时间戳到文件前缀
  • Minimum Length of sequence number:设置文件名称最小的序列号;例如4,文件序号为0001…

保存结果
image

45.5 图形结果(Graph Results)

图形结果是以图形的方式查看和分析相关指标。

一般在调试测试脚本期间用来查看相关指标,负载期间使用会消耗大量资源,可以显示

位置:线程组 -> 右键 -> 添加 -> 监听器 -> 图形结果
image

45.6 断言结果(Assertion Results)

断言结果对相应的请求添加断言。对取样器进行断言后,我们希望知道断言结果;此元件可以帮助我们显示断言结果(察看结果树元件中也可以看到)。消耗了大量资源(内存和CPU),性能测试时候不建议使用。

作用:用于检查测试中得到的响应数据等是否符合预期,用以保证性能测试过程中的数据交互与预期一致,一般与结果树结合使用。

image

45.7 汇总图(Aggregate Graph)

汇总图以表格和图形的方式显示测试数据。

位置:线程组 -> 右键 -> 添加 -> 监听器 -> 汇总图
image

45.8 用表格察看结果(View Results in Table)

用表格察看结果可以将取样器请求以表格的方式分析展示

位置:线程组 -> 右键 -> 添加 -> 监听器 -> 用表格察看结果
image

Sample# Start Time Thread Name Label Sample Time(ms) Status Bytes Sent Bytes Latency Connect Time(ms)
取样器序号 取样器执行时间 线程组名称 取样器名称 取样器响应时间 请求状态 字节数 发送字节数 延迟 连接服务器时间

46- HTTP代理服务器

HTTP代理服务器允许JMeter在使用常规浏览器,浏览Web应用程序时拦截并记录操作。JMeter将创建测试样本对象,并将其直接存储到的测试计划中。

46.1 界面展示

位置:测试计划 -> 右键 -> 添加 -> 非测试元件 -> HTTP代理服务器
image

46.2 参数说明

名称

  • 元件的名称,可进行编辑

注释

  • 没有实际作用,仅记录用户可读的注释信息

State

  • 启动、停止、重启:

Global Setting

  • 端口:默认8888,启动HTTP代理服务器时需要保证此端口号不被占用,可编辑
    可以在 CMD 终端窗口输入下面命令查看端口是否被占用
netstat -ano|findstr "8888"
  • HTTP Domains:编写代理主机的域名或者主机IP地址,可以对指定地址进行请求录制,例如ydcode.cn

Test Plan content

  • 目标控制器:录制的接口脚本保存的位置
  1. 使用录制控制器:需要在线程组中添加逻辑控制器下的录制控制器元件,否则在启动HTTP代理服务器的时候会提示:
    image
    意思是:你选择存储脚本的目标控制器为“使用录制控制器”,但不存在这样的控制器,请确保将录制控制器组件添加为线程组节点的子节点,才可以正确开始录制。

  2. 测试计划>HTTP代理服务器:录制的脚本保存到HTTP代理服务器组件下

  3. 测试计划>线程组:录制的脚本保存到线程组下(只有在测试计划中添加了线程组,才能看到该选项)

  • 分组:是否将录制的单个“点击”请求进行分组,以及如何在录制中表示该分组
  1. 不对样本分组:很好理解,就是请求什么就记录什么,对所有录制的取样器不分组。
  2. 在组间添加分隔:每一个Sampler结束都会有分隔符间隔开。即:在取样器分组之间添加以名为—的控制器。
  3. 每个组放入一个新的控制器:每一个Sampler请求开始时,都会有一个简单控制器生成。即:每个分组放到一个新的简单控制器下。
  4. 只存储每个组的第一个样本:每个Sampler请求时,如果有子请求,那子请求是不会被记录的,只记录第一个URL请求的样本,而这些取样器的Follow Redirects和Retrieve All Embedded Resources…等选项将被设置上。这种情况虽然很多人说比较推荐,但是个人觉得会丢失许多重要的请求,建议大家还是视情况选择。
  5. 将每个组放入一个新的事务控制器中:每个Sampler请求开始时,都会生成一个事务控制器,分组的所有取样器都保存在控制器下。
  • 记录HTTP请求头:勾选,则将向每个HTTP取样器,添加HTTP信息头管理器。

  • 添加断言:为每个空的取样器添加一个断言

  • Regex matching:指定在替换变量时,是否使用正则表达式匹配,如果勾选,则将取样器中的信息,使用正则表达式来匹配用户定义变量值,替换为变量名${变量名},进行替换。匹配时,它只接受整个词匹配,不接受匹配单词一部分

HTTP Sampler settings

  • prefix:在录制时,在取样器名称前添加指定的前缀,自带编号

  • Transaction name:使用用户指定的事务名称,替换取样器名称,自带编号

  • Create new transaction after request (ms):在多少毫秒之后,自动创建一个事务,此选项基本不用

  • Recording’s default encoding:编码,一般设置为 UTF-8,防止录制时出现中文乱码

  • 从HTML文件获取所有资源:在生成的取样器中,设置获取所有嵌入式资源

  • 动重定向:录制的取样器是否要设置自动重定向

  • 跟随重定向:录制的取样器是否要设置跟随重定向

  • Use keep Alive:录制的取样器是否要设置为keep Alive状态,保持连接,一般都勾选上

  • Type:要生成哪种类型的取样器,HTTPclient4或Java,默认HTTPclient4。

录制脚本时,最好使用无痕浏览模式,这可以确保浏览器没有存储的Cookie信息,并防止保存某些更改。例如:Firefox不允许永久保存证书替代。

47- 自动录制 WEB 脚本

JMeter支持手动接口脚本的录制,也支持使用代理自动录制脚本。 对于一些JMeter初学者来说,录制脚本可能是最容易掌握的技能之一。下面我们详细介绍JMeter使用HTTP代理服务器录制脚本的配置及方法。

录制脚本的工作原理是 Jmeter 作为代理服务器,客服端浏览器发送请求到Jmeter,然后Jmeter再把请求转发给服务器;服务器返回的数据传给Jmeter,经Jmeter返回给客户端浏览器。

我们以录制https://ydcode.cn登录后访问电子书为例

47.1 线程组

  • 我们把录制的脚本放到一个线程组下
    测试计划 -> 右键 -> 添加 -> 线程组(用户) -> 线程组
    image

47.2 HTTP代理服务器

  • HTTP代理服务器是录制脚本的核心元件,设置如下图:
  • 端口:8888
  • HTTPS Domains:ydcode.cn
  • Recording’s default encoding:UTF-8
    image

47.3 设置浏览器代理

  • 3.1 我们使用 Firefox浏览器录制,进入浏览器设置中,搜索代理,点击设置
    image

  • 3.2 选中手动配置代理,在HTTP代理:127.0.0.1、端口:8888勾选也将次代理用于HTTPS,点击确定
    image

47.4 生成CA证书

  • 启动之前配置好的HTTP代理服务器,会弹出一个弹框,点击OK,JMeter会自动生成 ApacheJMeterTemporaryRootCA 证书
    image
  • 证书路径:默认在D:\jmeter\apache-jmeter-5.2.1\bin目录下,次证书7天后过期
    image

47.5 配置浏览器证书

  • 5.1 进入浏览器设置中,搜索证书,点击查看证书
    image

  • 5.2 在证书管理器中点击导入,导入之前生成的CA证书
    image

47.6 开始录制

  • 6.1 启动 JMeter HTTP代理服务器
    image

  • 6.2 进入https://ydcode.cn,登录后访问电子书

47.7 录制结果

  • 我们可以看到JMeter成功录制了接口脚本,操作到这里一个简单的录制就完成了,这种方式录制脚本非常快捷,但是我们发现录制的脚本非常乱,需要进行优化后,才能使用。
    image

48- 优化脚本

在使用HTTP代理服务器录制的脚本中,我们看到在录制过程中产生了很多无价值的请求,包括图片、JS等,让我们后期对脚本优化时非常麻烦,这节给大家介绍优化脚本的几种方法。

优化脚本:

  • 排除无效请求

  • 禁用无数据请求

  • 删除无关请求

48.1 排除无效请求

在 HTTP 代理服务器中,选择Requests Filtering,排除模式中点击添加建议排除或者添加想要排除的格式请求,它是一个正则表达式,排除掉bmp|css|js|gif|ico|jpe?g|png|swf|woff|woff2此类请求。

image

48.2 禁用无数据请求

禁用没有传递任何数据的请求,为啥是禁用,而不是删除呢?

因为在脚本调试时,有些此类接口还是会重新启用,比如在之后回放调试脚本,根据结果树的结果找到没有成功的请求去修改。有错误先查找参数哪些是需要手动填写的哪些是需要调用前面的请求的参数的(关联接口),找到了需要之前的请求的参数的请求,就把它之前的被禁用的请求启用。运行后在结果里面找到自己需要的参数以及对应的请求,启用该请求,禁用其他请求,找到之后利用正则表达式等提取参数,进行引用。
image

48.3 删除无关请求

删除无关请求就是删除与目标网站域名无关的请求,列如我们的目标网站是https://ydcode.cn,那么域名或IP不是https://ydcode.cn的请求就可以删除掉,以此来简化脚本,只有未设置 HTTP Domains时,才会存在无关请求。

对于性能/压力测试,录制脚本的方法虽然简单,但是局限性相对大一些,没有手动设置接口请求灵活。

49- JDBC Connection Configuration

JDBC Connection Configuration 是 JMeter 中的一种设置数据库链接配置的配置元件。

使用场景: 连接数据库,通常与 JDBC Request 一块使用

49.1 界面展示

位置:线程组 -> 右键 -> 添加 -> 配置元件 -> JDBC Connection Configuration

image

49.2 参数说明

名称

  • 元件的名称,可进行编辑

注释

  • 没有实际作用,仅记录用户可读的注释信息

Variable Name Bound to Pool

  • Variable Name for created pool:数据库连接池的名称,可以设置多个 JDBC Connection Configuration,命名不同,在 jdbc request 请求中可以通过这个名称选择对应的连接池进行使用,建议格式为MySQL_1

Connection Pool Configuration

  • 连接池参数配置,基本保持默认就行了,可根据需要进行修改

  • Max Number of Connections:最大连接数;做性能测试时,建议填 0 ;如果填了10,则最大连接10个线程

  • Max Wait (ms):在连接池中取回连接最大等待时间,单位毫秒;连接时超过最大等待时间,则连接失败

  • Time Between Eviction Runs (ms):线程可空闲时间,单位毫秒;如果当前连接池中某个连接在空闲了此处设置的时间后,仍然没有使用,则被物理性的关闭掉

  • Auto Commit:自动提交 sql 语句,如:修改数据库时,自动 commit

  • Transaction Isolation:事务隔离级别(一般默认即可)

  • Prepared Statements:立即初始化连接池;如果为 False,则第一个 JDBC 请求的响应时间会较长,因为包含了连接池建立的时间

Connection Validation by Pool

  • 验证连接池是否可响应

  • Test While Idle:当连接空闲时是否断开

  • Soft Min Evictable ldle Time(ms):连接在池中处于空闲状态的最短时间

  • Validation Query:一个简单的查询,用于确定数据库是否仍在响应;默认为 jdbc 驱动程序的 isValid() 方法,适用于许多数据库(Test While Idle 需配置为 True)

Database Connection Configuration

  • 数据库连接配置

  • Database URL:数据库连接 URL(格式:jdbc:mysql://IP:端口号/数据库名称)

?allowMultiQueries=true 允许多条SQL语句查询
?characterEncoding=UTF-8 编码格式为UTF-8,可以解决insert和update操作的数据乱码
比如:jdbc:mysql://116.205.181.101:3306/test_4?characterEncoding=UTF-8&allowMultiQueries=true

  • JDBC Driver class:数据库驱动,选择对应的数据驱动
数据库 驱动 Database URL
MySQL com.mysql.jdbc.Driver jdbc:mysql://host:port/databaseName
PostgreSQL org.postgresql.Driver jdbc:postgresql:databaseName
Oracle oracle.jdbc.driver.OracleDriver jdbc:oracle:thin:user/pass@//host:port/service
sqlServer com.microsoft.sqlserver.jdbc.SQLServerDriver jdbc:sqlserver://host:port;databaseName=databaseName
  • Username:数据库登录用户名

  • Password:数据库登录密码

  • Connection Properties:建立连接时要设置的连接属性

50- JDBC Request

JDBC Request 是 JMeter 中的一种向数据库发送SQL语句的取样器。

JDBC Connection Configuration 元件是连接数据库,JDBC Request 操作数据库,它两通常是一起使用。

50.1 界面展示

位置:线程组 -> 右键 -> 添加 -> 取样器 -> JDBC Request

image

50.2 参数说明

名称

  • 元件的名称,可进行编辑

注释

  • 没有实际作用,仅记录用户可读的注释信息

Variable Name Bound to Pool

  • Variable Name of Pool declared in JDBC Connection Configuration:数据库连接池的名字,需要与 JDBC Connection Configuration 的 Variable Name for created pool 名字保持一致

SQL Query

  • Query Type

image
Select Statement:查询语句类型(select),只支持一条查询语句,多条查询语句只执行第一条
Update Statement:更新语句类(insert,update,delete),只支持一条更新语句,多条更新语句只执行第一条
Callable Statement:支持多条查询、更新(insert,update,delete,select)语句,响应数据展示多条数据更新结果。如果是多条select语句同时查询,建议使用Callable Statement,响应数据可以展示多条查询结果值
Prepared Select Statement:支持多条查询(select)语句,查询响应数据只展示第一条SQL的查询结果
Prepared Update Statement:支持多条更新(insert,update,delete)语句,响应数据展示多条更新提示
Commit:当前连接状态中的内容提交
Rollback:当前连接状态中的内容回滚
AutoCommit(false):指明不需要自动提交

  • Parameter valus:填写参数的具体的值,或者参数的名称。可以利用此字段对SQL语句进行参数化,多个字段值时,中间用,隔开

  • Parameter types:指Parameter Values参数的数据类型,例如:varchar,int,string。Parameter values 和Parameter types 必须成对出现,且SQL语句中有多个参数,就必须有多少个parameter values 和Parameter types

  • Variable names:自定义的变量名称,用于存放select操作返回的查询结果。有多个字段返回时,需用逗号隔开

  • Result variable name:定义一个变量,保存所有返回的结果,结果集是个list

  • Query timeout(s):查询超时时间

  • Handle Result set:定义如何处理 由callable statements 语句返回的结果,不常用

51- JMeter连接数据库

我们之前学习了 JMeter 连接数据库的两个核心元件,那么这节就来看看 JMeter 是如何实现数据库连接的。

主要分为以下四步:

  • 安装数据库驱动
  • 创建数据库
  • 连接数据库
  • 运行查看结果

51.1 安装数据库驱动

不同类型的数据库,需要的驱动也不一样,使用前请将对应的数据库驱动复制到 apache-jmeter-5.2.1\lib或者 apache-jmeter-5.2.1\lib\ext目录下,我们一MySQL数据库为例

MySQL官网下载:https://dev.mysql.com/downloads/connector/j/

  1. 选择Platform Independent—> 选择zip
    image

  2. 点击下载,甲骨文官网会提示登录或注册账号,点击下面不注册,开始下载。
    image

  3. 下载后,解压mysql-connector-j-8.2.0.zip文件,
    image

  4. 进入解压后的文件mysql-connector-j-8.2.0,找到mysql-connector-j-8.2.0.jar包,复制到apache-jmeter-5.2.1\lib目录下
    image

51.2 创建数据库

网站在线编程中给大家提供了数据库演示场景,下面也是用在线编程的 MySQL 数据库给大家做演示。

51.2.1 进入在线编程

51.2.2 新建数据库

  • 点击新建存储,选择MySQL数据库,填写相关参数
    image

51.2.3 查看数据库信息

  • 点击查看连接信息
    image

51.2.4 Navicat 连接数据库

  • 使用 Navicat 连接数据库 test_4
    image

  • 填写数据库信息
    image

  • 连接成功后新建一个学生表 student,因为是演示使用,所以表格设计简单点,字段:id、name、age、sex、class
    image

51.3 连接数据库

51.3.1 添加线程组

  • 所有参数默认设置
  • 测试计划 -> 右键 -> 添加 -> 线程(用户)-> 线程组
    image

51.3.2 JDBC Connection Configuration

  • 添加 JDBC Connection Configuration 连接数据库
  • 线程组 -> 右键 -> 添加 -> 配置元件 -> JDBC Connection Configuration
  • JDBC Connection Configuration 参数设置如下:
  • Variable Name for created pool:mysql_test
  • Database URL:jdbc:mysql://116.205.181.101:3306/test_4
  • JDBC Driver class:com.mysql.jdbc.Driver
  • Username:ydyx_4
  • Password:创建数据库时的密码
    image

51.3.3 JDBC Request

  • 添加 JDBC Request,向数据库发送SQL语句,添加一条数据,验证是否连接成功
  • 线程组 -> 右键 -> 添加 -> 取样器 -> JDBC Request
    image

51.3.4 查看结果树

  • 添加查看结果树,查看 JDBC Request 请求结果
  • 线程组 -> 右键 -> 添加 -> 监听器 -> 查看结果树
    image

51.4. 运行查看结果

  • 运行后,可做看到 JDBC Request 请求响应成功了
    image

  • 在 Navicat 中查看数据也插入成功
    image

52- 数据库 insert、select、update、delete 操作

上节讲解了 JMeter 连接数据库,那么 JMeter 如何完成数据库 insert、select、update、delete 操作呢?

JMeter 对数据库在不同的操作场景下,JDBC Connection Configuration 和 JDBC Request 的参数设置也不同,我们这节就来看看 JMeter 在不同操作场景下参数如何设置。因为上节我们已经讲了如何连接数据库,这里就不再多说,我们跳过添加元件的步骤。

核心参数:

  • JDBC Connection Configuration: Database URL
  • JDBC Request:Query Type

52.1 insert 操作

52.1.1 单条 insert 语句

  • JDBC Connection Configuration:
    Database URL:jdbc:mysql://116.205.181.101:3306/test_4,无需额外说明,正常链接
    image

  • JDBC Request:
    Query Type:Update Statement,支持一条 insert,update,delete 语句
    image

52.1.2 多条 insert 语句

  • JDBC Connection Configuration:
    Database URL:jdbc:mysql://116.205.181.101:3306/test_4?allowMultiQueries=true
    image
    ?allowMultiQueries=true 允许多条SQL语句查询,如果没有这个,执行多条 insert 操作时 JMeter 会报语法错误
    image

  • JDBC Request:
    方式1:Query Type:Callable Statement
    支持多条 insert、select、update、delete 语句,且展示多条结果
    image
    方式2:Query Type:Prepared Update Statement
    支持多条 insert、update、delete 语句,且展示多条结果
    image

52.1.3 解决中文乱码问题

  • JDBC Connection Configuration:
    Database URL:jdbc:mysql://116.205.181.101:3306/test_4?characterEncoding=UTF-8&allowMultiQueries=true
    在测试过程中我们会发现添加到数据库的数据会出现乱码问题,这是因为有中文数据,编码格式不是UTF-8,所以就需要在JDBC Connection Configurationd 的 Database URL后面加上characterEncoding=UTF-8
    image

52.2 select 操作

52.2.1 单条 select 语句

  • JDBC Connection Configuration:
    Database URL:jdbc:mysql://116.205.181.101:3306/test_4?characterEncoding=UTF-8&allowMultiQueries=true
    通常我们都会在 Database URL 后面添加?characterEncoding=UTF-8&allowMultiQueries=true不管是进行哪种操作都不影响。
    image

  • JDBC Request:
    Query Type:Select Statement,支持一条 Select 语句
    image

52.2.2 多条 select 语句

  • JDBC Connection Configuration:
    Database URL:jdbc:mysql://116.205.181.101:3306/test_4?characterEncoding=UTF-8&allowMultiQueries=true

  • JDBC Request:
    如果选择 Query Type:Select Statement,执行多条 select 语句时,JMeter 只会执行第一条 select 语句。执行多条 select 语句有两种方式:
    方式1:Query Type:Callable Statement
    支持多条 insert、select、update、delete 语句,且展示全部查询结果
    image
    image
    方式2:Query Type:Prepared Select Statement
    支持多条 insert、update、delete 语句,但是只展示第一条查询结果
    image
    image

52.3 update 操作

52.3.1 单条 update 语句

  • JDBC Connection Configuration:
    Database URL:jdbc:mysql://116.205.181.101:3306/test_4?characterEncoding=UTF-8&allowMultiQueries=true

  • JDBC Request:
    Query Type:Update Statement
    支持一条 insert,update,delete 语句
    image

52.3.2 多条 update 语句

  • JDBC Connection Configuration:
    Database URL:jdbc:mysql://116.205.181.101:3306/test_4?characterEncoding=UTF-8&allowMultiQueries=true

  • JDBC Request:
    如果选择 Query Type:Select Statement,执行多条 select 语句时,JMeter 只会执行第一条 select 语句。执行多条 select 语句有两种方式:
    方式1:Query Type:Callable Statement
    支持多条 insert、select、update、delete 语句
    image
    image
    方式2:Query Type:Prepared update Statement
    支持多条 insert、update、delete 语句
    image
    image

52.4 delete 操作

52.4.1 单条 delete 语句

  • JDBC Connection Configuration:
    Database URL:jdbc:mysql://116.205.181.101:3306/test_4?characterEncoding=UTF-8&allowMultiQueries=true

  • JDBC Request:
    Query Type:Update Statement
    支持一条 insert,update,delete 语句
    image

52.4.2 多条 delete 语句

  • JDBC Connection Configuration:
    Database URL:jdbc:mysql://116.205.181.101:3306/test_4?characterEncoding=UTF-8&allowMultiQueries=true

  • JDBC Request:
    方式1:Query Type:Callable Statement
    支持多条 insert、select、update、delete 语句
    image
    方式2:Query Type:Prepared update Statement
    支持多条 insert、update、delete 语句
    image

53- 数据库 INSERT 批量数据

在实际工作中,测试人员在对某些功能测试时,需要批量生成大量测试数据,如果手动添加,会非常麻烦,如何解决这一问题呢?

JMeter 给用户提供了针对SQL语句进行参数化,可以实现这一需求。比如对学生表_student插入100个学生信息,就可以对 insert 语句进行参数化,实例如下:

53.1 数据准备

  • image
    可以看到 student表有5个字段,我们只需插入name、age、sex、class即可,为了测试数据更加具有真实性,我们需要对name单独准备数据。首先创建 student.csv,在第一列填写姓名。
    image

53.2 数据库连接配置

  • JDBC Connection Configuration设置如下,红框是核心参数,其余参数默认即可
    image

53.3 JDBC Request

insert into student set name="张三",age="",sex="",class="";

对 insert 语句字段值做参数化,参数化方式有2种:
方式1:函数助手
方式2:CSV Date Set Config

1. name:使用了 __CSVRead函数,读取student.csv文件的名字
2. age:使用 __Random函数,10-18岁之间随机生成一个年龄
3. sex:使用了 __Random函数,0和1随机生成一个性别
4. class:使用了 __Random函数,1-6随机生产一个班级

insert into student set name="${__CSVRead(D:/student.csv,0)}",age=${__Random(10,18,)},sex=${__Random(0,1,)},class=${__Random(1,6,)};
  • JDBC Request参数设置如下
    image

53.4 线程组

修改线程组中的线程数为100
image

53.5 运行

运行结果我们可以看到运行成功了,数据库新增了100条数据
image
image

54- 数据库 INSERT 加密数据

为了让测试数据更具有真实性,在某些场景下数据库存储的数据是需要加密的,比如通常数据库存储的用户密码都是加密处理的,那么使用 JMeter 如何实现这一需求呢?

这节我们讲解 JMeter 结合 BeanShell 取样器生成加密数据,具体步骤如下:

54.1 数据库连接配置

  • 添加 JDBC Connection Configuration
    image

54.2 添加 BeanShell 取样器

  • 实际工作中,可以向开发要加密jar包,放到$:\jmeter\lib\ext目录下。因为每个公司都有自己的加密算法,这里就以MD5加密举例
    image
import org.apache.commons.codec.digest.DigestUtils;
String password ="${__RandomString(6,0123456789,)}";
String pwd_md5 = DigestUtils.md5Hex(password);
vars.put("new_pwd",pwd_md5);

54.3 JDBC Request

  • 添加 JDBC Request
    image

54.3 查看结果树

  • 添加查看结果树,运行结果如下图
    image
    查看数据库数据
    image

55- 获取 Select 结果集中某个值

之前我们学到在 JDBC Request 中有个参数 Result variable name 是把 Select 所有结果保存为一个变量,这个变量是个 list,如果查询到多条数据,我们如何从这个 list 中获取到我们想要的某个值?

image

这节我们讲解 JMeter 结合 BeanShell 取样器获取 Select 结果集中的某个值。

55.1 数据库连接配置

  • 添加 JDBC Connection Configuration
    image

55.2 JDBC Request

  • 添加 JDBC Request
    查询 student 表里面1班的学生信息,然后把结果保存到变量 student
    image

55.3 添加调试取样器

  • 查看获取到的数据
    image

55.4 查看结果树

  • 添加查看结果树,我们先运行,看看获取 Select 的结果
    这是JDBC Request结果
    image
    这是把 Select 的结果保存到变量 student,我们可以看到结果集是个列表,如果想要获取到第二条数据中name的值,我们就需要结合BeanShell 取样器实现这个需求。
    image

55.5 添加 BeanShell 取样器

  • 在脚本里面编写代码如下
    image
namevalue=vars.getObject("student").get(1).get("name");
vars.put("new_name",namevalue);

55.6 运行查看结果

  • 在调试取样器中查看变量 new_name成功获取到了 student 中第二条数据的name,引用${new_name}
    image

56- 非GUI模式负载测试

非GUI模式也是命令模式,我们在启动JMeter时,一直会有一个黑色命令行窗口,如下:

Description

窗口中的意思就是:

  • 不要将GUI模式用于负载测试!仅用于测试创建和测试调试
  • 对于负载测试,使用CLI模式
  启动方式:jmeter -n -t [jmx file] -l [results file] -e -o [Path to web report folder]

注意:在做负载测试时,Java Heap内存空间,调整的大一些,可以避免因Java堆内存不足,而终止测试的情况

为什么使用非GUI模式?

  • 图形化界面消耗更多资源,如CPU和内存,容易使压力机达到瓶颈,从而影响测试结果
  • 图形化界面不支持大型的负载测试和性能测试,并发较大时,jmeter会崩溃
  • 命令行方式可以把脚本配置到Jenkins上实现持续集成,做成自动化测试

56.1 命令参数说明

jmeter -n -t [jmx file] -l [results file] -e -o [Path to web report folder]

参数说明:

  • -n:表示非图形化模式
  • -t:执行jmx脚本路径,也就是我们需要测试的jmx脚本文件
  • -l:后跟输出结果文件路径和结果文件名称

若指定路径下没有指定名称的脚本,则自动创建,可以生成 csv 或者 jtl 文件
若只写脚本名称,则默认是在当前目录查找或创建

  • -e:设置生成测试报表
  • -o:保存测试报表文件夹的路径,该文件夹必须为空或不存在

56.2 运行命令

打开bin目录下的test文件夹,输入cmd,打开终端窗口,输入命令:

jmeter -n -t ydyx.jmx -l test.csv -e -o D:\jmeter\apache-jmeter-5.2.1\bin\test\test_report`

image

如果在 D:\jmeter\apache-jmeter-5.2.1\bin\test 目录下执行以上命令,JMeter 会去该目录下寻找 ydyx.jmx 脚本并把执行结果放在该目录,如果你的脚本在其他目录,而且想要把执行结果放在另外文件夹,需要使用绝对路径告诉 JMeter。
比如下面命令:
jmeter -n -t D:\jmeter\apache-jmeter-5.2.1\bin\test\ydyx.jmx -l D:\jmeter\apache-jmeter-5.2.1\bin\test\test.csv -e -o D:\jmeter\apache-jmeter-5.2.1\bin\test\test_report

56.3 测试结果

  • D:\jmeter\apache-jmeter-5.2.1\bin\test路径下生成了test.csv结果文件
    image

  • test_report目录下生成了index.html测试报告
    image

在实际的工作中,我们可能习惯性的刚开始高并发的去压测,单台机器压测2000并发的也有见到过,这是不可取的。我们是为了找到系统最大处理瓶颈,这个需要一点点的并发往上加的,防止服务器太脆弱直接压跪掉是很有必要的。

通过很多性能测试案例,发现不需要用上万的用户并发去进行测试,只要系统处理业务时间足够快,几百个用户甚至几十个用户就可以达到目的。对于大型系统、业务量非常高、硬件配置足够多的情况下,5000用户并发就足够了;对于中小型系统,1000用户并发就足够了。

在做负载测试的时候,一般都是按照梯度施压的方式去增加虚拟用户数,而不是在没有预估的情况下,一次加几万个用户,交易失败率非常高,响应时间非常长,已经超过了使用者忍受范围内,这样做没有多大的意义。

57- HTML测试报表分析

进入到生成的 HTML 报告目录里,在浏览器打开 index.html 测试报表文件

image

打开后如下所示:

image

57.1 Dashboard(仪表板)

  • Test and Report information(测试和报告信息):测试结果文件名/测试开始时间/测试结束时间/显示的过滤器
    image

  • APDEX (Application Performance Index):应用程序性能指数,范围在0-1之间,1表示达到所有用户均满意,数字越大表示用户满意度越高
    image

  • Requests Summary:请求的通过率(PASS)与失败率(FAIL),百分比显示
    image

  • Statistics:统计表,记录每个请求的性能指标,和聚合报告类似
    image

  • Errors:错误表,提供所有错误的摘要及其在总请求中的比例
    image

  • Top 5 Errors by sampler:为每个 Sampler(默认情况下不包括事务控制器)提供前5个错误
    image

57.2 Charts(图表)

分为:Over Time(随着时间的推移)、Throughput(吞吐量)、Response Times(响应时间)
image

57.2.1 Over Time

  • Response Times Over Time:随时间变化的响应时间
    image

  • Response Time Percentiles Over Time (successful responses):响应时间百分比随时间变化(仅限成功响应)
    image

  • Active Threads Over Time:随着时间的推移活动线程
    image

  • Bytes Throughput Over Time:随时间推移的吞吐量,单位是字节
    image

  • Latencies Over Time:随时间推移的延迟
    image

  • Connect Time Over Time:随时间变化的连接时间
    image

57.2.2 Throughput

  • Hits Per Second:每秒点击次数
    image

  • Codes Per Second:每秒响应状态码
    image

  • Transactions Per Second:每秒事务数
    image

  • Total Transactions Per Second:每秒总事务数
    image

  • Response Time Vs Request:响应时间与每秒请求
    image

  • Latency Vs Request:延迟与每秒请求
    image

57.2.3 Response Times

  • Response Time Percentiles:响应时间百分位数
    image

  • Response Time Overview:响应时间概述
    image

  • Time Vs Threads:时间与线程
    image

  • Response Time Distribution:响应时间分布
    image

57.3 Customs Graphs(定制图表)

Over Time(随着时间的推移)在未进行设置时,默认是没有数据的。

例如:创建 TEST Table 图表。
打开 Jmeter 安装目录里的 bin 目录下的 user.properties 文件,在文件末尾添加如下内容:

sample_variables=ts-hit
jmeter.reportgenerator.graph.custom_testGraph.classname=org.apache.jmeter.report.processor.graph.impl.CustomGraphConsumer
jmeter.reportgenerator.graph.custom_testGraph.title=TEST Table
jmeter.reportgenerator.graph.custom_testGraph.property.set_Y_Axis=Number of Hits
jmeter.reportgenerator.graph.custom_testGraph.property.set_X_Axis=Over Time
jmeter.reportgenerator.graph.custom_testGraph.property.set_granularity=60000
jmeter.reportgenerator.graph.custom_testGraph.property.set_Sample_Variable_Name=ts-hit
jmeter.reportgenerator.graph.custom_testGraph.property.set_Content_Message=Number of Hits:

image

注:sample_variables 是将自定义变量保存到 .jtl 结果文件中的特殊属性。

文件保存后,再次执行脚本命令,例如:

jmeter -n -t ydyx.jmx -l test.csv -e -o D:\jmeter\apache-jmeter-5.2.1\bin\test\test_report

打开新生成的 HTML 测试报告,自定义图表(TEST Table)已生成。
image