Apong's Blog

当你快坚持不住的时候,困难也快坚持不住了

0%

JMeter 测试教程

一个好的项目不仅需要完整的业务功能,

更应该保证处理响应的效率!

在业务中经常需要检验并发的可靠性,特别是多人同时操作对业务的影响。

这时候就可以借助 JMeter 进行测试。

本文提供两种方式:串行测试、全局属性

基本使用

首先介绍下 JMeter 的基本使用。

一个完整的测试分为创建线程组,创建取样器(请求),定义响应结果断言。

创建线程组目的是设置并发量。

创建线程组

image-20240709130805462

线程组大致分为三类:

  1. 启动线程组,最开始执行的线程
  2. 销毁线程组,最后才执行的线程
  3. 普通线程组,除启动和销毁外被放在中间执行的线程

(以上待考证,因为是我猜的)

一般来说随便选一个线程组都可以,如果同时只需要用到一个线程组的话

参数介绍

image-20240711234655935

Name:线程组的名称

Action to be token after…:当某个线程失败后的执行策略

Number of Threads:总线程数

Ramp-up period:执行完全部线程的时间(秒)

Loop Count:该线程组的循环次数

Same user on…:每个线程是否采用同一个数据(当你读取文件时有用)

常用的就是设置线程数和总时间,比如设置 threads: 1000 period: 10,就是 10 秒内跑完 1000 个线程,平均每秒 100 个并发。

注意:实际情况下线程数是不断递增的,因为启动需要时间。

创建取样器

以创建 HTTP 请求为例

右键线程组弹出菜单,点击 Add -> Sampler -> HTTP Request

image-20240709134542130

参数介绍

image-20240711235738958

分别通过 protocal, server name(domain), port, path 设置请求的 URL 路径。

再通过 HTTP Request 选择请求的方式,下面的 Parameters, Body Data … 可携带请求参数/请求体。

定义响应结果断言

以 JSON 断言为例,

在此之前需声明响应头信息的 Content-Type 为 JSON

添加响应头配置

右键取样器,点击 Add -> Config Element -> HTTP Header Manager

image-20240712110317215

然后就是根据 Name-Value 的规则添加信息头了。

再右键取样器创建断言,点击 Add -> Assertions -> JSON Assertion

image-20240712000225048

参数介绍

image-20240712000427473

Assert JSON Path exists:表示响应结果 JSON 对象中包含 xx 属性。

Additionally assert value:同时断言这个属性的值。

Match as regular expression:以正则表达式的语法匹配。

Expected Value:期望的属性值。

添加结果分析报告

image-20240712112237695

根据上述定义的断言,可以确定结果是否正确,并能够通过 Listener 监听器显示测试的结果。

聚合报告

将所有的结果进行分析。

包含样本数,平均响应时间,中位数、90%以下、95%以下、99%以下、最小、最大响应时间,错误率,吞吐量等数据。

image-20240712112552811

结果树

展示每一条请求的具体内容

包括请求头,请求体,响应内容等。

image-20240712112700165

开启测试

右键线程组,点击 Start 即可开始测试。

image-20240712112938357

如果点击界面上方的开始按钮,会开始全部的线程组。

业务测试

下文以实际多种测试为例,讲解如何进行常用的业务的测试。

登录测试

创建线程组

image-20240712110917225

图中的 Same User… 需要取消勾选,确保每个线程都取不同行的数据

添加 CSV 数据配置

通过配置数据文件,可以在线程组内通过变量的方式读取文件内的数据。

比如用于 token,session,用户登录账号密码信息 的输入。

image-20240712111226038

参数介绍

Filename:文件路径,也可以是其他文件,只要正确指定分隔符就行。

Variable Names:在 CSV 文件中,通过“,”分隔的列名。

也可以没有列名,这个变量名只是用来指定根据“分隔符”划分的每一列的名称。

Ignore first line…:是否忽略文件的第一行

Delimiter:数据之间的分隔符

Recycle on EOF:是否循环读取文件数据

Sharing mode:数据共享模式

注意:只有取消勾选 Same User… 才会应用这些变量的时候选取不同行的数据

应用变量

通过 ${variables} 的方式,可以在线程组的任意一处应用

创建取样器

image-20240712111802527

以上是错误示范:并不满足 JSON 格式。

属性和值必须用双引号包裹

变量即使为双引号包括,也会正常解析,解析结果其实就相当于一个字面量,

如果和其他字符在一起如:123_${userAccount}

结果会拼接在一起:123_xxxxxxx

填写好测试的 api 地址,和请求体内容。

定义响应头信息,结果断言。

image-20240712112031704

保证响应结果能以 JSON 形式解析。

image-20240712112755591

定义结果内容断言:必须要有 code 属性,且值为 0。

添加监听报告省略…

右键线程组点击 Start,即可开始测试。

image-20240712113544130

多人并发测试

由于多人并发测试,需要用到用户信息,测试并不好办。

所以需要先登录拿到用户信息,再进行接下来的测试。

串行测试(推荐)

在一个线程组内,创建两个取样器,并勾选 keep-alive 保证 cookie 不会丢失。

第二个取样器就可以基于第一个的用户信息发出请求了

image-20240712160616341

此处就利用登录的 session 信息,进行个人信息的再一步请求。

全局属性

也可以分开两个线程组,先通过“登录”的取样器发出请求,并添加一系列处理程序来将 session 存储到全局属性中,

再需要用户信息的测试中,再通过获取全局属性的方式来获取到 session,进行请求。

以 Session 为例,

由于 session 的设置包含在响应头里,就需要通过先提取响应头。

添加 正则后置处理器,提取 session 变量

image-20240712161134096

“session” 表示提取出来的变量的名称。

注意:捕获组从 1 开始,Match No. 表示捕获匹配的哪一句。

添加 BeanShell 处理程序,设置全局属性

image-20240712161346797

Parameters 表示从 CSV 数据配置传来的变量名,

大概因为 session 同处于后置处理器环节,所以直接写就可以了。

通过 ${__setProperty()} 设置全局属性。

将 session 和 userAccount 绑定,存储所有用户的 session 值。

添加 HTTP Cookie 管理器

image-20240712161709362

通过 $(__property(variable_name)) 获取全局属性值。

接下来就可以进行测试了,请求会自动携带 cookie 中的 sessionID