【快速入门】JMeter
在公司实习时听旁边的同事说用JMeter做压力测试,这引起了我的好奇,因此特地学习了JMeter,本篇文章就教大家如何使用JMeter。
一.介绍
ApacheJMeter是Apache组织基于Java开发的压力测试工具,用于对软件做 性能测试 。
1.启动的方式
1)点击bin目录下的bat文件

2)将bin目录的路径放到环境变量里,这样可以直接使用命令打开JMeter

2.修改字体
找到在 bin 目录下找到 jmeter.properties 这个文件,修改里面的 language 的值:

3.元件的作用域和执行顺序
JMeter 元件的作用域主要由测试计划的树形结构中的元件父子关系来确定。
取样器(sampler)元件内组件不依赖其他元件就可执行,因此取样器不存在作用问题。元件作用域只对它的子节点有作用, 其他作用域默认根据测试计划中树形结构来定。
二.基本使用流程
首先先启动JMeter:

在“测试计划”下添加“线程组”:

在“线程组”下添加“HTTP”取样器:

填写“HTTP”下的内容:

补充:这里我发现一个东西,如果“参数”那里有内容的话是无法切换到“消息体数据”的,必须把“参数”中的内容全部删除才能切到“消息体数据”。
在“线程组”下添加“查看结果树”监听器:

点击绿色按钮运行即可:


三.插件
首先要先现在JMeter的插件工具,前往:Install :: JMeter-Plugins.org

下载完后放到JMeter的 apache-jmeter-5.5\lib\ext 中,然后重启JMeter即可。

四.线程组件
1.线程组

| 线程数 | 一个线程即一个测试用户,并发数 |
| Ramp-up时间(秒) | 设置性能测试运行时间,单位为秒 |
| 循环次数 | 控制脚本循环执行的次数。如果说选择了前面的永远,需要配置下面的调度器,持续时间是在这段时间不断发送请求,具体发送多少请求未知 |
2.梯度压测线程组


解释一些图里的信息:
| This group will start | 启动多少个线程,同线程组中的线程数 |
| First, wait for | 等待多少秒才开始压测,一般默认为0 |
| Then start | 一开始有多少个线程数,一般默认为0 |
| Next,add | 下一次增加多少个线程数 |
| threads every | 运行多长时间之后再次添加线程数 |
| using ramp-up | 启动线程的时间;若设置为5秒,表示每次启动线程都持续5秒 |
| Then hold load for | 线程全部启动完之后持续运行多长时间 |
| Finally,stop/threadsevery | 多长时间释放多少个线程;若设置为5个和1秒,表示持续负载结束之后每1秒钟释放5个线程 |
五.配置元件

1.HTTPCookie管理器

添加了HTTPCookie管理器后,如果HTTP请求并且响应包含cookie,则Cookie管理器会自动存储该cookie,并将其用于将来对该特定网站的所有请求。每个JMeter线程都有自己的"cookie存储区"。因此,正在测试使用cookie存储会话信息的网站,则每个JMeter线程都将拥有自己的会话。此类Cookie不会显示在Cookie管理器显示屏上,可以适应“查看结果树”查看。
2.HTTP请求默认值
这个HTTP请求默认值可以在线程组那里创建,也可以在取样器那里创建,只不过是作用域不同。

在这里配置请求相关信息后,在取样器那里就不用写了,使用的就是这些默认值。
3.用户定义变量
可以添加一些自定义的变量,无需将请求中的参数写死,请求中的参数可以使用${变量名}的方式,真正的值定义在这里:

4.HTTP信息头管理器
这里用于配置一些要加在请求头的信息:

5.CSV 数据文件设置
主要作用是从外部 CSV 文件中读取测试数据。

| 文件名 | 填写csv文件的路径,建议使用绝对路径 |
| 文件编码 | UTF-8 |
| 变量名称 | 从csv数据文件中读起的数据需要保存到的变量名。有多个变量时用逗号分隔 |
| 是否忽略首行 | 是否从csv数据文件第一行开始读取 |
| 分隔符 | 要求与csv数据文件中多列的分隔符一致 |
| 遇到文件结束符再次循环 | 若选择为True当数据不够的时候会从头取。若选择False,则需要勾选下面的配置,遇到文件结束符停止线程,这里如果不勾选,请求将会报错 |
编写csv文件,使用excel编写即可,最后将文件后缀转换成.csv即可。

这里我使用一个登录的接口为例,在csv文件中我写入了两个人的账号和密码。
最后,使用csv文件配置的时候要搭配“线程组”里的“线程数”或者说修改“循环次数”也行。
六.处理器、断言

1.JSON提取器

接口响应成功,通过提取返回值对应字段,可用于其他接口的参数配置。
JSON提取器操作符:
| $ | 表示根元素 |
| @ | 当前元素 |
| * | 通配符。所有节点 |
| .. | 选择所有符合条件的节点 |
| .<name> | 子元素 |
| ['<name>' (, '<name>')] | 括号表示子元素或子元素列表 |
| [<number>(,<number>)] | 数组索引或索引列表 |
| [start:end] | 数组切片操作符 |
| [?(<expression>)] | 过滤器表达式。表达式必须评估为布尔值。 |
写完JSON提取的表达式可以现在查看结果树那里测试一下:

下面设置一个JSON提取器:
Names of created variables:提取出的数据指定的变量名;
JSON Path expressions:JSON提取表达式;
使用指定的变量:

