JMeter 组件

🍕 JMeter是Apche公司使用Java平台开发的测试工具,用于接口测试、性能测试、压力测试、数据库测试、Java程序测试。

1 工具安装

  • 工具安装
    • Win10 1709秋季创意者更新64位正式版(零售版):Win10-1709-Chinese(Simplified)-x64.iso(迅雷下载)
    • 环境依赖:JDK-1.8-Win-x64.zip,命令窗口下java -versionjavajavac验证。
      • 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(核心元件帮助文档)。

工具安装-目录介绍

1-2 永久汉化

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

工具安装-永久汉化

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表单格式,可在参数列表中添加。
    • 示例:编写脚本访问百度。
      • URL=http://www.baidu.com/S,参数wd=test(form表单)。
      • JMeter脚本需使用到的元件包含:HTTP请求、察看结果树。
      • 案例1:GET请求,路径传递参数。
      • 案例2:GET请求,参数列表传递参数。
      • 案例3:POST请求,参数列表传递参数。
      • 案例4:POST请求,请求体数据传递参数。

2-1 路径传参

HTTP请求-路径传参

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

HTTP请求-参数列表传参(GET)

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

HTTP请求-参数列表传参(POST)

2-4 请求体数据传参

HTTP请求-请求体数据传参

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行数据,脚本运行时,将如下循环往复取值。
      • 所有线程:如果脚本有多个线程组,在这种模式下,各线程组的所有线程也要依次唯一顺序取值。
        参数化设置-CSV数据文件设置-线程共享模式-所有线程
      • 当前线程组:各个线程组之间隔离,线程组内的线程顺序唯一取值。
        参数化设置-CSV数据文件设置-线程共享模式-当前线程组
      • 当前线程:每个线程独立,顺序唯一取值。
        参数化设置-CSV数据文件设置-线程共享模式-当前线程
    • 示例:实现禅道批量用户登录,需使用到的元件包含HTTP请求、CSV数据文件设置、察看结果树。

(1) userinfo.txt

参数化设置-CSV数据文件设置-userinfo.txt

(2) 设置CSV数据文件

参数化设置-CSV数据文件设置-设置CSV数据文件

(3) HTTP请求参数配置

参数化设置-CSV数据文件设置-HTTP请求参数配置

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

参数化设置-CSV数据文件设置-察看结果树分析

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.properties

常用的断言-响应断言-解决乱码-jmeter.properties

✧ HTTP信息头管理器

常用的断言-响应断言-解决乱码-HTTP信息头管理器

✧ BeanShell后置处理程序

常用的断言-响应断言-解决乱码-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}]}
    • JSONPath
      • 可方便地从JSON数据结构中发现和提取数据,无论对象(Object)还是数组(Array),“根成员对象”总被称为$
      • 表达式有dot–notation(.号)和bracket–notation([]号)两种不同表示风格,如$.A[0].a$['A'][0]['a']
    • 示例:天气查询(https://www.free-api.com/doc/319)。
      • 检查响应数据中的city是否为当地城市,例如当前所在的城市是厦门。
      • JMeter脚本需使用到的元件包含HTTP请求、JSON断言、察看结果树。

(1) HTTP请求

常用的断言-JSON断言-HTTP请求

(2) 断言配置

常用的断言-JSON断言-断言配置

(3) 察看结果树

常用的断言-JSON断言-察看结果树

4-3 断言持续时间

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

(1) HTTP请求

常用的断言-断言持续时间-HTTP请求

(2) 持续时间设置

常用的断言-断言持续时间-持续时间设置

(3) 察看结果分析

常用的断言-断言持续时间-察看结果分析

5 JMeter关联

  • JMeter关联
    • JSON提取法:针对JSON格式的响应结果数据进行提取。
    • XPath提取法:根据HTML格式的响应结果数据进行提取。
    • 正则表达式提取法:根据正则表达式对响应结果数据进行提取。
    • 提取器功能:提取响应结果内容,实现从上一个返回体中获取下一个请求体中需要的数据。

5-1 JSON提取器

  • JSON提取器

(1) 天气查询

JMeter关联-JSON提取器-天气查询

(2) 提取器设置

JMeter关联-JSON提取器-提取器设置-设置

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

JMeter关联-JSON提取器-提取器设置-关联百度搜索

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

JMeter关联-JSON提取器-提取器设置-HTTP信息头管理器

(3) 察看结果树

JMeter关联-JSON提取器-察看结果树

5-2 XPath提取器

  • XPath提取器
    • 示例:提取W3Schools首页的title,作为参数在访问百度首页时传递。

(1) W3Schools

JMeter关联-XPath提取器-W3Schools

(2) 提取器设置

JMeter关联-XPath提取器-提取器设置

(3) 察看结果树

JMeter关联-XPath提取器-察看结果树

5-3 正则表达式提取器

  • 正则表达式提取器
    • 示例:提取W3Schools首页的title,作为参数在访问百度首页时传递。

(1) 提取器设置

JMeter关联-正则表达式提取器-提取器设置

(2) 察看结果树

JMeter关联-正则表达式提取器-察看结果树

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) 保存属性值

JMeter关联-不同线程组的关联-保存属性值

(2) 读取传递值

JMeter关联-不同线程组的关联-读取传递值

(3) 独立运行线程组

JMeter关联-不同线程组的关联-独立运行线程组

(4) 察看结果树分析

JMeter关联-不同线程组的关联-察看结果树分析

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请求、察看结果树。

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
    • 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:端口:SIDoracle.jdbc.OracleDriver

数据库的连接-JDBC连接配置

6-3 JDBC请求设置

数据库的连接-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值实现对应网站的访问。

(1) 定义变量

常规逻辑控制-如果控制器-定义变量

(2) baidu控制器

常规逻辑控制-如果控制器-baidu控制器

(3) w3schools控制器

常规逻辑控制-如果控制器-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) 定义变量

常规逻辑控制-ForEach控制器-定义变量

(2) 控制器设置

常规逻辑控制-ForEach控制器-控制器设置

(3) 察看结果树

常规逻辑控制-ForEach控制器-察看结果树


JMeter 组件
https://stitch-top.github.io/2022/01/05/ce-shi-gong-ju/tt01-jmeter/tt01-jmeter-zu-jian/
作者
Dr.626
发布于
2022年1月5日 23:33:27
许可协议