性能测试之Jmeter元件
性能测试之Jmeter元件
1.性能测试的本质
性能测试的定义
- 基于协议模拟用户发请求,对服务器形成一定的负载,来测试服务器的性能指标是否满足用户(产品&公司)的需求。
关注点
- 时间性能
- 空间性能
与界面无关
2.性能测试分类
负载测试
- 在需要测试的系统上面,不断施加压力,一直到性能指标达到极限。如:响应时间超过预定指标。如:CPU超过预定的指标。如:内存超过预定指标。
性能测试
- 特定的状态下,测试系统的状态。如:特定的时间中午12左右。晚上10点左右。
压力测试
- 被测试的系统在一定的饱和状态下。如:CPU,内存和使用情况下。系统能够处理的能力,以及系统是否会出现BUG或者缺陷。
并发测试
- 模拟用户访问,多用户并发访问(或同一时间段)同一个系统(同一模块)是否出现性能问题。
可靠性测试
- 系统加载到一定的压力下,持续运行一段时间,以此测试系统的稳定性。
3.性能测试指标
- 响应时间
- 并发(并发数,并发用户数)
- TPS(每秒处理通过的事物数)
- 吞吐量/吞吐率(事务/s, Kb/s)
- 资源利用率: cpu利用率(不允许超过80%;队列长度),内存利用率(80%;页交换频率),带宽利用率
PS:具体的还是按照公司的性能测试指标去做的,因为每家公司的指标都不一样,SO这里我就不多做解释了!!!
4.性能测试工具
- loadrunner
特点
1.工业化的性能测试工具,能支持大量用户,提供详细的报表来提供测试分析的数据
2.支持的协议多
3.使用c语言来编写的优点
1.支持用户量大(以万为单位)
2.提供精确的报表
3.支持IP欺骗缺点
1.收费
2.体积大
3.无法控制
- jmeter
优点
1.开源免费
2.体积小
3.有丰富的第三方插件缺点
1.不支持IP欺骗
2.报表的精度比loadrunner差
jmeter元件及基本作用域
基本元件
- 线程组: 模拟用户的
- 配置元件: 进行测试环境与测试数据的初始化. 类似于自动化脚本中的SetUp
- 前置处理器: 对要发送的请求预处理. 类似于自动化脚本中的参数化
- 取样器: 往服务器发送请求. 类似于自动化脚本中的发送请求的代码
- 后置处理器: 对收到的服务器的响应进行数据提取. 类似于自动化脚本中获取响应中特定字段的语句
- 断言: 将收到的响应结果与预期结果做对比. 类似于自动化脚本中的断言
- 监听器: 查看测试脚本运行的结果和日志 类似于自动化脚本中的测试报告
- 定时器: 等待一段时间. 类似于自动化脚本中的sleep
- 测试片段: 封装基本功能,不能单独执行,需要通过脚本调用才能执行. 类似于自动化脚本中封装的函数
元件作用域
- 核心: 根据测试计划中的树形结果的福子节点来确定的
- 原则
- 取样器是没有作用域的
- 逻辑控制器: 只针对其子节点下的所有元件有效
其他元件
如果其父节点是取样器,只针对父节点(取样器)有效
如果其父节点是非取样器,针对父节点下的所有子节点及节点的子节点有效
3.元件执行顺序
1.顺序: 配置元件,前置处理器,定时器,取样器,后置处理器,断言,监听器
2.注意:
1.配置元件,前置处理器,后置处理器都需要依赖取样器才能执行
2.在同一个作用域下,相同类型元件的执行顺序是从上到下顺序执行
jmeter线程组的特点
介绍: 通过配置线程组中的线程数来模拟用户. 线程数是用户数,线程组就是用户组
特点:
- 模拟多用户
- 取样器和逻辑控制器必须在线程组下使用
- 一个测试计划可以添加多个线程组,他们可以并行或者串行执行
- 并行: 默认情况下线程组为并行执行
- 串行: 在测试计划下勾选"独立运行每个线程组"
线程组的分类
- 线程组: 用于执行业务测试的脚本
- SetUp线程组: 测试前的预处理操作,在所有的线程组中最先执行
- TearDown线程组: 测试后的后置处理(恢复环境,数据)的操作,在所有的线程组中最后执行
线程组参数详解
- 线程数: 模拟虚拟用户数
- Ramp-up时间: 虚拟用户启动所需要的时间(性能测试)
- 循环次数:
- 配置指定次数: 控制脚本循环执行次数
- 配置循环永久
1.需要调度器配合使用
2.运行时间: 脚本执行时间
3.延迟启动时间: 脚本等待特定的时间才能开始运行
线程数m和循环次数n的关系
- 如果同时配置,实际发送的HTTP请求数应该为m * n
- 虽然发送请求次数相同,但不能相互替换
1.线程数: 代表并发用户数,提现服务器的负载量
2.循环次数: 代表执行时间
jmeter取样器
HTTP请求(取样器):
- http协议: 可以填写为HTTP或者HTTPS,莫特热闹不填写时为HTTP协议
- http主机名/IP
- 端口(http用80,https用443): 可以填任意值,默认不填写时为80端口
- 请求方法: HTTP协议支持的所有方法
- 路径: 目录+参数
- 编码格式: 默认IOS国际标准,推荐使用utf-8
察看结果树(监听器)
- 取样器结果: 统计请求相关信息
- 请求: HTTP请求的请求头和请求体的详细信息
- 响应: HTTP响应的响应头和响应体的详细信息
http请求默认值(配置元件)
- 测试类似API或网址时可以设置公用的参数
http信息头管理器(配置元件)
- 用于新增数据,往数据库添加新的数据
- 点击’添加’: 名称 Content-Type; 值 application/json:charset=utf-8
jmeter响应中文乱码的处理
- 修改jmeter.properties文件中,sampleresult.default.encoding=utf-8
- .重启jmeter
Jmeter参数化
- JMeter参数化常用方式
- 用户定义的变量
- 用户参数
- CSV Data Set Config
- 函数
- 用户定义的变量(作用域不同)
- 方式1:
- 添加: 线程组 -> 配置元件 -> 用户定义的变量
- 配置: 参数名 + 参数值
- 使用: 在HTTP请求的取样器中引用定义的变量. ${参数名}
- 方式2:
- 配置: 在测试计划中配置用户定义的变量
- 使用: 在HTTP请求的取样器中引用定义的变量. ${参数名}
- 用户参数
- 添加: 线程组 -> 前置处理器 -> 用户参数
- 配置:
- 参数: 添加变量
- 参数值: 添加用户 – 针对每个用户配置不同的参数值
- 使用: 在HTTP请求的取样器中引用定义的变量. ${参数名}
- CSV数据文件配置
- 添加: 线程组 -> 配置文件 -> CSV数据文件设置
- 编写CSV数据文件(.csv作为后缀)
- 多个参数写为多列,其中用逗号分割
- 多组参数值,则使用多行来设置
- 配置:
- 文件名: 填写CSV文件的路径,建议使用相对路径
- 文件编码: UTF-8
- 变量名称: 从CSV数据文件中读取的数据需要保存的变量名,有多个变量时用逗号分隔
- 是否忽略首行: 是否从CSV数据文件第一行开始读取
- 分隔符: 要求与CSV数据文件中多列的分隔符一致
- 遇到文件结束符是否再次循环: 默认TRUE
- 遇到文件结束符是否停止线程: 当前一个参数为FALSE,该参数有效,一般设置为TRUE
- 函数
- counter:
- TRUE: 每个用户使用独立的计数器
- FALSE: 所有用户使用全局的计数器
- 引用: 在取样器中使用${__counter(FALSE,)}来引用对应的值
- 应用场景: 当需要参数化的数据只有唯一性要求,但是对具体的参数值无明确要求时,建议使用函数方式
- random:
- 随机数函数: 生成用户名称
- time
- 生成一组数字: 时间戳–19700000到现在的时间换算成毫秒
- 在函数助手可设置固定的时间戳: Format string for SimpleDateFormat (optional):yyyy-MM-dd hh:mm:ss
- counter:
- 方式1:
JMeter断言
- 作用: 让脚本自动化执行的过程中,能够自动的判定执行结果是否正确,需要添加断言
- 常用断言类型
- 响应断言
- JSON断言
- 持续时间断言
- 大小断言
- 响应断言
- 添加: 线程组 -> HTTP请求 -> 断言 -> 响应断言
- 配置:
- 测试字段: 需要检查的字段
- 模式匹配规则: 需要使用什么规则来进行检查且, 或者, 非
- 测试模式: 需要校验的值
- 填写多个值
- JSON断言
- 添加: 线程组 -> HTTP请求 -> 断言 -> JSON
- 适用于返回的HTTP响应为JSON格式
- 配置
- JSON PATH: $.weather.city
- 勾选"Additional assert value"
- 在expected value里填写期望值
- 断言持续
- 适用于性能测试时候,检查HTTP请求响应时间是否超过预期
- 添加: 线程组 -> HTTP请求 -> 断言 -> 断言持续时间
- 配置: 预期时间
- 大小断言
- 响应代码: 比如200 代表2,0,0三个字符,需要写3,不能写200
关联和提取器
- 当多个请求之间有依赖关系,后一个请求的参数需要使用前一个请求的相应数据时,需要用到关联
- 分类: 正则表达式提取器;xpath提取器;JSON提取器
- 正则表达式:
- 添加: 线程组 - HTTP请求 - 后置处理器 -正则表达式
- 配置:
- 要检查的响应字段: 默认主体
- 引用名称: 匹配后的数据要存储的变量名
- 正则表达式: (.*?) ()里是要保存的数据
- 模板: 111
- 数字1代表上面正则表达式中第几个()
- 匹配数据: 0代表随机值, 1代表第一个结果, -1代表所有结果
- 缺省值: 当没有匹配上时将该值保存到变量里
- 引用:
- 如果匹配数字为1,则直接使用变量名来使用: $(变量名)
- 如果匹配数字为-1,则使用变量名+后置的方式来引用: $(变量名_s)
- Xpath提取器
- 添加: 线程组 – HTTP请求 – 后置处理器 – xpath提取器
- 配置
- 引用名称: 匹配后的数据要存储的变量名
- xpath_xpath: xpath匹配规则
- 匹配数字: 1代表第一个结果, -1代表所有结果, 0表示随机
- 缺省值: 当没有匹配上时将改制保存到变量里
- JSON提取器
- 添加: 线程组 – HTTP请求 – 后置处理器 – JSON提取器
- 配置
- 引用名称: 匹配后的数据要存储的变量名
- JSON path: json路径. $.weatherinfo.city
- 引用: 直接引用变量名即可
- 跨越线程组传值(线程组1,线程组2)
- 在线程组1里: 点击函数助手–选取函数setProperty – 设置参数(属性名称(该函数名称),Value of property(${其他提供的属性名称})) – 生成,复制
- 在线程组1里: 取样器 – BeanShell取样器 – 粘贴
- 在线程组2里: 函数助手 – property --属性名称(该函数名称) – 生成,复制
- 在线程组2里: 放到用到的地方
JMeter直连数据库
- 连接准备
- 打开数据库,确定数据库的表及对应的字段
- 加载mysql的jdbc驱动
- 将jdbc驱动通过测试计划,浏览的方式添加
- 将jdbc驱动jar包放入到lib\ext目录下,并重启jmeter
- 配置jdbc connection configuration
- created pool name: 给连接池命名,用于后续引用
- 数据库url: jdbc:mysql://127.0.0.1:3306/tpshop2.0
- 用户名
- 密码
- 直连数据库使用:
- 添加JDBC Request: 在取样器下添加
- 配置
- 配置连接池的名称
- 配置SQL语句
- 配置保存的变量名
- 如果SQL语句返回了多个参数,输入相同个数的变量名来保存
- HTTP断言中,就可以引用变量来进行判断
JMeter逻辑控制器
- 控制元件的执行顺序
- IF控制器
- 添加: 线程组 – 逻辑控制器 – if控制器
- 配置:
- 使用JS语法: “${name}” == “百度”
- 使用JMeter函数的方式: KaTeX parse error: Expected group after '_' at position 2: {_̲_jexl3("{name}" == ‘baidu’,)}
- 推荐使用函数方式
- 循环控制器
- 指定HTTP请求执行特定的次数
- 添加: 线程组 – 逻辑控制器 – 循环控制器
- 配置: 指定次数
- 循环控制器中的循环次数配置m与线程组中的循环次数配置n对比:
- 关系: 如果同时配置,循环控制器下HTTP请求实际的执行次数应该是m*n
- 区别: 这两个循环次数作用域不同
- 线程组的循环次数针对整个测试计划
- 循环控制器的循环系数只做用于循环控制器下的请求
- ForEach控制器
- 与用户定义的变量或者与正则表达式提取器配合使用,循环读取返回的变量中的值,执行一次或者多次
- 与用户定义的变量配合使用
- 添加: 线程组 – 逻辑控制器 – ForEach控制器
- 配置:
- 用户定义的变量
- 变量名: 固定前缀+连续数字
- ForEach控制器
- 变量的前缀: 用户定义的变量中配置的固定前缀
- 起始数字: 连续数字的最小值-1
- 结束数字: 连续数字的最大值
- 输出的变量名称: 依次读取变量值后存储到参数中,供HTTP请求来引用
- HTTP请求
- 引用输出的变量名称
- 与正则表达式配合使用
- 先通过正则表达式提取器,提取出请求中所有满足条件的数据
- 添加ForEach控制器,并配置提取所有满足条件的数据,并保存为变量
- 在其子节点下,添加HTTP请求并引用变量,即可循环读取正则表达式中匹配的所有数据
- 配置:
JMeter定时器
- 同步定时器[集合点(loadrunner)]高并发
- 当需要进行大量用户的并发测试时,为了让用户能真正的同时执行,添加同步定时器,用户阻塞线程,直到线程数达到预先配置的数值,才开始执行取样器的操作
- 配置:
- 模拟用户组的数量(并发数): 同时达到多少用户才开始发送请求
- 超时时间:
- 必须配置: 否则当虚拟用户数无法被并发数整除时,就会有部分的用户挂起无法执行
- 配置不能太短: 必须比并发数加载的时间要长.否则无法达到并发数的要求,数据就会被释放掉
- 常数吞吐定时器(高频率)
- 用于性能测试时模拟用户产生的业务压力,通过指定QPS来对服务器发送固定频率的请求
- 添加: 线程组 – HTTP取样器 – 常数吞吐量定时器
- 配置: 吞吐量的值: QPS * 60
JMeter分布式
- 应用场景: 当测试机无法模拟用户需要的业务负载时,需要使用多台测试机配合使用
- 原理:
- 分布式测试时分为一台控制机和多台代理机
- 控制机负责发布测试任务给代理机
- 代理机接受任务并向服务器发送请求,并接受服务器返回的响应,然后将测试结果返回给控制机
- 由控制机对测试结果数据进行汇总统计
- 注意事项:
- 所有的测试机防火墙都已经关闭
- 所有的测试机及服务器在同一个网络内
- 所有的测试机的JMeter版本和JDK版本完全相同
- 关闭JMeter里的RMI.SSL开关
- 分布式配置:
- 配置:
- 代理机:
- server_port: 不重复.如果使用多台机器做代理机,可不用配置
- 关闭RMI.SSL
- 控制机
- emote_server: 所有代理机的IP+port,有多台代理机时用逗号分隔
- 关闭RMI.SSL
- 运行
- 代理机: jmeter-server.bat运行
- 控制机:
- jmeter.bat运行
- 控制代理机执行脚本: 运行 - 远程启动所有
- 配置:
Jmeter报告
生成HTML报告
在cmd中输入
- jmeter -n -t 脚本文件 -l 日志文件 -e -o 目录
- -n: 无图形化运行
- -t: 被运行的脚本
- -l: 将运行信息写入日志文件(日志文件必须为空或者不存在)
- -e: 生成测试报告
- -o: 指定报告输出目录(目录不存在或者为空)
jmeter -n -t xxx.jmx -l xxx.jtl
jmeter -g xxx.jtl -o [空文件夹]
参数解析
- -n:非GUI模式执行JMeter
- -t: 执行测试文件所在的位置
- -l: 指定生产测试结果的保存文件, jtl文件格式
- -e: 测试结束后,生成测试报告
- -o: 指定测试报告的存放位置
- -g: 指定已存在的测试结果文件
聚合报告
- Label:每个 JMeter 的 element(例如 HTTP Request)都有一个 Name 属性,这里显示的就是 Name 属性的值
- Samples:表示你这次测试中一共发出了多少个请求,如果模拟10个用户,每个用户迭代10次,那么这里显示100
- Average:平均响应时间——默认情况下是单个 Request 的平均响应时间,当使用了 Transaction Controller 时,也可以以Transaction 为单位显示平均响应时间
- Median:中位数,也就是 50% 用户的响应时间
- 90% Line:90% 用户的响应时间
- Min:最小响应时间
- Max:最大响应时间
- Error%:本次测试中出现错误的请求的数量/请求的总数
- Throughput:吞吐量——默认情况下表示每秒完成的请求数(Request per Second),当使用了 Transaction Controller 时,也可以表示类似 LoadRunner 的 Transaction per Second 数
- KB/Sec:每秒从服务器端接收到的数据量,相当于LoadRunner中的Throughput/Sec
- Label: 请求的名称,就是我们在进行测试的httprequest sampler的名称
- Samples:总共发给服务器的请求数量,如果模拟10个用户,每个用户迭代10次,那么总的请求数为:10*10 =100次;
- Average:默认情况下是单个 Request 的平均响应时间,当使用了 Transaction Controller 时,以Transaction 为单位显示平均响应时间 ,单位是毫秒
- Median: 50%用户的请求的响应时间,中位数
PS:下篇文章再讲 loadrunner 吧。今天眼睛有点疼了
性能测试之Jmeter元件相关推荐
- 性能测试之JMeter配置元件【HTTP信息头管理器】
JMeter提供了丰富的配置元件,常用的包括参数化配置元件.HTTP请求默认值.HTTP信息头管理器.计数器等,这些配置元件用于设置默认值和变量,提供给后面的sampler(取样器)使用. 提示:本文 ...
- 性能测试之JMeter配置元件【计数器】
1.计数器介绍 如果需要引用的数据量较大,且要求不能重复或者需要自增,那么可以使用计数器组件来实现. 计数器组件中的数据,允许在一个线程组之内都可以被引用. 2.计数器界面详解 添加计数器组件的操作: ...
- 性能测试之JMeter配置元件【随机变量】
1.随机变量介绍 随机变量应用场景:在一些数据要求不重复,或者对数据取值需要正态分布的时候,我们可以采用随机变量组件来满足需求. 随机变量与用户自定义变量的区别: 随机变量(random variab ...
- 性能测试之JMeter函数助手详解
1.函数助手介绍 在性能测试过程中,为了模拟真实的用户,往往我们需要让提交的表单内容每次都发生变化,这个过程叫做参数化. JMeter中的配置元件与前置处理器都能帮助我们实现参数化,为了能够更好的帮助 ...
- jmeter 线程执行顺序_性能测试之jmeter逻辑控制种类详解一
逻辑控制器介绍 Jmeter逻辑控制可以对元件的执行逻辑进行控制,除Once only Controller仅一次控制器以外,其他控制器都可以可以嵌套其他种类的控制器,下面是jmeter5.3支持的控 ...
- 性能测试之JMeter主页面布局
在介绍JMeter主页面布局的菜单栏和图标之前,我们可以把语言切换为简体中文,如下图所示: JMeter的主界面布局分为标题栏.菜单栏.工具栏.树形标签栏和内容栏,如下图所示: 接下来我们来逐一说明. ...
- 性能测试之JMeter取样器详解:sampler
1.取样器介绍 取样器是用来模拟用户操作的,向服务器发送请求以及接收服务器的响应数据. 取样器是在线程组内部的元件,也就是说取样器只能在线程组中添加. 取样器(Sampler)是性能测试中向服务器发送 ...
- 性能测试之JMeter测试结果写入Excel
在使用JMeter进行测试的过程中,有时候需要将测试结果写入到Excel文件,本篇文章将详细说明具体步骤. 把测试结果写入Excel文件中操作思路分析: (1)准备需要的环境 引入操作Excel文件的 ...
- 性能测试之Jmeter 中 CSV 如何参数化测试数据并实现自动断言
当我们使用Jmeter工具进行接口测试,可利用CSV Data Set Config配置元件,对测试数据进行参数化,循环读取csv文档中每一行测试用例数据,来实现接口自动化.此种情况下,很多测试工程师 ...
最新文章
- Pinpoint 插件开发
- wdlinux 安装apc扩展
- Qt5应用改变窗口大小时出现黑影
- Linux内核中ioremap映射的透彻理解
- 2016年全国计算机技术与软件,2016年的上半年的全国计算机技术与软件专业技术资格(水平)考.doc...
- lisp 读取dwg 统计信息_预制梁厂 BIM 技术和自动化、信息化应用方案
- 间接寻址级别不同_被遗忘的利息税,国债与存款的利率区别,同大额存单的4点大不同...
- 全面解析Oracle等待事件的分类、发现及优化
- MLN Alchemy
- Eprime error number 1234 :unable to load sound 203
- SpringData JPA(一)——什么是SpringData JPA
- 关于计算机固态硬盘正确的是,如何对固态硬盘进行初始化?选择合适的格式及分区结构很重要...
- 用latex写英文论文
- androidのBack返回键,home键,menu键监听使用
- Freebase调研(持续更新中)
- protobuf中repeated类型变量与C++ vector类型变量的相互赋值方法
- mysql如何导入生僻字_MySQL插入生僻字失败的处理方法(图)
- 嘿!大三了怎么找到对象?膜拜!
- egg.js 使用笔记
- 东北师范大学计算机大一操作题,东北师范大学计算机应用基础答案