2.JSON断言

接口发送请求成功,响应码为200并不能完全代表接口请求成功,我们更多需要关注接口响应数据是否符合预期。

JSON Path exists:写的就是上面说的JSON提取的匹配字符串;
Additionally assert value:如果选择就要匹配Expected Value的值;
Match as regular expression:如果选择就是要使用正则表达式来匹配Expected Value的值;
七.同步定时器


JMeter同步定时器的作用主要在于模拟多用户并发访问的场景,确保多个线程能够同时执行某个操 作,以达到真正的并发效果。
当多个线程同时启动时,它们可能会在不同的时间间隔内执行,这样就无法达到真正的并发效果。同步定时器的作用就是将这些线程的执行时间同步,使它们在同一时间点执行。它可以在多个线程之间制造一定的延迟,直到同时到达指定时间点,再同时执行后续的操作。
此外,同步定时器可以理解为集合点,当线程数量达到指定值后,再一起释放,可以瞬间产生很大的压力。这样,可以更好地模拟真实的用户并发访问场景,提高测试的准确性和可靠性。
在性能测试过程中,为了真实模拟多个用户同时进行操作以度量服务器的处理能力,可以使用同步定时器来设置集合点。不过,虽然通过加入集合点可以约束请求同时发送,但不能确保请求同时到达服务器,所以只能说是较真实模拟并发。
八.控制器

1.事务控制器

JMeter事务控制器的作用主要用于测试执行嵌套测试元素所花费的总时间。这相当于模拟用户进行一系列操作的测试。
在进行页面性能测试或API性能测试时,事务控制器是一个非常重要的工具。它可以帮助测试人员更准确地评估系统性能,尤其是在涉及多个接口或操作的复杂场景中。例如,在订单提交的过程中,可能需要调用多个接口,并且某些接口可能依赖于前一个接口的结果。在这种情况下,使用事务控制器可以将这些接口统一视为一个事务进行性能测试,从而得到更接近真实场景的性能测试结果。
五.常见监听器
1.查看结果树


取样器结果:统计请求相关的信息
Thread Name:线程组名称
Sample time:发送请求时间
load time:响应时间
Response code :接⼝响应状态码
请求:HTTP请求的请求头和请求体的详细信息
响应:HTTP响应的响应头和响应体的详细信息
2.聚合报告
从聚合报告可以看到性能测试过程中整体的数据变化

下面对图中数据进行说明:
| 指标 | 说明 |
| Samples | 发起的 HTTP 请求调用数 |
| Average | 平均响应时间,单位为毫秒 |
| Median | 请求调用响应时间的中间值,也就是 50% 请求调用的响应时间,单位为毫秒 |
| 90%Line | 90% 请求调用的响应时间,单位为毫秒 |
| 95%Line | 95% 请求调用的响应时间,单位为毫秒 |
| 99%Line | 99% 请求调用的响应时间,单位为毫秒 |
| Min | 请求调用的最小响应时间,单位为毫秒 |
| Max | 请求调用的最大响应时间,单位为毫秒 |
| Error% | 调用失败的请求占比。调用失败一般指响应断言失败或者请求调用出错 |
| Throughput | TPS/QPS,每秒处理的事务数 |
| KB/sec | 每秒网络传输的流量大小,单位为 KB。这个指标是以网络传输的大小来衡量网络的吞吐量 |
3.Response Times Over Time
ResponseTimesOverTime主要用于监听整个事务运行期间的响应时间。在测试过程中,它可以帮助测试人员观察并分析响应时间的实时平均值以及整体响应时间的走向。通过这一监听器,测试人员能够更直观地了解系统在不同时间点的响应性能,从而发现可能存在的性能问题或瓶颈。

ResponseTimesOverTime的图形展示中,横坐标通常代表运行时间,而纵坐标则代表响应时间(单位是毫秒)。测试人员可以根据图形中的趋势线来判断响应时间的稳定性以及是否存在大的波动。例如,如果响应时间在某个时间点突然增加,这可能意味着系统在该时间点遇到了性能问题。

4.Transactions perSecond
Transactions perSecond(TPS)监听器是一个用于分析系统吞吐量的重要工具。TPS, 即每秒事务通过数,表示一个客户机向服务器发送请求后服务器做出反应的过程。这个指标反映了系统在同一时间内处理业务的最大能力。TPS值越高,说明系统的处理能力越强。

在使用TPS监听器时,横坐标通常代表运行时间,而纵坐标则代表TPS值。通过监听器展示的图表,可以清晰地看到TPS值随时间的变化情况。在图表中,红色通常表示通过的TPS,而绿色可能表示失败的 TPS。这有助于我们快速识别系统性能的变化和瓶颈。

六.测试报告
JMeter测试报告是⼀个全面而详细的文档,它提供了关于测试执行结果的详细信息,帮助用户全面评估系统的性能并进行性能优化。
生成性能测试报告的命令:
jmeter -n -t 脚本⽂件 -l ⽇志⽂件 -e -o ⽬录-n :⽆图形化运⾏
-t :被运⾏的脚本
-l :将运⾏信息写⼊⽇志⽂件,后缀为jtl的⽇志⽂件
-e :⽣成测试报告
-o :指定报告输出⽬录
执行完后会得到报告:

点开这个html文件:

