JMeter

参考:JMeter 快速上手 | 白月黑羽 (byhy.net)

JMeter 这个软件工具 主要用于服务端系统的性能测试

比如 测试 web网站,API服务器 的性能,如下图所示

1690955200926

1. 安装 JMeter

前提要有 JDK8/JDK11

官网:Apache JMeter - Download Apache JMeter

1690955571823

  • 下载后解压放在 D盘即可

1690955752866

2. 打开

  • 进入 bin 目录下,双击 jmeter.bat 文件,就会出现如下界面:

1690955889212

  • 修改系统背景和字体大小还有语言,可以点击 option

1690956774162

3. 界面简介

性能测试是:验证在各种性能负载场景下 ,系统的表现是否符合预期

模拟大量用户访问被测系统?

一个性能测试场景, JMeter称之为 test plan ,中文翻译为 测试计划 。实际上,一个 JMeter的测试计划对应性能测试的一个场景,其实也就是一个测试用例应该先准备好性能测试用例, 然后再用JMeter对应配置好一个测试计划来对应它。每个测试计划都可以保存在一个单独的文件中。

JMeter的测试计划,具体里面的内容(怎么测),根据你设计好的测试用例,在这个下面添加相应子节点定义。JMeter 把每个节点称之为 element ,翻译为中文叫 元件 ,或者 元素

首先,必须定义用户访问的行为。 就是用户 先访问哪个网页,发出哪些HTTP请求,再访问哪个网页,发出哪些HTTP请求。 根据用例,往往需要模拟 多种 用户行为, 每种行为的用户有多少个。JMeter 把一个用户的行为 用一个线程来执行。JMeter 把同一种用户的行为和数量, 用线程组来定义,代表有一批用户,都是这样的行为

4. 测试计划和线程组

例:

比如,现在我们要做的一个性能测试用例 需要模拟的行为 如下:

第1种行为(用户数量 5个):

先访问首页,再访问 单课页 ,再访问 新闻页

第2种行为(用户数量 10个):

先访问首页,再访问 专题页 ,再访问 新闻页

我们就要定义2个线程组,对应这两种行为的用户。

1690957715900

  • 线程组中:

    • Ramp-Up 时间 意思是 所有用户上线的总时间,以秒为单位。
    • 比如5,就表示总共耗时5秒,如果是 5个用户,那就意味着 每隔1.25秒上线一个: 5秒/(5-1) = 1.25
    • 循环次数 意思是 每个用户 做线程组里面定义的动作行为 多少轮 。 缺省就做一轮。

    1690958054931

  • 接下来 这个线程组里面 的 行为定义,也就是这类用户 先访问哪个网页,发出哪些HTTP请求,再访问哪个网页,发出哪些HTTP请求, 这个行为怎么定义呢?

    • 一个具体的请求,是通过 Sampler 取样器 来 定义的。
    • 通常最常用的就是这个 HTTP请求取样器。

    1690958170476

  • 定义设置好以后,下面就是要运行看看。

    • 运行前,通常我们要保存这个测试计划
    • 先选择计划节点,再选择工具栏的 保存 按钮,自己选择合适的保存位置

    1690958691364

5. 调试运行

接下来就可以运行一下看看。

注意,运行JMeter 有2种运行模式: GUI 图形界面模式CLI 命令行模式,前者是开发调试用的,后者才是真正执行压力测试时用的,现在就是开发阶段,当然先使用 图形界面模式,等调试没有问题,再使用命令行模式

所以图形界面模式,我们要查看结果,就是加 Listener 监听器

最常见的就是 ViewResultTree查看结果树 ,里面会显示HTTP请求具体的细节的信息。

注意右键根节点

1690959259494

结果树 的 Sample result 页 参数的意义: (若要删除记录,左侧栏右键查看结果树,点击清除即可)

1690959893695

1
2
3
4
5
6
7
8
9
10
11
12
13
14
Connect Time : 
jmeter 和 被测系统 建立 TCP 连接的时间,包括3路握手时间,
如果连接复用, 值为0

lantency:
从发出请求前 到 接收完第一个响应的时间

loadtime(以前叫Elapsed time):
从发出请求前 到 接收完所有响应的时间
如果是长消息, 往往时长 >= lantency,因为有多个响应

Size in bytes : 整个消息消息大小 = Headers size in bytes + Body size in bytes
Headers size in bytes : 响应消息头大小
Body size in bytes : 响应消息体大小

6. HTTP 请求默认值配置

测试过程中,被测系统换了, 就要换配置的地址, 要手动修改 请求参数,请求取样器多了, 就非常麻烦了。可以使用HTTP请求默认值 解决这个问题。

那么如果具体在写测试行为时,如果没写,就默认使用http请求默认值里配置的信息,比如请求的ip啥的

1690960289999


这边自己试了下,直接测匹配的接口,除了 post 发送时需要在请求头加上点东西,其他没啥,亲测可用,所以接下来看下报告如何打印应该就行,,

1690962876252


7. 模拟间隔时间

补充一下,点右键可以禁用某个用户行为

场景1中两组请求中间没有间隔,不符合实际情况。

怎么让它们有间隔呢?

  • 可以使用 JMeter的 定时器 Timer,有很多种,这里选择 固定的试下

    • 但是注意:定时器 执行优先级高于 取样器, 会先暂停, 可以放在下一个消息的前面
    • 也就是这个定时器你放一个,就会对它同目录下的所有都起效果,所以慎重使用

    1690963423636

  • 也可以使用 取样器 里面的 测试活动 flow control action 取样器

    1690963791158

    这个就是正常等

    1690963852512

8. 执行压力测试-命令行模式

真正实施性能测试应该在命令行模式下运行(而不是我们看到的 GUI 界面),

在 .jmx 文件所在位置打开 cmd 命令行,输入命令格式如下:

1
D:\JMeter\apache-jmeter-5.6.2\bin\jmeter -n -t parktest-case1.jmx -l log.jtl

-n 表示命令行

-t 指定执行的测试计划 保存的 .jmx 文件

-l 最终生成的测试日志

注意JMeter的路径替换为你的安装路径

假设 我们有如下的性能测试用例,如下是简化的测试用例,实际工作的会很复杂

注意,一个线程代表一个用户

如果要测试系统的并发连接数应该如何测试?

1
2
3
4
5
6
只有一种用户行为:

无需登录,先访问首页,再访问 单课页 ,再访问 新闻页
访问页面间隔 10 秒

用户数量 1200 个,在10分钟依次上线
  • 这就已经开始进行压测了,由于设置的是 600 秒,等十分钟之后就行

    1690965288695

  • 结束

    1690965713070

9. dashboard 产生图表

1
D:\JMeter\apache-jmeter-5.6.2\bin\jmeter -g log.jtl -o report1

就会产生report1目录,里面的index.html 打开就是报告

注意 -o 后面的目录 一定要不存在,或者内容为空,否则会报错。

执行命令后进入 report1 目录下,点击里面的 index.html 文件,就可以看到如下页面:

1690965891290

1690966360901