JMeter 组件
🍕 JMeter是Apche公司使用Java平台开发的测试工具,用于接口测试、性能测试、压力测试、数据库测试、Java程序测试。
1 工具安装
- 工具安装
- Win10 1709秋季创意者更新64位正式版(零售版):Win10-1709-Chinese(Simplified)-x64.iso(迅雷下载)。
- 环境依赖:JDK-1.8-Win-x64.zip,命令窗口下
java -version、java、javac验证。- PATH:..\jdk1.8.0_331\bin
- JAVA_HOME:..\jdk1.8.0_331
- CLASSPATH:..\jdk1.8.0_331\lib;..\jdk1.8.0_331\lib\tools.jar
- Apache-JMeter-5.1.zip:下载安装包后,将其解压到本地自定义路径,再进行环境配置。
- JMETER_HOME:..\apache-jmeter-5.1
- CLASSPATH:..\apache-jmeter-5.1\lib\jorphan.jar;..\apache-jmeter-5.1\lib\ext\ApacheJMeter_core.jar
- 启动JMeter,双击
..\apache-jmeter-5.1\bin\jmeter.bat文件,如果位于系统盘,最好以管理员身份启动。
- 禅道开源版18.0:下载安装后进入xampp目录中,再双击start.exe启动(账号Admin,密码123456,改为Aa12345)。
1-1 目录介绍
- 目录介绍
- bin目录、licenses目录(证书目录)、docs目录(接口文档目录)、extras目录(扩展插件目录)。
- examples:CSV样例。
- jmeter.log:运行日志文件。
- jmeter.sh:Linux的启动文件。
- jmeter.bat:Windows的启动文件。
- jmeter.properties:系统配置文件。
- jmeter-server:Linux分布式测试要用到的服务器配置。
- jmeter-server.bat:Windows分布式测试要用到的服务器配置。
- lib目录(所用到的插件目录):ext(存放JMeter依赖的核心jar包)、junit(存放junit的测试脚本)。
- printable_docs目录:usermanual(用户手册)、component_reference.html(核心元件帮助文档)。
- bin目录、licenses目录(证书目录)、docs目录(接口文档目录)、extras目录(扩展插件目录)。

1-2 永久汉化
- 永久汉化
- 记事本或VSCode等编辑文本工具打开
..\apache-jmeter-5.1\bin\jmeter.properties文件。 CTRL+F搜索#language=en,在底下一行添加language=zh_CN,保存后重启JMeter就可以了。
- 记事本或VSCode等编辑文本工具打开

1-3 基本使用
- 基本使用
- 基本要素:测试计划、线程组、组件(配置元件、前置处理器、定时器、后置处理器、断言、监听器)、控制器。
- 元件与组件
- 元件:例如HTTP请求、事务控制器、响应断言等都是一个个元件。
- 组件:一组元件的集合,容器中可实现单独的某功能,例如取样器。
- 组件介绍
- 配置元件:用于提供对静态数据的支持。
- 断言:用于检查测试中得到的响应数据等是否符合预期。
- 监听器:对测试结果进行处理和可视化展示的系列组件。
- 取样器:向服务器发送请求(支持不同协议的请求),记录响应信息。
- 前置处理器:用于实际请求之前,对即将发出的请求进行特殊处理。
- 后置处理器:用于对取样器发出请求后得到的服务器响应进行处理。
- 逻辑控制器
- 一类用于控制测试计划执行过程中节点的逻辑执行顺序。
- 一类用于对测试计划中的脚本进行运行时控制或分组,方便统计执行结果。
- 定时器:在操作前设置等待时间,例如取样器与取样器之间设置一个等待时间。

1-4 组件作用域
- 组件作用域
- 原则:以取样器为核心,取样器没有作用域。
- 逻辑控制器:只对子节点的取样器和逻辑控制器起作用。
- 其他组件
- 如果父节点是取样器,只对父节点(取样器)起作用。
- 如果父节点非取样器,则该作用域是其父节点下的其他所有后代节点,包括子节点,以及子子节点等。
- 执行顺序
- 同一作用域下相同组件的执行顺序:从上到下依次执行。
- 同一作用域下不同组件的执行顺序:配置元件>前置处理器>定时器>取样器>后置处理器>断言>监听器。
- 运行原理
- 通过线程组来驱动多个线程运行测试脚本,对被测服务器发起负载,每个负载机上都可以运行多个线程组。
- 运行场景
- GUI模式:界面模式,主要用于前期创建编写或调试JMeter测试脚本的。
- 命令行模式:对负载机的资源消耗会更小,用于实现高并发和压力测试。
- 原则:以取样器为核心,取样器没有作用域。
(1) 取样器作用域

(2) 线程组作用域

(3) 测试计划作用域

(4) 逻辑控制器作用域

