在我之前的文章中,我介绍了开源测试工具 JMeter,并使用一个简单的 HTTP 测试作为示例来演示它的功能。本文将向你展示如何为复杂的测试场景构建测试脚本。
用户界面以“树”格式显示 JMeter 测试脚本。保存的测试脚本(.jmx
格式)是 XML。JMeter 脚本树将测试计划视为根节点,测试计划包括所有测试组件。在测试计划中,你可以配置在整个测试计划中由组件调用的用户自定义变量。变量还可以线程组行为、测试中使用的库文件等等。你可以使用测试计划中的各种测试组件来构建丰富的测试场景。
JMeter 中的测试组件通常有以下几类
- 线程组
- 取样器
- 逻辑控制器
- 监听器
- 配置元件
- 断言
- 定时器
- 前置处理器
- 后置处理器
线程组
线程组是所有测试计划的起点(因此所有取样器和控制器都必须放置在线程组下)。线程组可以被看作是一个虚拟用户池,其中每个线程本质上是一个虚拟用户,多个虚拟用户同时执行同一批任务。每个线程都是独立的,互不影响。在一个线程的执行过程中,当前线程的变量不会影响其他线程的变量值。

(Chongyuan Yin, CC BY-SA 4.0)
在这个界面中,可以以多种方式配置线程组。
1. 取样器错误后要采取的行动
以下配置项控制在遇到错误时是否继续测试
- 继续:忽略错误并继续执行。
- 启动下一个线程循环:忽略错误,终止当前线程的循环,并执行下一个循环。
- 停止线程:停止执行当前线程,而不影响其他线程的正常执行。
- 停止测试:在执行线程完成当前采样后,停止整个线程。
- 立即停止测试:立即停止整个测试执行,即使它中断当前正在执行的取样器。
2. 线程数
这是并发(虚拟)用户的数量。每个线程完全独立地运行测试计划,而不会干扰任何其他线程。测试使用多个线程来模拟对服务器的并发访问。
3. 启动时间(Ramp-up period)
启动时间设置启动所有线程所需的时间。例如,如果线程数设置为 10,启动时间设置为 100 秒,则 JMeter 将使用 100 秒启动并运行 10 个线程(每个线程在前一个线程启动后 10 秒开始)。
如果启动时间值设置得很小,线程数设置得很大,则在测试开始时服务器会承受很大的压力。
4. 循环计数
设置线程组中每个线程在结束之前循环的次数。
5. 延迟线程创建直到需要时
默认情况下,所有线程在测试开始时创建。如果选中此选项,则在需要时创建线程。
6. 指定线程生命周期
控制线程组的执行时间。你可以设置持续时间和启动延迟(以秒为单位)。
取样器
取样器模拟用户操作。它是一个运行单元,向服务器发送请求并接收来自服务器的响应数据。取样器是线程组内部的组件,因此必须将其添加到线程组。JMeter 本身支持各种取样器,包括 TCP 取样器、HTTP 请求、FTP 请求、JDBC 请求、Java 请求等等。每种类型的取样器根据设置的参数向服务器发送不同的请求。
TCP 取样器
TCP 取样器通过 TCP/IP 连接到指定的服务器,在连接成功后向服务器发送消息,然后等待服务器回复。

(Chongyuan Yin, CC BY-SA 4.0)
可以在 TCP 取样器中设置的属性如下
TCPClient 类名
这表示处理请求的实现类。默认情况下,使用 org.apache.jmeter.protocol.tcp.sampler.TCPClientImpl
,并且使用纯文本进行传输。此外,JMeter 还内置支持 BinaryTCPClientImpl
和 LengthPrefixedBinaryTCPClientImpl
。前者使用十六进制数据包,后者将 2 字节的长度前缀添加到 BinaryTCPClientImpl
。
你还可以通过扩展 org.apache.jmeter.protocol.tcp.sampler.TCPClient
来提供自定义实现类。
- 目标服务器设置:服务器名称或 IP 和 端口号 指定服务器应用程序的主机名或 IP 地址和端口号。
- 连接选项:确定如何连接到服务器。
-
- 重用连接:如果启用,则此连接始终打开;否则,读取数据后将关闭它。
- 关闭连接:如果启用,则在 TCP 取样器运行完成后关闭此连接。
- 设置无延迟:如果启用,则禁用 Nagle 算法,并允许发送小数据包。
- SO_LINGER:控制在关闭连接之前是否等待缓冲区中的数据完成传输。
- 行尾 (EOL) 字节值:确定行尾的字节值。如果指定的值大于 127 或小于 -128,则跳过 EOL 检查。例如,如果服务器返回的字符串以回车符结尾,则可以将此选项设置为 10。
- 超时:设置连接超时和响应超时。
- 要发送的文本:包含你要发送的负载。
- 登录配置:设置用于连接的用户名和密码。
HTTP 请求取样器
HTTP 取样器向 Web 服务器发送 HTTP 和 HTTPS 请求。

