Jmeter工具脚本编写和参数化
1、Jmeter工具的不同控件的功能
在性能测试中,会用到以下一些控件,简单梳理下:
(1)线程组:
- setup线程组、teardown线程组、普通线程组、其他插件线程组
(2)取样器
- 根据不同的协议选择不同的取样器
- http取样器用的最多
- jdbc请求链接数据库
- 调试取样器
- 其他插件引入的取样器
(3)逻辑控制器
- 控制脚本运行逻辑的,如循环和判断等
(4)前置处理器
- 取样器执行之前运行的元件,如:用户参数
(5)后置处理器
- 取样器执行之后,对数据处理的元件,如:json提取器、正则提取器等
(6)断言
- 用于给接口请求做结果判断的,判断是否复合预期,在功能测试中,用的最多
(7)定时器
- 控制脚本运行节奏,如:控制某个请求延迟发送请求
(8)配置元件
- 脚本的公共信息,优先级最高,运行时是最先运行的
- 如:信息头管理器、用户定义变量的
(9)监听器
- 从不同的维度,展示测试结果
- 查看结果树、聚合报告等
2、Jmeter工具编写脚本步骤
在性能测试之前,使用jmeter工具先编写脚本,确保脚本运行正常,具体步骤如下:
(1)分析项目接口需求文档
接口文档一般是开发提供的,如果没有提供,需要自己抓包后找开发进行确认
接口的五大要素:
请求消息:客户端向服务器发送的请求消息,包含:
* 请求地址
* 请求方法
* 请求参数
* 请求头部
响应消息:服务器收到请求后处理回复的响应信息:
* 响应头:响应状态码
* 响应体:响应正文
(2)jmeter工具添加线程组
右键添加线程组,默认setup线程组 》 普通线程组 》teardown线程组
(3)在线程组中,添加取样器
线程组上右键,添加取样器—HTTP取样器
- 协议:默认HTTP协议,可省略不写,其他协议,需要写上去
- 服务器或IP:项目服务器IP或者域名
- 端口:项目端口,默认80,根据项目来定
- 请求方法:选择对应请求方法,如post、get、put、delete等
- 路径:接口地址
- 编码:针对请求消息的编码,当请求内容又中文或者其他字符,可以设置utf8来支持中文字符
- 请求体:根据请求来设置不同格式
# 编码
* 当请求参数是json格式,含有中文字符或特殊字符时,需要配置编码为utf8
* 或者在请求头里配置:content-type:application/json,charset=utf8
* 当请求参数为表单数据时,需要勾选参数列表中的编码,是对参数进行urlencode编码,否正会出现乱码,一般默认勾选
# 请求体
* 当接口请求体为json或者xml时,需要将请求头写在消息体数据中
* 请求头参数值的类型是数字时,值没有双引号
* 当接口参数是表单格式,请求头就写在【参数】中,
* 表单数据的值没有类型之分,所以字符串也不需要加引号,因为这个值都是跟着URL地址后面,会进行urlencode编码,都是文本
(4)配置消息头
配置元件—消息头管理器
如果是json消息体数据,必须要加上消息头content-type:application/json
application/json:json数据,请求头为json的一定要配置这个消息头
application/x-www-form-urlencoded:表单数据,可以不加content-type
form-data:post方法提交表单数据,可以不加content-type请求头
(5)添加查看结果树
线程组右键添加监听器----查看结果树
- 查看结果树的检查
红色:仅代码网络请求失败,响应状态码4xx/5xxx
4xx:客户端问题,如:地址错了,参数错了,头部错了
5xx:服务端问题,如服务器IP地址错误、服务器没启动等
绿色:仅表示网络成功,服务器收到了并处理了请求
判断结果是否正确,需要检查响应结果来确认
- HTTP取样器结果分析(单位ms)
load time:加载时间=响应时间,从发送请求到收到最后响应的时间,所花费的时间,即响应时间(RT)
Latency:延迟时间 <= 响应时间,从发送请求到收到第一个响应【报文太大,需要分组分包发送】,所花费的时间。响应信息越大,差别越大
connect time:连接时间,建立连接花费的时间,如:TCP的三次握手
3、Jmeter脚本参数化
在设计脚本的时候,很多数据不是固定的,例如:手机号注册,会做一些唯一性检查参数,这时候,我们需要进行参数化,那么这些值就会发生动态变化
- 重复调用的数据,也可以参数化,避免修改的时候,进行多次修改
- 参数化是不写具体的值,使用变量进行替代
# 定义参数的方法有4种:
用户定义的变量
用户参数
CSV数据文件参数化
属性
(1)用户定义的变量
- 测试计划—用户定义的变量,调用方式:
${变量名}
- 配置元件—用户定义的变量
用户定义的变量,是可以跨线程组使用的
(2)用户参数
用户参数是一种前置处理器,每次接口请求之前都会调用执行这个用户参数,在性能测试中,多个并发用户同时运行请求,用户参数的值针对每个并发用户会动态变化
用户参数的位置不同,测试的效果不一样:
* 用户参数放在线程组下,里面所有的请求都会每次去调用
作用域是整个线程组,下面的取样器都可以使用
每个取样器都会拿到最新的值
* 如果放在某个接口下面,作用域就是这个接口
只有在这个接口执行前会调用
迭代更新【用户参数的勾选框–每次迭代更新一次】
迭代:所有的取样器都执行完1次算1个迭代
用户参数的勾选框每次迭代更新一次,默认是不勾选的
每个请求都会执行一次用户参数
勾选这个选框后,例如:每个用户都是注册和登录都完成后,再更新一次数据
备注:用户参数是线程组每部的变量,不能跨线程组使用
总结用户定义的变量、用户参数:
* 用户定义的变量,可以跨线程组使用
用户参数,不能跨线程组使用,只能用于当前线程组
* 用户定义的变量,在每次启动运行的时候会获取一次值,在运行过程中,值永远不会变【循环和用户并发,值都不会变】
用户参数,在每次运行时,都会动态获取值,每次调用的时候,就会改变值,如果希望值不要变化,就勾选每次迭代更新一次,或者放在第一个取样器下面,就只会调用一次
(3)CSV数据文件
配置元件执行优先级最高,如果出错了,后面就不会运行了,可能看不到查看结果树的结果,但是工具日志可以看到报错信息。
使用场景:批量执行并需要构造真实数据时候,可以从数据库导出数据到CSV文件,接口通过CSV文件进行批量操作。
文件名:可以写绝对路径,也可以写相对路径【推荐使用】
文件编码:设置编码utf8
变量名称:多个变量,用英文逗号隔开,调用方式${变量名}
忽略首行:True/False
分隔符:读取文件的时候,列与列的分割符号【tab是制表符\t、空格、英文逗号】
是否允许带引号:只针对txt文件操作,csv不生效
遇到文件结束符再次循环吗:True/False
遇到文件结束符停止县城:True【jmeter会停止运行】/False
(4)Jmeter线程共享模式
-
所有现场【所有线程-用户】:所有线程共享,例如:一份文件,所有线程排队使用文件中的数据
-
当前线程组:这个线程组所有的线程,共用一份数据,有几个线程,就有几分相同的数据
-
当前线程:每个线程都私有一份数据,有多个线程,在内存中就有多少份数据,运行时候,只会从头开始取自己的那份数据【用得少,因占用内存最多】