(5) 组件叠加对其影响

(6) 配置元件叠加影响

2 HTTP请求
- HTTP请求
- 配置说明
- 端口号:没有可以不填,http协议默认端口号为80,httpd默认端口号为443。
- 请求方法
- GET(请求参数在URL里):直接路径后带参
/?key=value&key=value,也可在参数列表中添加参数。 - POST(请求参数在请求体里):消息体数据中添加请求体,若为form表单格式,可在参数列表中添加。
- GET(请求参数在URL里):直接路径后带参
- 示例:编写脚本访问百度。
- URL=http://www.baidu.com/S,参数
wd=test(form表单)。 - JMeter脚本需使用到的元件包含:HTTP请求、察看结果树。
- 案例1:GET请求,路径传递参数。
- 案例2:GET请求,参数列表传递参数。
- 案例3:POST请求,参数列表传递参数。
- 案例4:POST请求,请求体数据传递参数。
- URL=http://www.baidu.com/S,参数
- 配置说明
2-1 路径传参

2-2 参数列表传参(GET)

2-3 参数列表传参(POST)

2-4 请求体数据传参

3 参数化设置
- 参数化设置
- 根据需求动态获取数据并进行赋值的过程,参数化变量用
${name}表示。 - 常用的方式
- 函数助手:适用于值在一定区间无规律且随机的情况。
- 用户参数:适用于取值范围小的参数(少量测试数据)。
- 用户定义的变量:并非做参数化使用,而是用来定义全局变量。
- CSV数据文件设置:支持读取外部数据,适用于大量数据测试。
- 根据需求动态获取数据并进行赋值的过程,参数化变量用
3-1 函数助手
- 函数助手
- 位于任务栏的工具中,适用于值在一定区间无规律且随机的情况,例如:价格、数量等。
- 示例:实现HTTP请求的名称带有随机值,需使用到的元件包含HTTP请求、察看结果树。
(1) 取值设置

(2) 结果分析

3-2 用户参数
- 用户参数
- 适用于取值范围小的参数(少量测试数据),元件位于“前置处理器”中。
- 在用户参数中添加变量后,需要在父节点“HTTP请求”的参数列表中引用相应的变量。
- 并且每个线程会一直使用一组数据,需在“线程组”中设置与用户数一致的“线程数”。
- 示例:实现禅道批量用户登录,需使用到的元件包含HTTP请求、用户参数、察看结果树。
(1) 添加变量

(2) 参数设置

3-3 用户定义的变量
- 用户定义的变量
- 并非用来做HTTP请求参数化,而是用来定义全局变量,例如参数化文件路径、HOST、URL等。
- 创建在“线程组”下,则在线程组内生效,如果创建在“测试计划”下,则对所有线程组生效。
- 示例:实现HTTP请求的IP参数化,需使用到的元件包含用户定义的变量、HTTP请求、察看结果树。
(1) 添加变量

(2) 参数设置

(3) 结果分析

3-4 CSV数据文件设置
- CSV数据文件设置
- 支持读取外部数据,适用于大量数据测试,元件位于“配置元件”中。
- 线程共享模式:指多个线程对文件数据取值顺序模式,JMeter提供了三种模式。
- 例如:脚本有2个线程组,各有2个线程,文件内有5行数据,脚本运行时,将如下循环往复取值。
- 所有线程:如果脚本有多个线程组,在这种模式下,各线程组的所有线程也要依次唯一顺序取值。

- 当前线程组:各个线程组之间隔离,线程组内的线程顺序唯一取值。

- 当前线程:每个线程独立,顺序唯一取值。

- 示例:实现禅道批量用户登录,需使用到的元件包含HTTP请求、CSV数据文件设置、察看结果树。
(1) userinfo.txt

(2) 设置CSV数据文件

(3) HTTP请求参数配置

(4) 察看结果树进行分析

4 常用的断言
- 常用的断言
- 响应断言:对HTTP请求的任意格式响应结果进行断言。
- JSON断言:HTTP响应结果是JSON格式时,使用JSON断言。
- 断言持续时间:检查HTTP请求的响应数据是否超出要求范围。
4-1 响应断言
- 响应断言
- 对响应结果中的文本内容进行断言,例如结果是否包含指定的值,或是否等于指定的值。
- 适用于各种返回类型的响应结果,例如text、html、application/json、application/xml等。
- 示例:发送请求到“https://www.baidu.com”。
- 检查响应数据是否包含“百度一下,你就知道”。
- 使用的元件:HTTP请求、响应断言、察看结果树。
(1) 百度响应

(2) 断言操作

(3) 结果分析

