Jmeter
参数化、集合点、关联、断言、数据库
属性管理器及逻辑控制器
RESTful架构是一种接口设计架构风格,而不是标准,只是提供了一组设计原则。
- http://:为我们HTTP协议的访问头标准
- 服务器地址:为我们项目服务器IP地址
- 端口号:为我们服务器内项目访问的指定编号
- [/项目名称/版本]:可选
- 资源:互联网-图片、音乐、视频、文本、数据
客户端请求服务求后,服务器响应给客户端的状态码。
序号 | 状态码 | 动词 | 说明 |
---|---|---|---|
01 | 200 OK | [GET] | 服务器成功返回用户请求的数据,该操作是幂等的(Idempotent)幂等:无论执行操作多少次,结果都会执行1次结果相同 |
02 | 201 CREATED | [POST/PUT/PATCH] | 用户新建或修改数据成功 |
03 | 202 Accepted | [*] | 表示一个请求已经进入后台排队(异步任务) |
04 | 204 NO CONTENT | [DELETE] | 用户删除数据成功 |
05 | 400 INVALID REQUEST | [POST/PUT/PATCH] | 用户发出的请求有错误,服务器没有进行新建或修改数据的操作,该操作是幂等的 |
06 | 401 Unauthorized | [*] | 表示用户没有权限(令牌、用户名、密码错误) |
07 | 403 Forbidden | [*] | 表示用户得到授权(与401错误相对),但是访问是被禁止的 |
08 | 404 NOT FOUND | [*] | 用户发出的请求针对的是不存在的记录,服务器没有进行操作,该操作是幂等的 |
09 | 406 Not Acceptable | [GET] | 用户请求的格式不可得(比如用户请求JSON格式,但是只有XML格式) |
10 | 410 Gone | [GET] | 用户请求的资源被永久删除,且不会再得到的 |
11 | 422 Unprocesable entity | [POST/PUT/PATCH] | 当创建一个对象时,发生一个验证错误 |
**12 | 500 INTERNAL SERVER ERROR | [*] | 服务器发生错误,用户将无法判断发出的请求是否成功** |
序号 | 方法 | 预期结果 |
---|---|---|
01 | GET | collection:代码:200;数据:返回资源对象的列表(数组) |
02 | GET | collection/resource:代码:200;数据:返回单个资源对象 |
03 | POST | collection:代码:200/201;数据:返回新生成的资源对象 |
04 | PUT | collection/resource:代码:200/201;数据:返回完整的资源对象 |
05 | DELETE | collection/resource:代码:204;数据:返回为空 |
总结(RESTful)
序号 | 名称 | 值 |
---|---|---|
01 | 定义 | 一种软件架构风格、设计风格,而不是标准 |
02 | RESTful风格 | http://服务器地址:端口号/[服务名]/[版本]/资源集合/单个资源 |
03 | 请求方法 | GET(获取资源);POST(新增资源);PUT(更新资源);DELETE(删除资源) |
04 | 状态码 | GET:200;POST:200/201;PUT:200/201;DELETE:204 |
05 | [JSON] | 是一种轻量级的数据交换格式;JSON是已键/值对组合方式,键名写在前面并用双引号 "" 包裹,使用冒号 : 分隔,然后紧接着值: 1 {"name": "张三","age":18} |
概念:相同类似功能组件的集合称之为元件
1. 逻辑控制器
2. 配置元件
3. 定时器
4. 前置处理器
5. Sampler
6. 后置处理器
7. 断言
8. 监听器
1) CSV Data Set Config
2) HTTP请求默认值
3) HTTP信息头管理器
1) 用户参数
1) Synchronizing Timer
1) HTTP请求
2) JDBC Request
3) Debug Sampler
1) 正则表达式提取器
2) XPath Extractor
1) 响应断言
1) 察看结果树
2) 聚合报告
3) 断言结果
1) 如果(If)控制器
2) ForEach控制器
3) 循环控制器
总结:
正常来说,应该开始按照顺序一个组件一个组件的进行讲解。
问题:每个组件都不能独立执行。都需要多个组件进行配合,才能够解决实际问题。
解决方案:按照JMeter主要解决的问题点来讲解组件。
Jmeter 工具核心知识点
在Jmeter中参数化常用方式:
CSV Data Set Config
用户参数
用户定义的变量
函数
参数配置图
1. Filename:文件路径+文件名+后缀名 如:d:/a.txt;
2. File Encoding:文件编译字符编码,一般设置utf-8;
3. Vaiable Names:读取参数后保存的变量名称;
4. Delimiter:如文件中使用的是逗号分隔,则填写逗号;如使用的是TAB,则填写\t;
CSV Data Set Config-总结:
1. 参数化概念
2. CSV Data Set Config 配置参数设置
3. 参数化引用格式:${参数名} 如:${dep_id}
4. HTTP请求
5. HTTP信息头管理器作用与设置:Content-Type:application/json;charset=utf-8
一种参数设置方式,用户可设置参数名称以及参数值;
用户参数 配置参数图
用户参数-总结:
1. 用户参数位置:测试计划-->线程组-->前置处理器-->用户参数
2. 线程组设置
3. 引用参数化方式:${参数名} 如:${dep_id}
4. 用户参数适合满足少量参数化需求场景使用
用户可根据需求自定义相应的变量,一般做全局变量使用。
分析:
1. 通过概念我们知道,【用户定义的变量】一般做全局变量使用,不适合参数需求量大时的选择
2. 所以在这里我们不在使用,用户定义的变量去做我们学院新增时的解决方案
3. 主要讲解下它做参数化时的使用步骤和方式
效果图
1. 名称:变量名称(参数化引用时使用)
2. 值:变量的值(通过引用变量名称获取的值)
3. Description:备注说明
用户定义的变量-总结:
1. 一般做设置全局变量:用户定义的变量 (测试计划->线程组->配置元件->用户定义的变量)
2. 请求时附带少量参数需求使用
完成某个指定功能代码的封装。
1. 函数查找方式:函数助手对话框
1) 菜单-选项->函数助手对话框
2) Ctrl+Shift+F1
3) 工具栏倒数第二个记事本图标
2. 函数在Jmeter中有非常多类型(计数函数、日期函数、随机函数...)
函数配置图
1. 选择一个功能:选择_counter计数函数
2. 第一个参数:TRUE,每个用户有自己的计数器;FALSE,使用全局计数器 我们选FALSE
3. 点击生成
4. 选择复制生成的函数
使用函数效果图
?num=${__counter(FALSE,)}
1. ?:问号后面一切东东,HTTP请求不做解析
2. num:为我们起的一个计数参数名称
3. ${__counter(FALSE,)}:为我们粘贴进来的函数作为值使用
参数化方式总结
区别
1. CSV Data Set Config: 功能强大、适应各种迭代及多参复杂场景。
2. 用户参数:适应传递少量参数时使用
3. 用户定义的变量:和用户参数使用场景相似,不同在于一般做全局变量使用
4. 函数:功能强大,函数类型繁多,灵活度大,适应各种应用场景。
推荐
1. CSV Data Set Config
2. 函数
操作步骤
1) 添加-数据库驱动
2) 添加-JDBC Connection Configuration(数据库配置连接池)
1) 添加-线程组
2) 添加-JDBC Request
1) 添加-察看结果树
1) 添加-Debug Sampler
1. Variable Name:数据库池名称【JDBC请求时要引用】
2. Database URL:jdbc:sqlite:E:\\课件\\项目\\studentManagementSystem\\db.sqlite3
1) jdbc:sqlite:通过JDBC驱动连接sqlite数据库固定格式
2) E:\\课件\\项目\\studentManagementSystem\\db.sqlite3:数据路径和数据库名
3. JDBC Driver class:org.sqlite.JDBC(sqlite驱动包内sqlite驱动的路径位置)
4. Username:(连接数据库用户名,如实填写,我们项目sqlite数据库用户名默认为空)
5. Password:(数据库密码,如实填写,如果密码为空不写)
JDBC Request 参数:Variable names 设置图
1. Variable Name:数据库连接池的名字,需要与JDBC Connection Configuration的Variable Name【保持一致】
2. Query Type:Select Statement、Update Statement
1) Select Statement:查询语句时使用
2) Update Statement:(新增、更新、删除)语句时使用
3. Query: 填写的sql语句未尾不要加“;”
4. Variable names:count 保存sql语句返回结果的变量名;
1. MySQL驱动包
2. 数据库池配置
1. 127.0.0.1:为数据库服务器IP地址(根据实际项目数据库服务器IP更改)
2. 3306:为数据库端口号(根据项目实际实际数据库端口更改)
3. xst_shop:为数据库名称(根据项目实际数据库名更改)
4. Username:为登陆数据库用户名
5. password: 为登陆数据库密码
6. 其他为固定格式,参照配置图填写
1. Oracle驱动包
2. 数据库池配置
1. 10.245.145.45:为数据库服务器IP地址(根据实际IP地址填写)
2. 1521:为端口号(根据项目端口更改)
3. orcl:为数据库名称(根据实际项目数据库名称填写)
4. Username:为登陆数据库用户名
5. password: 为登陆数据库密码
6. 其他为固定格式,参照配置图填写
概念:从上一条请求中获取数据,使用在下一条请求中的过程。
1. 正则表达式提取器
2. XPath Extractor
概念:根据需求定制规则,返回匹配规则的数据的一种组件
实施方案分析
1. 测试计划->线程组
2. 线程组->HTTP请求(获取title)
3. 获取title->后置处理器->正则表示式提取器
4. 线程组->HTTP请求(使用title)
5. 测试计划->察看结果树
正则表达式提取器配置图
1. 引用名称:下一个请求要引用的参数名称,如填写title,则可用${title}引用它。
2. 正则表达式:制定规则的公式
公式模板:前缀识别()后缀识别
():括起来的部分就是要提取的数据。
1) .:匹配任何字符串。
2) +:一次或多次。
3) ?:在找到第一个匹配项后停止。
4) *:匹配规则内所有字符串
3. 模板:$$格式;$1$表示解析到的第1个值;如果匹配有2个值,第二个值$2$,以此例推
4. 匹配数字:1代表全部取值,0代表随机取值,通常情况下填1
正则表达提取器-总结:
1. 位置
2. 引用名称
3. 正则表达式
4. 模板格式
5. 匹配数字
一种可被用来提取页面给定内容的组件,主要采用的方式为XPath路径
解决方案分析
1. 测试计划->线程组
2. 线程组->HTTP请求(获取title)
3. 获取title->后置处理器->XPath Extractor
4. 线程组->HTTP请求(使用title)
5. 测试计划->察看结果树
实施难点分析
1. XPath 路径
XPath Extractor 配置参数图
1. Use Tidy?:当需要处理的页面是HTML格式时,必须选中该选项。
1) Tidy:一种HTML格式化模板
2. Reference Name:存放提取出的值的参数名称(被引用时使用)。
3. XPath Query:用于提取值的XPath表达式(跟学习WEB自动化使用XPath一样)。
XPath Extractor 总结:
1. XPath表达式
2. Use Tidy
关联-总结:
区别
1. 正则表达式提取器可以用于对页面任何文本的提取,提取的内容是根据正则表达式在页面内容中进行文本匹配;
2. XPath Extractor则可以提取返回页面任意元素的任意属性,如//a[@href="http://tieba.baidu.com"]/@name;
选择
1. 如果需要提取的文本是页面上某元素的属性值,建议使用XPath Extractor;
2. 如果需要提取的文本在页面上的位置不固定,或者不是元素的属性,建议使用正则表达式提取器。
接口测试原理:
请求:是否正确,默认请求成功是200(GET),如果请求错误也能返回404、500等。
检查:返回数据的正确性与完整性
断言常用方式
1) 响应断言
2) Size Assertion(Size 断言)
3) Duration Assertion (持续时间断言)
Jmeter中一种断言组件,可断言响应(信息头内容、主体内容、响应代码)
响应断言配置图-断言代码
1. 响应代码: 只有选择响应代码,Jmeter才去拿预期结果和响应代码去对比
2. 要测试的模式:这里填写我们的预期结果;如:200
响应断言配置图-断言数据
1. 响应文本:只有选择响应文本,Jmeter才去拿预期结果和响应数据去对比
2. 要测试的模式:这里填写我们的预期结果;如:T02
响应断言-总结:
1. 断言概念
2. 断言响应代码
3. 断言响应数据
4. 断言结果作用
作用:主要判断返回数据的大小是否属于预期数据大小范围
(Response Header、Response Body、响应信息)
Size Assertion(Size 断言)配置图
1. Response Body:选择此项判断返回主题数据Body的大小
2. 字节大小:设置要判断数值 单位bytes/kb
3. <:小于符号,说明判断要返回Body主题数据大小小于100kb
作用:断言服务器响应请求的时间是否小于指定值;
断言持续时间配置图
1. 持续时间(毫秒):这里的持续时间为毫秒,比如:10 毫秒。
2. 断言响应时间是否超过设置的值(10),如果超过则断言失败,反之成功。
断言-总结:
作用:
1. 响应断言:断言响应代码/响应数据
2. Size Assertion:断言响应数据大小是否在指定范围
3. 断言持续时间:断言响应数据时间是否在指定时间范围
作用域就是,制定了指定功能的有效作用范围;
在jmeter中,元件的作用域是靠测试计划的树形结构中元件的父子关系来确定;
1. 取样器(sampler)元件内组件不依赖其他元件就可执行,因此取样器不存在作用问题;
2. 逻辑控制器(Logic Controller)元件作用域只对它的子节点有作用;
3. 其他作用域默认根据测试计划中树形结构来定;
1.各元件之间的执行顺
1) 配置元件(config elements)
2) 前置处理程序(Per-processors)
3) 定时器(timers)
4) 取样器(Sampler)
5) 后置处理程序(Post-processors)
6) 断言(Assertions)
7) 监听器(Listeners)
提示
1. 逻辑控制器是个容器,在容器内可添加任意元件内组件,所以它的执行顺序
应该是配置元件、前置处理器程序之后,根据逻辑控制器的位置顺序来执行
2. 如果在同一作用域范围内有多个同一类型的元件,则这些元件按照它们在测试计划中的【上下顺序】依次执行
作用:集合点用以同步虚拟用户,以便恰好在同一时刻执行任务。
解决方案分析
1. 测试计划->线程组
2. 线程组->Sampler->HTTP请求(学院查询-所有)
3. 线程组->Sampler->HTTP请求(学院查询-指定)
4. HTTP请求(学院查询-所有)->定时器->Synchronizing Timer
5. 测试计划->监听器->察看结果树
集合点参数配置图
1. Number of Simulated Users to Group
by:集合多少用户后再执行请求(也就是执行的线程数)
扩展选项:
2. Timeout in milliseconds:超时时间(毫秒)
1) 设置为0,无限等待,直到达到集合点设置的线程数。
2) 设置指定时长,如果到达指定时长,集合点数量未到达,集合多少用户释放多少用户数量。
1. 集合点只对一个请求起作用,如果针对指定请求起作用,放到该请求内;
2. 集合点对多个个请求起作用,放到与请求平级同一层次;
可以被认为是某种特殊的变量,它们可以被采样器或者其他测试元件所引用。
1. 使用函数我们可以1次【批量】的对学院资源进行新增
2. 使用函数我们可以利用函数读取外部数据进行参数化
3. 使用函数我们可以设置指定动态数据的数据为全局变量
1. __CSVRead
2. __counter
3. __Random
4. __time
5. __setProperty
6. __property
以上为我们使用Jmeter测试项目时常用的函数,接下来我们将逐个学习;
1. ${__functionName(var1,var2,var3)}
1) ${} 函数引用固定格式和参数化相同
2) __functionName匹配被调用的函数名称;
3) 用圆括号包含函数的形参,例如${__time(YMD)},不同函数要求的参数也不同;
4) 有些JMeter函数不要求参数,则可以不使用圆括号,例如${__threadNum};
函数助手对话框
作用:对Jmeter中自带函数的参数设置和生成使用
启动方式:
1) 菜单(选项)-->函数助手对话框
2) Ctrl+Shift+F1
3) 工具栏倒数第二个 图标"记事本"
1. 选择一个功能:选择__CSVRead
2. CSV file to get values from | *alias:要读取的文件路径-(绝对路径)
3. CSV文件列号| next| *alias:从第几列开始读取,注意第一列是0
4. 点击生成函数引用格式
5. 全选复制
__CSVRead-总结:
1. 绝对路径
2. 列的开始索引
3. 多行参数使用线程数
作用:这个函数是一个计数器,用于统计函数的使用次数
1. TRUE,每个用户有自己的计数器;FALSE,使用全局计数器:
1) TRUE: 每个用户有自己的计数器,可以用于统计每个线程各执行了多少次
2) FALSE: 使用全局计数器,可以统计出这次测试共运行了多少次用
1. __counter函数作用
2. __counter函数与指定值配合使用 num=${__counter(FALSE,)}
作用:随机生成一个指定范围内的数值
1. 一个范围内的最小值:随机数生成时开始数,也是最小数
2. 一个范围内允许的最大值:随机生成结束数,也是最大数
作用:获取当前电脑日期时间 比如:MMddhhmmss 月/日/时分秒
1. Format string for SimpleDateFormat (optional):
1) 为空:返回毫秒
2) 设置格式:MMddhhmmss 月/日/时/分/秒
操作分析
1. 测试计划-HTTP信息头管理器
2. 测试计划->JDBC Connection Configuration
3. 测试计划->线程组(学院-新增)
4. 线程组->HTTP请求(HTTP请求-学院新增)
5. 线程组->JDBC Request
6. 函数助手对话框->__setProperty函数
7. 线程组->BeanShell Sampler
8. 线程组->Debug Sampler
9. 测试计划->察看结果树
10. 工作台->Property Display
技术难点分析
1. __setProperty函数参数设置
2. BeanShell Sampler作用
3. JDBC Request SQL语句
4. 如何知道设置的属性(全局变量)成功了
1. 属性名称:要设置的属性名称也就是全局变量名
2. Value of property:属性的值(全局变量的值)
作用:可执行JavaScript的一种容器
作用:显示Jmeter工具中的属性
1. __setProperty作用
2. 如何查看Jmeter已有的属性
作用:获取Jmeter中属性值
1. 选中案例5中测试计划-独立运行每个线程组选项
2. 基于案例5中测试计划->线程组(线程组-读取depid属性)
3. 线程组(线程组-读取depid属性)->HTTP请求(HTTP请求-读取depid属性)
4. 函数助手对话框-__property函数
1. __property函数参数设置
1. Name of variable in which to store the result (optional):获取属性的名称
1. __CSVRead
2. __counter
3. __Random
4. __time
5. __setProperty
6. __property
概念:由多台电脑共同完成同一1个任务(请求)部署,我们称这种部署为分布式部署
1. 一台电脑作为控制机(Controller),其它电脑做为执行机(Agent);
2. 执行时,控制机会把脚本发送到每台执行机上,执行机拿到脚本后就开始执行
3. 执行机执行时不需要启动Jmeter界面,可以理解它是通过命令行模式执行的
4. 执行完成后,执行机会把结果回传给控制机,控制机会收集所有执行机的信息并汇总
1. 1台电脑(控制机)分发执行任务
2. 2台电脑(执行机)执行任务
3. 在执行机上启动监听服务程序
4. 在控制机上启动运行
5. 测试计划->聚合报告
1. 执行机-jmeter.properties设置
2. 控制机jmeter.properties设置
3. 执行机启动分布式监听服务程序
3. 2台执行机,用户数如何设置
1. 打开bin目录下jmeter.properties配置文件
2. server_port=1099
1) 1099:为执行机自定义端口号
3. 提示:
1) 去除备注符号 #
2) 自定义端口号时,注意选择未必占用端口号
1. remote_hosts=127.0.0.1:1099,127.0.0.1:1100
1) remote_hosts:为执行机IP地址和端口号
2. 注意:
1) 多个执行机之间使用逗号(,)隔开
执行机启动分布式监听程序效果图
1. 运行bin目录下jmeter-server.bat
2. 运行后勿关闭黑色窗口
1. 需求1000用户,两台执行机同时接受控制机脚本去执行然后反馈给控制机,所以线程数设置500
1. 菜单-运行->选择全部启动
2. 快捷键->Ctrl+Shift+R
聚合报告
这里先不做讲解,我们只看# Samples属性,查看统计取样数量
提示
1. 修改完端口要重启Jmeter.bat
2. 控制机和执行机分开(为了方便教学,这里采用控制机和代理机在1台机器上)
1). 由于控制机需要发送信息给执行机并且会接受执行机回传的测试数据所以控制机自身会有消耗
3. 参数文件:如果使用csv进行参数化,那么需要把参数文件在每台执行机上拷一份且路径需要设置成一样的;
4. 每台机器上安装的Jmeter版本和插件最好都一致,否则会出一些意外的问题;
5. 执行机上Jmeter也许需要配置JDK环境变量;
分布式-总结
1. 分布式概念
2. 分布式原理
3. 执行机配置文件设置
4. 控制机配置文件设置
5. 控制机线程数设置
概念:Jmeter逻辑控制器是可以控制采样器(Sampler)的执行顺序,它由多个逻辑控制语句封装成不同功能的组件组成
逻辑控制器作用域
作用域:只对其子节点的sampler有效。
1. 如果(If)控制器
2. ForEach控制器
3. 循环控制器
作用:条件成真,则执行控制器下所有取样器
1. 测试计划->线程组
1. 测试计划->用户自定义变量
2. 线程组->如果(If)控制器
3. 如果(If)控制器->HTTP请求
4. 测试计划-察看结果树
如果(If)控制器 参数设置
1. 条件:"${name}"=="百度"
2. 注意:
1) 引用变量格式${name}需要被双引号括起来
2) 两个等号
3) 值需要被双引号括起来
作用:ForEach控制器一般和用户定义的变量一起使用,在用户自定义变量中读取一系列相关的变量。
使用ForEach组件读取自定义变量,作为请求(查询学院-所有)的user变量值使用
1. 测试计划->线程组
2. 线程组->用户定义的变量
3. 线程组->ForEach控制器
4. ForEach控制器->HTTP请求
5. 测试计划->察看结果树
1. ForEach控制器参数设置
2. 用户定义的变量书写格式(前缀+_+数字)
1. 输入前缀变量:输入要遍历变量前缀
2. Start index for loop(exclusive):遍历变量开始的索引(从0开始)
3. End index for loop(inclusive):遍历变量结束的索引(不包括结束索引)
4. 输出变量名称:定义要被引用的变量名称
1. 作用
2. 使用ForEach读取用户定义的变量时,变量格式
3. ForEach参数设置
作用:指定循环控制器内取样器的执行次数
使用循环控制器执行(查询学院-所有)接口10次
1. 测试计划->线程组
2. 线程组->循环控制器
3. 循环控制器->HTTP请求(查询学院-所有)
4. 测试计划->察看结果树
1. 循环次数:要执行的次数