(Chongyuan Yin, CC BY-SA 4.0)
以下是可用的设置
- 名称和注释
- 协议:设置将请求发送到目标服务器的协议,可以是 HTTP、HTTPS 或 FILE。 默认值为 HTTP。
- 服务器名称或 IP 地址:要将请求发送到的目标服务器的主机名或 IP 地址。
- 端口号:Web 服务侦听的端口号。HTTP 的默认端口为 80,HTTPS 的默认端口为 443。
- 请求方法:发送请求的方法,通常包括 GET、POST、DELETE、PUT、TRACE、HEAD、OPTIONS 等。
- 路径:要请求的目标 URL(不包括服务器地址和端口)。
- 内容编码:如何对请求进行编码(适用于 POST、PUT、PATCH 和 FILE)。
- 高级请求选项:一些额外的选项,包括
-
- 自动重定向:重定向不被视为单独的请求,并且不会被 JMeter 记录。
- 跟随重定向:每个重定向都被视为单独的请求,并且会被 JMeter 记录。
- 使用 KeepAlive:如果启用,则在 JMeter 与目标服务器通信时,
Connection: keep-alive
将添加到请求头。 - 为 POST 使用 multipart/form-data:如果启用,则使用
multipart/form-data 或 application/x-www-form-urlencoded
发送请求。
- 参数:JMeter 使用参数键值对来生成请求参数,并根据请求方法以不同的方式发送这些请求参数。例如,对于 GET、DELETE 请求,参数将附加到请求 URL。
- 消息体数据:如果要以 JSON 格式传递参数,则必须在请求头中将 Content-Type 配置为
application/json
。 - 文件上传:在请求中发送文件。 通常,可以采用这种方式模拟 HTTP 文件上传行为。
逻辑控制器
JMeter 逻辑控制器控制组件的执行逻辑。 JMeter 网站这样解释:“逻辑控制器确定处理取样器的顺序。”
逻辑控制器可以控制取样器的执行顺序。因此,控制器需要与取样器一起使用。除了“仅一次”控制器之外,其他逻辑控制器可以相互嵌套。
JMeter 中的逻辑控制器主要分为两类。它们可以控制测试计划执行期间节点的逻辑执行顺序(循环或条件控制器),或者可以响应特定的吞吐量或事务计数。
事务控制器
有时,您需要统计一组相关请求的总体响应时间。在这种情况下,您需要使用事务控制器。
事务控制器统计控制器下所有子节点的采样器执行时间。如果在事务控制器下定义了多个采样器,则仅当所有采样器都成功运行时,事务才被认为是成功的。
使用上下文菜单添加事务控制器

(Chongyuan Yin, CC BY-SA 4.0)
生成父样本:如果启用,则事务控制器用作其他采样器的父样本。否则,事务控制器仅用作独立样本。

(Chongyuan Yin, CC BY-SA 4.0)
例如,未选中的摘要报告如下所示

(Chongyuan Yin, CC BY-SA 4.0)
如果选中,则摘要报告如下所示

(Chongyuan Yin, CC BY-SA 4.0)
包含计时器时长:如果启用,则包含计时器(在采样器运行前后添加延迟)。
仅一次控制器
仅一次控制器顾名思义,是一个只执行一次的控制器。控制器下的请求在线程组下的循环执行过程中只执行一次。对于需要登录的测试,您可以考虑将登录请求放在仅一次控制器中,因为登录请求只需要执行一次来建立会话。

(Chongyuan Yin, CC BY-SA 4.0)
如果将循环计数设置为 2 并在运行后检查结果树,您可以看到仅一次控制器下的HTTP request 3
只执行了一次,而其他请求执行了两次。

(Chongyuan Yin, CC BY-SA 4.0)
监听器
监听器是一系列组件,用于处理和可视化测试结果数据。 查看结果树、图形结果和 聚合报告 是常见的监听器组件。
查看结果树
该组件以树结构显示每个采样器的结果、请求内容、响应时间、响应代码和响应内容。查看这些信息可以帮助分析是否存在问题。它提供了各种查看格式和过滤方法,还可以将结果写入指定文件,以便进行批量分析和处理。

(Chongyuan Yin, CC BY-SA 4.0)
配置元件
配置元件为静态数据配置提供支持。它可以定义在测试计划级别,也可以定义在线程组或采样器级别,不同级别具有不同的作用范围。配置元件主要包括用户定义的变量、CSV 数据集配置、TCP 采样器配置、HTTP Cookie 管理器等。
用户定义的变量

(Chongyuan Yin, CC BY-SA 4.0)
通过设置一系列变量,您可以使性能测试中使用随机选择的值。变量名可以在范围内引用,并且变量可以作为${variable name}
引用。
除了用户定义的变量组件之外,变量也可以在其他组件中定义,例如测试计划和 HTTP 请求

(Chongyuan Yin, CC BY-SA 4.0)
例如,定义的变量在 HTTP 请求中被引用

