目录
- 说明
-
- 工具准备
- 工具配置
- 案例1:测试接口
-
- 接口准备
- 线程组
-
- 添加线程组
- 配置线程组值
-
- [线程数(Number of Threads)](#线程数(Number of Threads))
- [Ramp-Up 时间(Ramp-Up Period)](#Ramp-Up 时间(Ramp-Up Period))
- [循环次数(Loop Count)](#循环次数(Loop Count))
- 永远循环(Forever)
- 延迟(Delay)
- http请求
- 察看结果树
- 聚合报告
-
- 添加聚合报告
- 聚合报告说明
-
- 文件名
- Label
- [样本 Samples](#样本 Samples)
- [平均值 Average](#平均值 Average)
- [中位数 Median](#中位数 Median)
- [90%百分位 90% Line](#90%百分位 90% Line)
- [最小值 Min](#最小值 Min)
- [最大值 Max](#最大值 Max)
- [异常 Error %](#异常 Error %)
- [吞吐量 Throughput](#吞吐量 Throughput)
- [传输数据量 KB per Second](#传输数据量 KB per Second)
- [建立连接时间 Connect Time](#建立连接时间 Connect Time)
- [响应时间 Response Time](#响应时间 Response Time)
- [平均吞吐量 Avg. Throughput](#平均吞吐量 Avg. Throughput)
- [总计 Total](#总计 Total)
- [请求计数 Request Counts and Percentages](#请求计数 Request Counts and Percentages)
- 案例2:导出报告
-
- [导出html 报告](#导出html 报告)
- [案例3: 计算理论的并发用户数](#案例3: 计算理论的并发用户数)
- [案例4: 携带cookie请求](#案例4: 携带cookie请求)
-
- 说明
- 接口准备
- 配置测试计划
- 线程组
- http请求
- 添加结果监听器
- 执行登录http请求
- 添加正则表达式提取器
- [添加HTTP Cookie管理器](#添加HTTP Cookie管理器)
- 运行线程组
说明
工具准备
- apache-jmeter-5.4.1
- jdk8 +
工具配置
jmeter 界面汉化配置
汉化步骤
jmeter 界面默认是英文,配置成中文。
- 打开 /bin/jmeter.porperties 文件,
- 将 默认的 language=en 改为 language=zh_CN 后,重启jmeter。
汉化结果图
案例1:测试接口
接口准备
spring mvc 项目创建一个接口,来模拟测试的目标接口。
java
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.servlet.http.HttpServletRequest;
import java.util.HashMap;
import java.util.Objects;
@RestController
@RequestMapping(value = "test")
public class TestController {
@GetMapping(value = "test")
public Object test() {
return new HashMap<String,Object>() {{
put("message", "成功");
}};
}
}
线程组
添加线程组
配置线程组值
线程数(Number of Threads)
- 定义
这个值指定了要创建的虚拟用户(线程)的数量。每个线程都代表一个独立的用户,因此线程数越多,模拟的并发用户数也就越多。 - 使用场景
如果你想模拟 1000 个并发用户,就设置线程数为 1000。
Ramp-Up 时间(Ramp-Up Period)
- 定义
Ramp-Up 时间是指所有线程(虚拟用户)启动所需的时间,单位是秒。
例如,如果设置了 100 个线程,Ramp-Up 时间为 100 秒,那么每秒会启动一个线程,直到所有线程都被启动。Ramp-Up 时间设置得较长可以避免瞬间发起大量请求,从而导致服务器负载过高。 - 使用场景
如果你希望所有用户在 100 秒内启动,那么 Ramp-Up 时间应设置为 100 秒。
通过这种方式,你可以模拟逐步增加负载的场景。
循环次数(Loop Count)
- 定义
循环次数指定每个线程将执行的次数。如果设置为 1,则每个线程只执行一次。如果设置为 -1,则表示无限循环,直到测试结束时停止。 - 使用场景
如果你希望每个用户执行 10 次请求,可以将 Loop Count 设置为 10;如果希望每个用户一直执行,直到测试结束,则设置为 -1。
永远循环(Forever)
- 定义
这是一个复选框,当勾选时,线程将会不停地循环执行测试计划中的请求,直到测试手动停止。 - 使用场景
如果你正在进行压力测试,并且希望线程永远执行直到你手动停止,可以勾选此选项。
延迟(Delay)
- 定义
该选项可以为每个线程设置一个固定的启动延迟时间。这意味着每个线程启动时,会等待指定的时间,然后再开始执行请求。 - 使用场景
这种配置适合于模拟用户之间有间隔的启动情况。
http请求
添加http请求
配置HTTP请求值
协议 (Protocol)
- 定义
指定协议类型,可以选择 http 或 https。 - 使用场景
如果你测试的是 HTTPS 服务,选择 https
服务器名称或 IP(Server Name or IP)
- 定义
指定请求目标服务器的地址,可以是域名(如 www.example.com)或 IP 地址(如 192.168.1.1)。 - 使用场景
如果目标服务器是 www.example.com,就填写 www.example.com。如果是通过 IP 地址访问,则填写 IP。
端口号(Port)
- 定义
指定服务器的端口号,默认情况下 HTTP 使用端口 80,HTTPS 使用端口 443。如果服务器使用其他端口,可以在此处指定。 - 使用场景
如果你的服务器监听在 8080 端口,则需要设置 8080。
请求
- 定义
选择 HTTP 请求方法,常见的方法包括:
GET:获取资源。
POST:提交数据。
PUT:更新数据。
DELETE:删除资源。
HEAD:请求资源的头信息。
OPTIONS:请求可用的方法。
PATCH:部分更新资源。 - 使用场景
根据目标 API 或 Web 页面请求类型选择合适的 HTTP 方法。
路径(Path)
- 定义
指定访问的具体路径或资源。例如,/login、/api/getData 等。 - 使用场景
请求的具体接口路径,如 https://www.example.com/api/getData 中,/api/getData 为路径。
察看结果树
添加察看结果树
察看结果树内容
聚合报告
添加聚合报告
聚合报告说明
文件名
报告数据输出的文件。必须要先创建此文件,才能指定。报告结果写入此文件。用于导出报告。具体查看本文的导出html报告部分
Label
- 定义
测试请求的名称。通常是测试中每个 HTTP 请求的名称。 - 使用场景
每个请求(或事务)的标识符,可以通过它来查看特定请求的性能表现。
样本 Samples
- 定义
样本数量,表示此请求在整个测试过程中被执行的次数。 - 使用场景
查看某个请求执行的次数。例如,HTTP 请求可能执行了 100 次。
平均值 Average
- 定义
所有请求响应时间的平均值,单位是毫秒(ms)。 - 使用场景
表示请求的平均响应时间。较高的平均响应时间可能表示服务器存在性能瓶颈。
中位数 Median
- 定义
响应时间的中位数,单位是毫秒(ms)。 - 使用场景
中位数是将所有响应时间按升序排列后处于中间位置的值。中位数可以更好地反映出"典型"响应时间,避免了极端值的影响。
90%百分位 90% Line
- 定义
响应时间的第 90 百分位数,表示 90% 的请求响应时间低于该值。 - 使用场景
此值可以帮助分析大多数请求的响应时间,特别是对用户体验影响较大的长时间响应请求。
最小值 Min
- 定义
响应时间的最小值,单位是毫秒(ms)。 - 使用场景
表示最短的响应时间。可以帮助判断在测试过程中是否有异常的快速响应。
最大值 Max
- 定义
响应时间的最大值,单位是毫秒(ms)。 - 使用场景
表示最长的响应时间。非常高的最大响应时间可能表示系统在某些时刻出现了严重的性能瓶颈。
异常 Error %
- 定义
错误率,表示在所有请求中,失败请求所占的百分比。 - 使用场景
错误率高通常意味着系统存在故障或性能瓶颈,可能需要检查相关的错误日志来进一步定位问题。
吞吐量 Throughput
- 定义
吞吐量,表示每秒请求的数量(requests per second, RPS)。 - 使用场景
吞吐量是衡量系统在单位时间内处理请求的能力,较高的吞吐量通常意味着系统能够处理更多的用户请求。
传输数据量 KB per Second
- 定义
每秒传输的数据量,单位是千字节(KB/s)。 - 使用场景
表示在每秒钟内系统传输的数据量。较高的值通常表示系统处理大数据量的能力较强。
建立连接时间 Connect Time
- 定义
建立连接的时间,单位是毫秒(ms)。通常用于 HTTP 请求的连接阶段。 - 使用场景
较高的连接时间可能意味着网络延迟或服务器响应慢,特别是在多用户场景下,连接时间的优化尤为重要。
响应时间 Response Time
- 定义
响应时间,单位是毫秒(ms)。 - 使用场景
响应时间是指从发送请求到收到完整响应的时间,它是评估系统性能最直接的指标之一。通常越低越好。
平均吞吐量 Avg. Throughput
- 定义
平均吞吐量,表示所有请求的吞吐量的平均值。 - 使用场景
平均吞吐量可以帮助判断系统的处理能力。如果某一时刻吞吐量明显下降,可能存在性能瓶颈。
总计 Total
- 定义
总计行,表示所有请求的合计数。 - 使用场景
提供该测试计划所有请求的总的统计数据。
请求计数 Request Counts and Percentages
- 定义
聚合报告还会显示每个请求成功和失败的计数,以及它们在所有请求中的比例。 - 使用场景
可以帮助我们快速评估在负载测试中出现的错误情况和系统的稳定性。
案例2:导出报告
导出html 报告
- 在空文件夹中创建一个 report.txt 的文件。
- 在聚合报告的文件名中填写该文件的全路径。
- 执行测试。测试执行完成后, report.txt 文件中会有测试结果数据。
- 将report.txt 文件的后缀名称更换成csv , 即 report.csv
- 创建一个空的文件夹,存放生成的html。
- 打开导出配置界面
- 配置导出,点击 Generate report 按钮开始导出。
Results file: 选择步骤4中的report.csv文件
user.properties: 选择Jmeter 安装目录 bin 下的user.properties 文件。如下图
Output directory:选择步骤5中创建的空文件夹
- 查看导出结果
导出结束之后,在步骤5的文件夹中会生成报告html。用浏览器打开index.html 即可查看。如下图:
案例3: 计算理论的并发用户数
前提
按照案例1 步骤配置完成后,能正常执行完成得到聚合报告。
将报告导出html后,在html报告中可以查看到以下统计报告表。
例如统计报告表如下:
结果分析
注意:最大并发数需要结合其他信息如测试工具的配置、服务器资源利用率等来确定。以下分析只是基于html导出的统计报告表中的值推断的理论结果。
关键指标分析
- Samples (请求数): 100
- Error % (错误率): 0.00%
- Average (平均响应时间): 198.56 ms
- Min (最小响应时间): 98 ms
- Max (最大响应时间): 269 ms
- Transactions/s (每秒事务数): 362.32
并发用户数估算公式
并发用户数 = 平均响应时间(单位:毫秒) * 每秒事务数 (单位:次/秒)
上例的统计结果表中的理论并发用户估算值为: (198.56 * 1000) * 362.32 = 0.19856 * 362.32 约等于 72
案例4: 携带cookie请求
说明
在进行接口测试的时候需要先进行登录,对于传统的登录,登录成功后,后端使用session存储登录信息并将cookie信息返回给前端,前端请求接口的时候需要携带上cookie进行请求。为此,需要获取到登录成功返回的cookie信息存储在请求头中进行测试。
接口准备
java
package www.zhang.tomcat.controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.servlet.http.HttpServletRequest;
import java.util.HashMap;
import java.util.Objects;
@RestController
@RequestMapping(value = "test")
public class TestController {
/**
* 模拟的登录接口
*/
@GetMapping(value = "login")
public Object login(HttpServletRequest request) {
// 登录成功后设计session 设置session
request.getSession().setAttribute("user", "admin");
return new HashMap<String,Object>() {{
put("message", "成功");
}};
}
/**
* 模拟的查询接口
*/
@GetMapping(value = "list")
public Object list(HttpServletRequest request) {
// 获取session
Object user = request.getSession().getAttribute("user");
// 没有获取到对应登录信息
if(Objects.isNull(user)){
return new HashMap<String,Object>() {{
put("message", "fail not user");
}};
}
return new HashMap<String,Object>() {{
put("message", "成功"+user.toString());
}};
}
}
配置测试计划
线程组
按照案例1 添加线程组的步骤添加线程组,此处省略
http请求
按照案例1 添加http请求的步骤添加线程组,添加2个http请求。
登录请求login :
查询请求 list:
添加结果监听器
添加步骤
添加指定的监听器
此处主要是为了查看、学习不同监听器的结果而已。按照下图添加以下结果监听器。
执行登录http请求
按实际填写完成http登录请求相关的配置后,启动1次登录测试,并保证此次登录测试要成功。
在察看结果树监听器中可以看到请求记录。点击请求记录,查看响应内容,即可看到登录成功后返回的cookie的信息。如下图
添加正则表达式提取器
说明
由于登录成功后会在响应头中返回cookie的信息,此时可以用提取器获取到响应头中的cookie的信息。
介绍
正则表达式提取器用于从服务器返回的响应数据中提取特定的信息。你可以使用它来提取匹配正则表达式的内容,并将提取到的数据保存为 JMeter 变量,供后续的请求使用。
添加步骤
正则表达式提取器配置说明
-
要检查的信息头
此处要在响应头中获取数据,选择信息头。
-
引用名称
自定义变量名称,获取到的值会赋值给这个变量。其他地前方使用此变量格式:${变量名称}
-
正则表达式
根据填写的正则表达式规则来匹配到对应的值。
(.*) 通配符,表示所有。
例如:
根据登录成功后返回的响应头可得cookie中携带的sessionId的格式如下:
shell
HTTP/1.1 200
Set-Cookie: JSESSIONID=DFB85D3D2C35B36792B052E881400A4B; Path=/; HttpOnly
Content-Type: application/json;charset=UTF-8
Transfer-Encoding: chunked
Date: Fri, 20 Dec 2024 09:12:14 GMT
shell
# JSESSIONID=sessionId;
JSESSIONID=(.*); Path=/
从cookie中获取到sessionId 后,只要携带此数据请求接口,后端会自动根据此sessionId 找到登录信息。
-
模板
模板用于指定在响应中提取内容的位置。通常,在正则表达式中使用捕获组,模板就是指定使用哪个捕获组的内容.
例如,此处只需要获取第一个捕获到的值。
模板格式:
$序号$
例如:匹配第1个
$1$
;匹配第2个$2$
-
匹配数字
用于指定你想要提取第几个匹配项:
0 表示提取所有匹配项。
1 表示提取第一个匹配项(默认值)。
...
-1 表示提取最后一个匹配项。
添加HTTP Cookie管理器
在数据查询接口 list中 添加HTTP Cookie管理器,用于把在登录接口中通过正则表达式提取到的登录sessionid数据获取,放到请求头中。
添加HTTP Cookie管理器步骤
配置HTTP Cookie管理器
根据响应头中的格式数据进行填写
添加调试取样器
调试取样器来获取变量值,用于查看正则表达式的变量是否能提取到值。
添加步骤
运行线程组
运行线程组查看结果
登录结果
list数据查询结果
请求头
响应结果