---
order: 1
---
# 压力测试工具JMeter介绍

Apache JMeter是Apache组织开发的基于Java的压力测试工具，它可以用于对服务器、网络或对象模拟繁重的负载来测试它们的强度或分析不同压力类型下的整体性能。

\[\[toc]]

## JMeter安装配置{#install}

### 下载安装{#download}

方法一：访问[官网](https://jmeter.apache.org/download_jmeter.cgi)，选择`apache-jmeter-5.3.zip`，点击下载后解压

方法二：点击[此处](https://www.jianguoyun.com/p/DTRWO60Q3O-gChjG7qwE)下载后解压

### JMeter参数配置{#config}

**默认配置**

启动前需要对一些默认配置项进行修改，JMeter配置文件为`/path/to/jmeter/bin/jmeter.properties`，具体修改如下：

```shell
# JMeter默认的界面语言是英文，修改为中文
language=zh_CN

# 结果集输出的字符集默认为ISO-8859-1，防止响应结果乱码需要修改为UTF-8
sampleresult.default.encoding=UTF-8
```

::: tip 提示
运行jmeter之后，若以上配置未将语言修改为中文，则可使用以下方法进行JMeter语言修改
:::

在菜单栏点击`Options`>`Choose Language`>`Chinese(Simplified)`即可修改语言为中文

![修改语言](./images/2020-09-30-15-11-12.png)

**内存配置**

当并发数量过多时，JMeter内存配置不满足此时并发需求，会导致请求出现异常使结果不正确。Windows下右键编辑`/path/to/jmeter/bin/jmeter.bat`，修改以下配置即可：

```shell
# 修改Xmx的值来增大JMeter内存配置
set HEAP=-Xms1g -Xmx2g
```

### JMeter运行{#start}

双击`/path/to/jmeter/bin/jmeter.bat`，即可运行JMeter

启动后的界面如下

整体分3部分：

1. 菜单栏
2. 工具栏
3. 操作界面（左：标签 右：标签信息）

![界面](./images/2020-09-22-16-34-33.png)

::: tip 提示
在Windows测试端网络或硬件性能受限的情况下，需要将录制好的测试脚本放到同网段、高性能的服务器上运行
::::

## 常用组件介绍{#component}

一个完整的测试计划分为3部分：全局设置、测试主体和测试结果

![测试计划](./images/2020-09-22-17-18-35.png)

下面对这3部分常用的组件分别进行讲解

### 全局设置{#global-setting}

#### HTTP Cookie管理器

用于管理其范围内HTTP请求的Cookie，详细介绍见[官方文档](https://jmeter.apache.org/usermanual/component_reference.html#HTTP_Cookie_Manager)。

#### HTTP缓存管理器

用于在其范围内向HTTP请求添加缓存功能，模拟浏览器缓存，详细介绍见[官方文档](https://jmeter.apache.org/usermanual/component_reference.html#HTTP_Cache_Manager)。

`HTTP Cookie管理器`和`HTTP缓存管理器`两个配置元件只需要添加到测试计划中即可，不需特殊设置。如果没有这两个配置元件，会导致登录成功但是请求失败的情况。

#### HTTP请求默认值

一般情况下，我们在一个项目中调用的接口中域名、端口等都是相同的。当我们创建多个HTTP请求时，由于这些数据是必填项，所以就需要多次填写相同的数据。如果项目进行过程中出现了更改域名、更改端口号等情况，又需要把每一个请求中的数据都做更改，所以需要配置`HTTP请求默认值`将这些相同的参数设置为默认值，详细介绍见[官方文档](https://jmeter.apache.org/usermanual/component_reference.html#HTTP_Request_Defaults)。

下图是`HTTP请求默认值`的配置界面，需要配置被测试项目地址的`请求协议`、`请求IP`、`端口号`
![HTTP请求默认值](./images/2020-09-22-09-39-48.png)

#### CSV数据文件设置

从外部文件中读取变量值，用于变量的参数化，详细介绍见[官方文档](https://jmeter.apache.org/usermanual/component_reference.html#CSV_Data_Set_Config)。

下图是`CSV数据文件设置`的配置界面，此处读取记录了测试用户名/密码的外部CSV文件，并赋值给`user`、`password`变量
![CSV数据文件设置](./images/2020-09-22-09-40-39.png)
需要配置的选项：

- `文件名`：数据文件的路径
- `文件编码`：数据文件编码
- `变量名称`：定义变量读取数据文件中的内容，后续可以使用${变量名}来引用

#### BeanShell预处理程序

在请求发送之前执行BeanShell程序，处理一些复杂的数据，详细介绍见[官方文档](https://jmeter.apache.org/usermanual/component_reference.html#BeanShell_PreProcessor)。

例如下图，将csv文件中读取的用户名和密码先拼接为json格式，再将json使用base64加密，最后将加密值储存到"key"变量中，作为登录接口POST请求的消息体数据
![BeanShell预处理程序](./images/2020-09-22-10-21-50.png)
::: details 点击查看此处代码

```java
import org.apache.commons.net.util.Base64;

String user = vars.get("user");
String psw = vars.get("password");

StringBuffer buf = new StringBuffer();
buf.append("{\"user\":\"").append(user).append("\",\"password\":\"").append(psw).append("\"}");

String json = buf.toString();

byte[] encodedBytes = Base64.encodeBase64(json.getBytes("UTF-8"));
String encoded = new String(encodedBytes);
vars.put("key", encoded);

```

:::

### 测试主体{#subject}

测试主体包括访问测试项目(数据模型、仪表板、报表等)的整个过程，在`线程组`中通过执行HTTP请求实现，可以分为`登录`、`操作`、`注销`三个事务，其中`登录、注销`在模板中已经给出，只需要按照实际情况修改部分参数；`操作`可以使用JMeter的录制功能来实现，下面以录制访问`首页看板`为例介绍具体步骤：

1. 在线程组中添加`事务控制器`，名称为`访问首页看板`
   ![录制1](./images/2020-09-22-14-48-28.png)
2. 在测试计划中添加`非测试元件-HTTP代理服务器`，设置目标控制器为步骤1中创建的`访问首页看板`
   ![录制2](./images/2020-09-22-14-49-16.png)
3. 点击启动，运行时不要关闭`Recorder：Transactions Control`对话框，否则会影响录制请求的结果
   ![录制3](./images/2020-10-19-17-17-58.png)
4. 通过`Internet属性-局域网设置`设置系统代理服务器，由于`HTTP代理服务器`的工作原理是拦截并记录系统代理发出的请求，因此端口号需要保持与JMeter中的`HTTP代理服务器`组件设置一致
   ![录制4](./images/2020-09-22-14-51-56.png)
5. 此时，在浏览器中所有操作的请求都会记录在`访问首页看板`控制器中。在浏览器输入`首页看板`的地址，回车进行访问，可以发现`事务控制器`中已记录了访问该仪表板过程中的所有请求
   ![录制5](./images/2020-09-22-15-21-29.png)
   ::: tip 提示
   JMeter不会记录被缓存的HTTP请求，因此在访问被测试对象前，请清理浏览器缓存
   ::::

### 测试结果{#result}

#### 查看结果树

`查看结果树`中展示了每一个取样器的结果、请求信息和响应信息，可以查看这些内容去分析脚本是否存在问题，详细介绍见[官方文档](https://jmeter.apache.org/usermanual/component_reference.html#View_Results_Tree)。
![查看结果树](./images/2020-09-22-11-05-55.png)

#### 聚合报告

对于每个请求，`聚合报告`统计响应信息并提供请求数，平均值，最大，最小值，错误率，大约吞吐量(以请求数/秒为单位)和以kb/秒为单位的吞吐量，详细介绍见[官方文档](https://jmeter.apache.org/usermanual/component_reference.html#Aggregate_Report)。
![聚合报告](./images/2020-09-22-11-06-46.png)

聚合报告名词解释如下：

- 样本：发送到服务器的样本数目
- 平均值：平均响应时间（毫秒ms）
- 中位数：响应时间中位数，即有一半的服务器响应时间低于该值而另一半高于该值
- 90%百分位：90%的请求的响应时间（毫秒ms），即90%请求响应时间不会超过该时间
- 95%百分位：95%的请求的响应时间（毫秒ms），即95%请求响应时间不会超过该时间，与90%Line结合能够较好的反映实际情况下绝大多数用户的响应等待，非常有意义
- 99%百分位：99%的请求的响应时间（毫秒ms），即99%请求响应时间不会超过该时间
- 最小值：响应最小时间（毫秒ms）
- 最大值：响应最大时间（毫秒ms）
- 异常%：出错率=错误的请求的数量/请求的总数；
- 吞吐量：每秒完成的请求数
- 接收KB/sec：每秒接收的字节数
- 发送KB/sec：每秒发送的字节数

#### 服务器性能监控

在性能测试时，了解加载的服务器的健康状况是很重要的。使用`jp@gc-PerfMon Metrics Collector`插件，可以监控所有平台的CPU，内存，交换，磁盘I/O和网络I/O，详细介绍见[官方文档](https://jmeter-plugins.org/wiki/PerfMon/)。

配置方法如下

**服务器端：**

1. 点击[此处](https://www.jianguoyun.com/p/DTRWO60Q3O-gChjG7qwE)下载ServerAgent.zip，上传到服务器
2. 运行`unzip ServerAgent-2.2.3.zip`解压
3. 在ServerAgent-2.2.3目录下执行`nohup ./startAgent.sh &`即可，默认端口为4444

::: tip 提示

如果端口号被其他服务占用可以进行修改

执行如下命令

```sh
vim startAgent.sh
```

添加`--udp-port xxxx --tcp-port xxxx`参数，例如修改端口为7777，文件内容为`java -jar $(dirname $0)/CMDRunner.jar --tool PerfMonAgent --udp-port 7777 --tcp-port 7777"$@"`

:::

**测试端：**

1. 点击[此处](https://www.jianguoyun.com/p/DTRWO60Q3O-gChjG7qwE)下载plugins-manager.jar，放置/path/to/jmeter/lib/ext下
2. 重启JMeter，在菜单栏中点击选项，打开`Plugins Manager`，切换到`Avaliable Plugins`标签页，勾选`PerfMon(Servers Performance Monitoring)`，点击`Apply Changes and Restart JMeter`
   ![PerfMon](./images/2020-09-22-11-26-37.png)
3. 重新启动后即可在监听器中找到`jp@gc-PerfMon Metrics Collector`
   ![PerfMon](./images/2020-09-22-11-36-29.png)
   配置界面如下图所示，在`Servers to Monitor`表格中配置服务器ip、ServerAgent服务端口号、监听类型即可
   ![服务器性能监控](./images/2020-09-22-11-23-09.png)