(Chongyuan Yin, CC BY-SA 4.0)
查看执行结果,可以看到已经获取了变量的值

(Chongyuan Yin, CC BY-SA 4.0)
CSV 数据集配置
在性能测试期间,您可能需要参数化输入,例如登录操作中的用户名和密码。当并发量比较大时,运行时的数据生成会对 CPU 和内存造成沉重的负担。 CSV 数据集配置可以用作此场景中所需参数的来源。

(Chongyuan Yin, CC BY-SA 4.0)
CSV 数据集配置中一些参数的描述
- 变量名称:定义 CSV 文件中的参数名称,脚本可以将其引用为
${variable name}
。 - 文件结束时循环:如果设置为 True,则允许在到达 CSV 文件末尾时从头开始再次循环。
- 文件结束时停止线程:如果设置为 True,则在读取 CSV 文件中的最后一条记录后停止运行。
- 共享模式:设置线程和线程组之间共享的模式。
断言
断言检查请求是否按预期返回。断言是自动化测试脚本的重要组成部分,因此您应该非常重视它。
JMeter 常用的断言包括响应断言、JSON 断言、大小断言、持续时间断言、Beanshell 断言等。下面我介绍常用的 JSON 断言。
JSON 断言
用于断言 JSON 格式的响应内容。在本例中,在 HTTP 采样器上添加了 JSON 断言,如下图所示

(Chongyuan Yin, CC BY-SA 4.0)
JSON 路径的根始终称为$
,可以用两种不同的样式表示:点表示法(.
)或括号表示法([]
)。例如;$.message[0].name
或 $['message'][0]['name']
。
这是一个向https://www.google.com/
发出请求的示例。 $[0].name
值表示响应中第一个数组元素中的“name”部分。

(Chongyuan Yin, CC BY-SA 4.0)
Additionally assert value
指定要验证 'name' 的值
,并且Expected value
预计为 '2022-world-cup-opening-day'。
运行脚本并查看结果。您可以看到断言已通过。

(Chongyuan Yin, CC BY-SA 4.0)
以下是可能的情况以及它们的处理方式
- 如果响应结果不是 JSON 格式,则将其视为失败。
- 如果 JSON 路径找不到该元素,则失败。
- 如果 JSON 路径找到该元素,但未设置任何条件,则通过。
- 如果 JSON 路径找到不满足条件的元素,则失败。
- 如果 JSON 路径找到满足条件的元素,则通过。
- 如果 JSON 路径返回一个数组,它会迭代以确定是否有任何元素满足条件。如果是,则通过。如果不是,则失败。
返回到 JSON 断言并选中 反转断言。

(Chongyuan Yin, CC BY-SA 4.0)
运行脚本,检查结果,可以看到断言失败

(Chongyuan Yin, CC BY-SA 4.0)
计时器
性能测试中请求之间的暂停时间称为“思考时间”。在现实世界中,暂停时间可以花费在内容搜索或阅读上,而 Timer 模拟了这种暂停。
同一范围内的所有计时器都在采样器之前执行。
如果您希望计时器仅应用于其中一个采样器,请将计时器添加到采样器的子节点。
JMeter 计时器主要包括常量计时器、均匀随机计时器、精确吞吐量计时器、常量吞吐量计时器、高斯随机计时器、JSR223 计时器、泊松随机计时器、同步计时器和 BeanShell 计时器。
常量计时器
常量计时器表示每个请求之间的间隔是一个固定值。

(Chongyuan Yin, CC BY-SA 4.0)
分别将线程延迟配置为 100 和 1000 后,运行脚本

(Chongyuan Yin, CC BY-SA 4.0)
检查表中的数据,其中#1和#2是配置为100毫秒时的运行结果,#4和#5是配置为1000毫秒时的运行结果。您可以看到 #4 和 #5 之间的间隔明显大于 #1 和 #2 之间的间隔

(Chongyuan Yin, CC BY-SA 4.0)
常量吞吐量计时器
常量吞吐量计时器根据指定的吞吐量控制请求的执行。

(Chongyuan Yin, CC BY-SA 4.0)
将目标吞吐量配置为 120(请注意单位是分钟),然后根据计算出的吞吐量选择 当前线程组中的所有活动线程(共享)

(Chongyuan Yin, CC BY-SA 4.0)
运行脚本,检查结果,并观察吞吐量大约为 2/秒 (120/60)。

(Chongyuan Yin, CC BY-SA 4.0)
预处理器和后处理器
预处理器在采样器请求之前执行一些操作。它通常用于修改参数、设置环境变量或更新变量。
类似地,后处理器在采样器请求之后执行一些操作。有时,需要在后续请求中使用响应数据,并且需要处理响应数据。例如,如果获取响应中的 jwt
令牌并用于后续请求中的身份验证,则使用后处理器。
使用 JMeter
以上是 JMeter 主要测试组件的介绍,现在您可以自信地开始自己的测试了。在另一篇文章中,我将解释如何在 JMeter 中使用 MQTT 插件。
评论已关闭。