jmeter+influxdb+grafana 进行压测

一、准备工作

  • 安装jdk8,配置java环境变量
  • 下载解压Jmeter,Apache官网最新版本为5.4.1。这里给大家提供一个我们目前在用的Jmeter5.1.1的包,直接下载解压即可📎apache-jmeter-5.1.1.zip,Jmeter本身由纯JAVA语言编写,支持跨平台使用,windows/Mac均可使用(Jmeter历史版本下载链接:http://archive.apache.org/dist/jmeter/binaries/
  • 待压测接口URL、请求方式、请求头、请求参数、是否需要参数化

二、在Jmeter图形化界面创建脚本

1、打开Jmeter图形化界面

下载好压缩包后,将压缩包解压,打开解压后的文件夹,在bin目录下双击jmeter.bat(windows)/jmeter(mac)即可打开Jmeter图形化界面,如下图:

Jmerter本身即支持中文语言界面,切换语言配置见下图操作路径

 

2、添加线程组

线程数:虚拟用户数,一个虚拟用户占用一个进程或线程。设置多少虚拟用户数在这里也就是设置多少个线程数。Ramp-Up Period(秒):设置的虚拟用户数需要多长时间全部启动。如果线程数为10 ,Ramp-Up Period为100,那么就是100秒钟内启动10个线程。每一个线程都会在上一个线程启动10秒钟后才开始运行;设置为0则表示同时启动。

循环次数:每个线程发送请求的次数,如果线程数为20 ,循环次数为100 ,那么每个线程发送100次请求。总请求数为20*100=2000 。如果勾选了“永远”,那么所有线程会一直发送请求,一到选择停止运行脚本。

调度器:勾选后启用调度器,持续时间(秒)启动延迟(秒)才生效;不勾选则不生效。

持续时间(秒):脚本运行的总时长。

启动延迟(秒):延迟多长时间开始执行脚本。

⚠️ 合理使用调度器配置和线程属性配置,Jmeter会在达到任一条件后停止运行脚本。如:线程数1、循环次数10、持续时间10s,在此条件下运行脚本时,若在10s内Jmeter调用10次请求完成,那么Jmeter将停止继续运行脚本;同样的,如果在调用完10次请求之前,时间已经达到10s,那么Jmeter也会停止运行脚本,结束测试。

3、添加HTTP请求取样器

⚠️ 取样器必须添加在线程组下,因此要右键线程组来添加HTTP请求取样器

 

 

HTTP请求取样器中,对应填入接口的请求协议、域名/IP+端口号、请求方法、请求路径、参数即可。

⚠️ GET请求可直接讲参数拼在路径中,如:/exam/test?para1=ok&para2=good;也可将接口URL填在路径中,参数放在下方参数栏中,如下图:

 

⚠️ POST请求通常情况都放在消息体中传递,将入参写入“消息体数据”即可,如下图:

 

⚠️ 设置请求响应超时时间(常用):在HTTP请求取样器界面,切换至“高级”,即可配置响应超时时间,如下图

 

4、添加HTTP信息头管理器

HTTP信息头管理器:配置HTTP请求的请求头信息,可在所有组件下添加,对应的作用域也有所不同。

 

通常情况下,必须配置的请求头信息为 Content-Type: application/json (根据实际请求的请求头填写值)

常见请求头配置项:roleType,accessToken,email等,视具体接口请求头配置项确定

5、添加HTTP Cookie管理器

HTTP Cookie管理器:配置HTTP请求的cookie信息,常见如token

 

⚠️ 配置token时,注意“域”的值与HTTP请求域名一致

6、添加监听器:察看结果树、聚合报告

察看结果树和聚合报告监听器,主要用来在Jmeter图形界面调试脚本使用。

接下来只需要调整好请求的各项参数,在察看结果树中确定请求正常,则一个单接口的压测脚本已基本完成。

三、进阶用法

1、添加断言

 

2、参数化

添加CSV数据文件设置配置元件

 

 

其中重点关注以上几项:

文件名:要读取的参数化文件,如果该参数化文件和脚本文件保存在同一个目录下,此处可直接填写参数化文件名称

变量名称:为从参数化文件中读取出来的数据命名,如有多个参数化字段,变量名用英文逗号隔开,如:email,subject,edu

忽略首行:Fasle不忽略首行,即从参数化文件中的第一行开始取值;True忽略首行,即从参数化文件中的第二行开始取值。这个是因为如果参数化文件中参数过多,为了区别字段,参数化文件中第一行会保留字段名。

分隔符:用来分隔参数的符号,如果使用csv文件,通常都是用英文逗号","来分隔,需要根据不同参数化文件来修改分隔符,支持转译符号,如\t为制表符,\n为换行符。

线程共享模式:当前配置元件的作用域,一般情况下不用修改。

 

参数化文件的数据读取形式:每次请求按行读取数据,即一次请求取一行参数化文件中的参数,根据设置的分隔符来区分不同参数化字段。

参数化变量引用:如上图中,仅参数化了一个字段,且变量名称为email,那么可以用${email}的方式来引用该变量,如下图,且该变量也可在请求头、cookie、请求域名、请求路径等多个地方引用

 

参数化文件格式:常用的为.csv和.txt类型文件。通常情况下,多个字段需要参数化,我们要求一个字段给一列,且用英文逗号分隔开,注意如果字段间有对应关系的话,每一行的字段值需对应正确。

3、接口关联

常用于场景压测,下游接口依赖上游接口的返回值做入参的情况。

常用组件:后置处理器-JSON提取器,后置处理器-正则表达式提取器

 

以JSON提取器举例:

 

Names of created variables:保存的变量名,后面使用${}引用,可以提取多个变量,变量名中间用英文分号分隔,最后一个变量后面不需要符号

 

JSONPath expressions:json path表达式,若提取的是多个变量,则需要多个json表达式,json表达式中间用英文分号分隔,最后一个表达式后面不需要符号,json表达式中可能涉及到索引,索引从0开始取值,*表示通配

eg:$.result.data.tasks[*].woCode;$.result.data.tasks[*].boxQty;$.result.data.tasks[0].taskId

 

Match No.(0 for Random):匹配第几个,0表示随机;n取第几个匹配值;-1匹配所有。若只要获取到匹配的第一个值,则填写1

 

Compute concatenation var(suffix_ALL):如果匹配到多个结果,将使用’ , '分隔符将它们连接起来,命名为“变量名_ALL”

taskId_ALL=396671,396651,396681,396661,396611,396641,396621,396601,396631

 

Default Values:找不到时给变量一个默认值

 

如上图所示,我将从第一个接口的返回值中提取message字段,给第二个接口做入参使用,首先看下第一个接口的返回值如下图,故json path表达式为:$.message,变量名msg,取第1个值,默认值为null

 

 

所以在第二个接口中,入参引用如下图:

运行后在察看结果树中查看请求参数,引用成功。

4、后端监听器(暂停使用,待重新搭建监控)

在正式执行压测脚本时,我们会使用非GUI模式运行压测脚本,此时我们需要有一个可视化的监控压测过程的图形化工具:grafana+influxdb,

Jmeter自带的“后端监听器”支持将压测过程中的数据写入influxdb中,grafana从influxdb中读取数据,展示在页面上。

首先添加后端监听器:

然后按照下图进行配置即可,之后再运行Jmeter,即可在grafana界面实时查看到相关压测数据。

 application和testTitle可以根据每次不同的业务进行名称修改,便于在grafana查看时筛选数据

 

 

 

 

 

 

 

 

 

 

 

 

 

 

posted @ 2024-04-01 18:14  Alieen617  阅读(45)  评论(0编辑  收藏  举报