(4) 解决乱码
- 解决乱码
- 问题分析:响应页面没有做编码处理,JMeter默认按照ISO-8859-1编码格式进行解析。
- 解决乱码方法
- 更改JMeter文件配置
- 找到
..\apache-jmeter-5.1\bin\jmeter.properties文件,CTRL+F搜索#sampleresult.default。 - 在
#sampleresult.default底下添加sampleresult.default.encoding=UTF-8,保存后重启JMeter。
- 找到
- 添加HTTP信息头管理器:F12开发者工具>NetWork>Requests Table>Name>Headers>Request Headers。
- 添加BeanShell后置处理程序:“script”中添加脚本
prev.setDataEncoding("utf-8"),保存后再次执行。
- 更改JMeter文件配置
✧ jmeter.properties

✧ HTTP信息头管理器

✧ BeanShell后置处理程序

4-2 JSON断言
- JSON断言
- 用于断言某个字段值是否等于指定的值,只能针对响应结果为applicaton/json格式进行断言。
- JSON常用数据结构格式
- Object:
{'a': 1, 'b': 2, 'c': 3}。 - Array:
{'A': [{'a': 1, 'b': 2}, {'a': 3, 'b': 4}], 'B': [{'a': 5, 'b': 6}, {'a': 7, 'b': 8}]}。
- Object:
- JSONPath
- 可方便地从JSON数据结构中发现和提取数据,无论对象(Object)还是数组(Array),“根成员对象”总被称为
$。 - 表达式有dot–notation(
.号)和bracket–notation([]号)两种不同表示风格,如$.A[0].a、$['A'][0]['a']。
- 可方便地从JSON数据结构中发现和提取数据,无论对象(Object)还是数组(Array),“根成员对象”总被称为
- 示例:天气查询(https://www.free-api.com/doc/319)。
- 检查响应数据中的city是否为当地城市,例如当前所在的城市是厦门。
- JMeter脚本需使用到的元件包含HTTP请求、JSON断言、察看结果树。
(1) HTTP请求

(2) 断言配置

(3) 察看结果树

4-3 断言持续时间
- 断言持续时间
- 用于检查HTTP请求的响应时间是否超过预期值,该响应时间是性能测试中较常关注的一个性能指标。
- 示例:发送请求到“https://www.baidu.com”。
- 检查响应时间是否小于100ms,或小于200ms(响应时间在100-200ms)。
- JMeter脚本需使用到的元件包含HTTP请求、断言持续时间、察看结果树。
(1) HTTP请求

(2) 持续时间设置

(3) 察看结果分析

5 JMeter关联
- JMeter关联
- JSON提取法:针对JSON格式的响应结果数据进行提取。
- XPath提取法:根据HTML格式的响应结果数据进行提取。
- 正则表达式提取法:根据正则表达式对响应结果数据进行提取。
- 提取器功能:提取响应结果内容,实现从上一个返回体中获取下一个请求体中需要的数据。
5-1 JSON提取器
- JSON提取器
- 示例:提取天气查询接口的province信息,作为参数在访问百度首页时传递。
- 百度首页:https://www.baidu.com/s?wd。
- 天气查询:https://www.free-api.com/doc/319。
- 元件包含HTTP请求、JSON提取器、HTTP信息头管理器、察看结果树。
- 示例:提取天气查询接口的province信息,作为参数在访问百度首页时传递。
(1) 天气查询

(2) 提取器设置

- 将JSON提取器中已定义好的province变量名,以参数形式传递到“百度搜索”这一“HTTP请求”元件中。

- 百度通常带有网站安全验证,此时添加一个“HTTP信息头管理器”,更能模拟人为操作,安全校验不易识别。

(3) 察看结果树

5-2 XPath提取器
- XPath提取器
- 示例:提取W3Schools首页的title,作为参数在访问百度首页时传递。
- 百度首页:https://www.baidu.com/s?wd。
- W3Schools:https://www.w3schools.com/。
- 元件包含HTTP请求、XPath提取器、HTTP信息头管理器、察看结果树。
- 示例:提取W3Schools首页的title,作为参数在访问百度首页时传递。
(1) W3Schools

(2) 提取器设置

(3) 察看结果树

5-3 正则表达式提取器
- 正则表达式提取器
- 示例:提取W3Schools首页的title,作为参数在访问百度首页时传递。
- 百度首页:https://www.baidu.com/s?wd。
- W3Schools:https://www.w3schools.com/。
- 元件包含HTTP请求、正则表达式提取器、HTTP信息头管理器、察看结果树。
- 示例:提取W3Schools首页的title,作为参数在访问百度首页时传递。
(1) 提取器设置

(2) 察看结果树

5-4 不同线程组的关联
- 不同线程组的关联
- 当有关联关系的两个请求在不同线程组时,定义全局变量来进行关联。
- JMeter属性的配置函数与执行:都位于函数助手中。
__setProperty:通过BeanShell取样器将值保存成JMeter属性。__property:在其他线程组中使用property函数读取JMeter属性。
- 示例:提取,作为参数在访问百度首页时传递。
- 线程组1:发送请求,获取天气查询接口的province信息,https://www.free-api.com/doc/319。
- 线程组2:请求百度,https://www.baidu.com/s?wd,将上述获取的province信息作为参数传递。
- 使用元件包含HTTP请求、JSON提取器、BeanShell取样器、HTTP信息头管理器、察看结果树。
(1) 保存属性值

(2) 读取传递值

(3) 独立运行线程组

(4) 察看结果树分析

6 数据库的连接
- 数据库的连接
- 以本地禅道MySQL数据库为例,建立数据库连接,需配置mysql-connector-j-xxx.jar驱动包。
- MySQL官网:Select Operating System选择Platform Independent,点击zip包右侧的Download进行下载。
- 解压后将mysql-connector-j-8.0.32.jar文件复制到
..\apache-jmeter-5.1\lib目录下,重启JMeter。
- JMeter连接数据库的脚本需要使用到的元件包含:JDBC连接配置、HTTP请求、察看结果树。
- 以本地禅道MySQL数据库为例,建立数据库连接,需配置mysql-connector-j-xxx.jar驱动包。
6-1 引入包

6-2 JDBC连接配置
- JDBC连接配置
- DB2:
jdbc:db2://localhost:端口/数据库名。- 装有DB2客户端:
com.ibm.db2.jdbc.app.DB2.Driver。 - 未装DB2客户端:
com.ibm.db2.jdbc.net.DB2.Driver。
- 装有DB2客户端:
- Microsoft SQL Server
jdbc:microsoft.sqlserver://localhost:端口;DatabaseName=数据库名- JDBC Driver class:
com.microsoft.sqlserver.jdbc.SQLServerDriver。
- MySQL:
jdbc:mysql://localhost:端口/数据库名,com.mysql.jdbc.Driver。 - PostgreSQL:
jdbc:postgresql://localhost/数据库名、org.postgresql.Driver。 - Sysbase:
jdbc:Sysbase://localhost:端口/数据库名、com.sysbase.jdbc.SybDriver。 - JDBC-ODBC:
jdbc:odbc:数据源名(Database URL)、sun.jdbc.odbc.jdbcOdbcDriver。 - Oracle(thin模式):
jdbc:oracle:thin:@localhost:端口:SID,oracle.jdbc.OracleDriver。
- DB2:

6-3 JDBC请求设置

6-4 察看结果树分析

7 常规逻辑控制
- 常规逻辑控制
- 如果控制器:用来控制测试元素是否运行。
- 循环控制器:可以同计数器,或CSV数据文件设置搭配使用。
- ForEach控制器:与用户自定义变量,或正则表达式提取器搭配使用,读取返回结果中一系列相关的变量。
7-1 如果控制器
- 如果控制器
- JMeter的语法格式:
"${name}"=="name",不勾选Interpret Condition as Variable Expression?。 - 函数格式:勾选
Interpret Condition as Variable Expression?。${__jexl3("${name}"=="name")}。- 注意,这里的
__jexl3是双下划线。
- 示例:使用“用户定义的变量”元件定义一个变量name,依据name值实现对应网站的访问。
- 百度首页:https://www.baidu.com/。
- W3SChools:https://www.w3schools.com/。
- 脚本需要使用到的元件包含:用户定义的变量、如果控制器、HTTP请求、察看结果树。
- JMeter的语法格式:
(1) 定义变量

(2) baidu控制器

(3) w3schools控制器

7-2 循环控制器
- 循环控制器
- 线程组与循环控制器,循环次数的区别。
- 线程组:对线程组下所有的“HTTP请求”都起作用。
- 循环控制器:只对该控制器下的“HTTP请求”起作用。
- 线程组循环次数为M次,循环控制器为N次。
- 循环控制器下的“HTTP请求”循环次数:M*N次。
- 非循环控制器下的“HTTP请求”循环次数:M次。
- 示例:循环访问百度10次,元件包含循环控制器、HTTP请求、察看结果树。
- 线程组与循环控制器,循环次数的区别。
(1) 控制器设置

(2) 察看结果树

7-3 ForEach控制器
- ForEach控制器
- 示例:一组关键字
{"value_1": "C++", "value_2": "Java", "value_3": "Python"}。 - 要求:将这组关键字通过使用“用户定义的变量”元件存储,依次取值并在百度进行索引。
- 元件包含:用户定义的变量、ForEach控制器、HTTP请求、HTTP信息头管理器、察看结果树。
- 示例:一组关键字
(1) 定义变量

(2) 控制器设置

(3) 察看结果树

JMeter 组件
https://stitch-top.github.io/2022/01/05/ce-shi-gong-ju/tt01-jmeter/tt01-jmeter-zu-jian/