性能测试之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线程共享模式

  • 所有现场【所有线程-用户】:所有线程共享,例如:一份文件,所有线程排队使用文件中的数据

  • 当前线程组:这个线程组所有的线程,共用一份数据,有几个线程,就有几分相同的数据

  • 当前线程:每个线程都私有一份数据,有多个线程,在内存中就有多少份数据,运行时候,只会从头开始取自己的那份数据【用得少,因占用内存最多】

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值