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/