目录
[1. 打开JMeter](#1. 打开JMeter)
[2. JMeter基本使用流程](#2. JMeter基本使用流程)
[1. 添加线程组](#1. 添加线程组)
[2. 添加HTTP请求](#2. 添加HTTP请求)
[3. 配置HTTP请求](#3. 配置HTTP请求)
[4. 添加结果树](#4. 添加结果树)
[5. 运行测试](#5. 运行测试)
[3. JMeter原件作用域](#3. JMeter原件作用域)
[1. 线程组](#1. 线程组)
[2. HTTP取样器](#2. HTTP取样器)
[3. 查看结果树](#3. 查看结果树)
[4. HTTP Cookie管理器](#4. HTTP Cookie管理器)
[5. HTTP请求默认值](#5. HTTP请求默认值)
[6. HTTP请求头管理器](#6. HTTP请求头管理器)
[7. 用户自定义变量](#7. 用户自定义变量)
[8. CSV数据文件设置](#8. CSV数据文件设置)
[9. JSON提取器](#9. JSON提取器)
[10. JSON断言](#10. JSON断言)
[11. 聚合报告](#11. 聚合报告)
[12. 同步定时器(集合点)](#12. 同步定时器(集合点))
[13. 事务控制器](#13. 事务控制器)
[14. 安装插件](#14. 安装插件)
[15. 梯度线程组](#15. 梯度线程组)
[16. Response Times Over Time](#16. Response Times Over Time)
[17. Transactions per Seconds](#17. Transactions per Seconds)
前言
本文介绍了JMeter 5.5压力测试工具的基本使用方法。主要内容包括:JMeter的启动方式、基本测试流程(添加线程组、HTTP请求、结果树等)、常用组件功能(线程组参数设置、HTTP取样器、结果查看、Cookie管理等)以及高级功能(JSON提取器、断言、聚合报告、同步定时器等)。文章还详细说明了如何安装插件、使用梯度线程组进行性能测试,以及如何生成测试报告。通过图文并茂的方式,全面展示了JMeter在接口性能测试中的应用场景和操作方法,为使用者提供了实用的参考指南。
一、JMeter介绍
JMeter是一款经典的压力测试工具,用于对接口进行性能测试。
JMeter可以模拟客户端给服务器发送请求,收集服务器的响应并维护统计信息,用户可以根据统计信息,分析接口性能;
下面文章基于JMeter 5.5版本进行操作。
1. 打开JMeter
JMeter下载好后,无需安装,找到JMeter目录后,双击运行jmeter.bat文件即可;

也可以采用配置环境变量的方式:在环境变量中配置完成后,使用命令行,输入"jmeter"打开;
第一步:配置环境变量;

第二步:使用命令行打开;

2. JMeter基本使用流程
1. 添加线程组
右键TestPlan,按照图示找到线程组并添加;

2. 添加HTTP请求
右键线程组,按照图示找到HTTP请求并添加;

3. 配置HTTP请求
根据要访问接口,按照图示填写协议类型,IP地址,端口号,请求方法,接口路径,以及请求参数;

4. 添加结果树
右键线程组,按照图示添加结果树,接口的响应信息都在结果树中进行查看;

5. 运行测试
完成后,点击"启动"按钮,运行测试;

3. JMeter原件作用域
作用域:由执行计划的树形结构中元件的父子关系决定,原件的作用域为当前原件的子节点;
取样器(Sampler)中的原件不依赖其它原件就可以执行,不存在作用域问题;
二、常用组件介绍
1. 线程组
线程组控制用于测试的线程数,每个线程相当于一个用户;

**Action to be taken after a Sample error:**原件发生错误后的执行策略,通常选择Continue,表示发生错误后,继续执行;
Thread Properties:
- Number of Threads(users):线程数量;
- Ramp-up period(seconds):线程启动的指定时间,例如填写1就表示,所有线程在1s内启动;
- Loop Count:表示线程要执行几个循环,例如配置2,就表示所有线程执行完一遍后,再执行一遍;
- Infinte:勾选就表示所有线程一直执行;
- Specify Thread lifetime:搭配Infinte使用,表示执行时间;例如配置2就表示所有线程一直执行,一共执行2s;
2. HTTP取样器

Protocol:协议号,通常写http或者https;
Server Name or IP:IP地址;
Port Number:端口号;
HTTP Request:请求方法,GET,POST等;
Path:接口的路径,可以不适用/开头;
Content encoding:内容的编码方式,通常使用 utf-8;
Parameters:请求参数,可以写在参数中,也可以拼在url中;如果是POST请求,要把参数写在BODY中;
3. 查看结果树

Sampler result:取样器结果,统计请求相关的信息;
Request:查看HTTP请求的正文和请求头;
Response data:查看HTTP响应和响应头;
清除结果信息:

4. HTTP Cookie管理器
HTTP Cookie管理器,可以像浏览器一样,可以保存和发送Cookie,如果响应中带有Set-Cookie字段,则自动保存Cookie,下次发送请求时会带上Cookie;
在JMeter中,每个线程都有自己的Cookie存储区,因此每个线程也都将拥有自己独立的会话;


设置Cookie管理器后,Cookie也不会直接显示在管理器中,而是可以通过查看结果树中的登录响应和下一次请求进行查看;
登录响应:

获取博客系统列表页请求:

5. HTTP请求默认值
用于配置HTTP请求中的默认值,通常一个项目中,HTTP请求中的协议,IP地址和端口号都是相同的,配置了HTTP请求默认值,就不需要再在HTTP请求中配置,所有的请求都会使用这份默认值;


6. HTTP请求头管理器
用于配置HTTP请求头,例如可以携带用户登录凭证;

配置用户登录凭证:

重新访问博客列表页,可以访问成功;

7. 用户自定义变量
配置用户自定义的变量,可以在HTTP请求中引入,方便在固定的场景中将变量参数化;

配置博客id:

获取博客详情:

成功获取到博客信息:

8. CSV数据文件设置
以登录接口为例,实际上登录不可能只有一个用户,为了模拟真实场景,我们可以设置多个用户进行登录;

配置多个用户:

Filename:保存多个用户账号信息的csv文件;
File encoding:文件编码方式;
Variable Name(comma-delimited):变量名,使用英文逗号分隔;
Ignore first line(only used if Variables Names is not empty):忽略首行,取决于csv文件有没有表头,如果有则设置true忽略,没有则设置false不忽略;
Delimiter(user '\t' for tab):分隔符,如果采用逗号分隔,则写逗号;
Allow quoted data:是否允许数据中带有引号;
Recycle on EOF:是否循环读取文件;
Stop thread on EOF:读取文件结束后,是否停止线程;通常循环读取文件就不停止线程,不循环读取,就停止线程;
Sharing Mode:通常设置所有线程;
csv中的账号信息:

设置线程数为2:

修改登录请求中的参数:

运行测试,查看结果,多个用户设置成功:


9. JSON提取器
接口响应成功后,用于提取响应信息中的字段,用于其它接口的参数配置;

例如登录接口,登录后用于提取登录凭证,携带该登录凭证再访问其它接口,而不是使用固定的登录凭证;

Names of created variables:变量名;
JSON Path expressions:JSON提取器提取路径表达式,表示提取的内容;
JSON Path可以借助结果树查看:


将测试正常的JSON Path写到JSON提取器中,就可以提取接口响应信息中的字段;
修改请求头管理器中固定的登录凭证为每次登录时获取的登录凭证:

注意需要将JSON提取器放在登录接口下方,因为JSON提取器仅用于获取登录接口的凭证,否则每次请求后都获取一段非登录凭证信息,后续的接口将访问失败;

运行测试:

10. JSON断言
请求成功后,接口返回HTTP响应码200,并不意味着成功返回数据了,因此也要使用断言判断返回的数据是否正确;


Assert JSON Path exists:要判断的JSON路径;
Additional assert value:勾选表示支持断言匹配,不勾选仅表示判断该字段是否存在;
Match as regular expression:勾选表示正则表达式匹配,不勾选表示精准匹配;
Expected Value:期望值,搭配上述两个选项使用,精准匹配是写值,正则表达式匹配时,写表达式;
Expect null:判断是否为空;
Invert assertion(will fail if above condition met):结果取反;
在博客详情页下使用JSON断言:
1)断言成功


2)断言失败


11. 聚合报告
描述性能测试过程中整体的数据变化;通过性能测试的指标,衡量接口的性能;


- Label:HTTP请求;
- Samples:发起HTTP请求的调用数;
- Average:平均响应时间,单位为毫秒;
- Median:请求调用响应时间的中位数,单位为毫秒;
- 90%Line:90%请求调用的响应时间,单位为毫秒;
- 95%Line:95%请求调用的响应时间,单位为毫秒;
- 99%Line:99%请求调用的响应时间,单位为毫秒;
- Min:请求调用的最小响应时间,单位为毫秒;
- Max:请求调用的最大响应时间,单位为毫秒;
- Error:调用失败的请求占比,调用失败指响应断言失败或者请求调用出错;
- Throughout:吞吐量,TPS/QPS,每秒处理的事务数;
- KB/sec:每次网络传输的流量大小,单位为KB,以网络传输的大小衡量网络的吞吐量;
配置线程组线程数量为10:

启动测试,查看聚合报告:

12. 同步定时器(集合点)
同步定时器用于模拟多用户并发访问的场景,确保多个线程能够同步执行某个操作,达到真正并发的效果;


Number of Simulated Users to Group by:表示并发的数量,当准备好的线程数大于等于配置的数量,发送HTTP请求;
设置线程组的线程数为6,并勾选InfInte,持续时间设置为1s:

勾选InfInte的原因:当线程最终剩余的数量小于同步定时器设置的3时,就会一直等待,测试无法结束,因此设置无限循环保证一直都能有3个线程,测试可以正常结束;
13. 事务控制器
将多个接口添加到一个事务中,多个接口就能以一个事务的方式来运行;
事务控制器的主要作用是,测试多个接口作为一个事务运行时,花费的总时间,用于评估接近真实场景的接口性能;


多个接口作为一个事务的运行时间:

14. 安装插件
实际测试中,往往需要逐步增加线程数,来对接口进行性能测试;当前的线程组线程数是固定的,不能满足测试要求,因此需要安装其它插件来实现这个功能;
安装其它插件前需要安装插件管理器,链接如下:
Install :: JMeter-Plugins.orgx
下载完成后,将下载好的jar包,放到如下目录:

1)安装监听器插件

2)安装过程组插件

插件下载完成后,可以看到新增的元件:

15. 梯度线程组
梯度线程组用于梯度增加线程数,在实际测试中,更为常用。


- This group will start 100 threads,100表示总线程数;
- First,wait for 0 seconds,0表示开始后立即启动线程,不进行等待;
- Then start 10 threads,10表示开始先启动10个线程;
- Next, add 10 threads every 5 seconds,10表示梯度,5表示时间间隔,每隔5s时间内增加10个线程;
- using ramp-up 2 seconds,5表示这10个线程要在2s时间内启动;
- Then hold load for 60 seconds,表示所有线程启动后持续60s;
- Finally, stop 5 threads every 1 seconds,表示最终没1s结束5个线程;
16. Response Times Over Time
Response Times Over Time用于监听整个事务运行期间的响应时间;测试人员可以根据响应时间了解不同时间点的响应性能,从而发现可能存在的性能问题或瓶颈;


17. Transactions per Seconds
Transactions per Seconds即TPS,用于分析吞吐量,表示每秒钟处理的事务数;
反映了系统处理业务的能力,TPS越高,系统处理业务的能力就越强;


三、测试报告
JMeter的测试报告是一个全面详细的文档,提供了全面详细的执行结果信息,帮助用户评估系统性能并优化;
生成性能测试报告的命令:
jmeter -n -t 脚本文件 -l 日志文件 -e -o 目录
-n:无图形化运行
-t:被运行的脚本
-l:将运行信息写入日志文件,后缀为.jtl
-e:生成测试报告
-o:指定报告输出目录
注意:日志文件和目录可以不存在,如果存在要保证内容为空;否则会报错;
测试示例:

生成的index.html就是测试报告;

测试报告:
