测试工具——Jmeter从入门到实践快速上手

327 阅读7分钟

follow me,一起踩坑,一起进步!

第零篇:初识Jmeter

Jmeter是一款java开发的测试工具。主要用于对服务器模拟巨大的负载,和通过创建带有断言的脚本验证程序是否能返回期望的结果。

废话不多说,直接上手一个小demo感受一下jmeter!

目标:查询个人博客文章列表

1、测试计划--右键--线程--添加线程组

2、线程组--右键--取样器--HTTP请求image-20240328145330563

3、HTTP请求->添加->配置元件->HTTP信息头管理器 (携带token)

image-20240328145404764

4、测试计划--右键--添加监听器--查看结果树

5、点击运行,查看结果

image-20240328145453096

第一篇:Jmeter的基本使用

一、设置HTTP请求默认值

封装复用的请求头信息。

目标:复用请求头信息进行文章列表查询。

image-20240328150021408

image-20240328145900830

image-20240328145921919

二、参数化

当提交的数据量较大,手动填入数据耗时耗力,每次测试都要手动填入,效率低下。

我们可以使用jmeter动态获取、设置或生成数据,提高效率。

以下四种方式实现参数化:

1、用户定义的变量

2、CSV 数据文件设置

3、用户参数

4、函数

用户定义的变量

1、添加定义变量

image-20240328151107108

image-20240328151147086

2、添加http请求

用${myPath}取到变量的值

image-20240328151215348

3、运行,查看结果

image-20240328151239556

CSV 数据文件设置

第一种方式只适用于复用一个值,而批量新增数据可以采用接下来这种方式。

目标:使用csv文件的数据批量插入标签

实现步骤:

1、添加cav数据文件设置

image-20240328153932948

2、http请求,在请求体中编辑好模板

用${key}占位

image-20240328154257658

3、编写csv文件

新建txt文本,写入内容。留意分割符自己用的什么。

image-20240328154427114

注意保存编码为:UTF-8

image-20240328154537075

4、关联脚本与数据(将文件数据导入脚本)

image-20240328152748600

5、设置csv数据文件

文件编码设置为UTF-8,一定要大写!!!

朋友们可以先试下小写,下文会提到这个坑。

image-20240328154839941

6、点击线程组,修改循环次数

推荐勾选永远

image-20240328154931883

如果你知道插入了几条数据,可以填入数字。但一般情况是不知道的,所以最好勾选上永远

7、点击运行,查看结果。

⚠️咦???点了绿色小三角没有反应,结果树中没有结果。

这时我通过07Jmeter之CSV数据文件设置遇到的问题 - 谷灵精怪 - 博客园 (cnblogs.com)

这篇博客了解到可以通过查看jmeter的日志,了解具体发生了什么。

image-20240328155355031

可以看到错误提示:不支持utf-8

image-20240328155657024

怎么会呢?改成大写试一下。

image-20240328155800564

成功了!

image-20240328155935276

⚠️从浏览器查看后台数据,添加成功了,但是没有按照模板添加。

这明显是分割符的问题。朋友们一定要注意自己分隔符是什么,大写还是小写。

image-20240328160023034

改为,后,批量插入成功!

image-20240328160230916

用户参数

与上一种方式不同,用户参数的方式不用单独写csv文件,直接借助jmeter的工具。

平常比较常用的还是csv的方式,因为可以实现数据和脚本分离,修改数据时只修改文件即可。

目标:设置用户参数批量插入标签

1、添加用户参数

image-20240328161909573

2、添加要插入的数据

image-20240328162006248

点击添加变量,增加一行

image-20240328161406405

点击添加用户,增加一列

3、修改线程数,修改成你要插入数据的个数

image-20240328161700008

4、运行,查看结果

成功!

image-20240328161844156

函数

目标:调用函数改变请求的名字,数字递增

1、使用函数助手生成函数字符串,并复制

image-20240328162448651

2、在对应位置粘贴函数字符串

image-20240328162702407

3、运行,查看效果

true的效果:image-20240328163210759

false的效果:image-20240328163254925

常用的函数

counter 计数器函数 TRUE(每个用户都有自己的计数器) FALSE(所有用户共用一个计数器)

Random 随机数函数 参数1:取值范围最小值 (包含) 参数2:取值范围最大值 (包含)

image-20240328163616373

__time 获取当前时间的函数 无参: 获取的是距离 1970/01/01 00:00:00 的毫秒值

参数1: yyyyMM_dd HH:mm:ss 格式化成 年\月_日 时:分:秒 格式

image-20240328163742118

三、连接mysql数据库进行测试

目标:连接mysql查询数据,将查询出的数据放到必应上搜索

1、下载jmeter 连mysql 数据库需安装对应的驱动包

点击MySQL :: Download Connector/J

image-20240328164651196

2、安装,下载完成后解压将放到jmeter的lib/ext下

image-20240328164845004

3、重启jmeter,添加库名

即添加刚刚放在lib/ext下的文件

image-20240328165916252

4、添加配置元件-JDBC Connection Configuration

image-20240328165022279

5、配置数据库的连接

  • Variable Name for created pool: 自己定义连接数据库的名称,自己知道是连的哪个数据库就行,如:jdbc_web
  • Database URL:数据库url,jdbc:mysql://主机ip:mysql监听的端口号/数据库名称, 如:jdbc:mysql://localhost:3306/book url后面的参数(可以不写)characterEncoding=utf8&useSSL=true&serverTimezone=UTC 设置时区和编码格式
  • JDBC Driver class:JDBC驱动,mysql5选com.mysql.jdbc.Driver,mysql8用com.mysql.cj.jdbc.Driver
  • username:登陆数据库的用户名
  • passwrod:登陆数据库的密码

image-20240328170752723

6、添加jdbc request请求

image-20240328171050376

JDBC Request 请求里面写个简单的查询SQL验证下是否能查到数据

  • Variable Name for created pool 前面自己定义的连接数据库的名称
  • Query Type: 查询的sql选择 Select Statement选项
  • Query: 写个查询的SQL select name from book jmeter中写sql语句,末尾不建议用; jdbc request请求中,不支持写多条语句

image-20240328171406775

7、运行,查看结果

image-20240328171437354

8、添加调试取样器

image-20240328172216005

9、设置变量名

image-20240328191525614

10、运行,查看结果

image-20240328191603081

11、创建http请求

image-20240328191845266

还是用${key_name}取我们的变量

image-20240328192244974

12、运行,查看结果

image-20240328192543771

四、断言

断言:让程序代替人工判断响应结果是否符号预期

分类:

响应断言 = 断言状态码和响应体

大小断言 = 判断响应内容的字节内容

断言持续时间 = 判断响应时间

image-20240328195401709

响应断言

最常用:响应文本和响应代码

image-20240328192933836

目标1:判断查询到的数据是否包含Docker123

image-20240328194526531

只有断言失败才会显示结果。

image-20240328194546123

目标2:判断响应码是否是201或者200

image-20240328194411053

大小断言

image-20240328194921204

注意200

image-20240328195018237

断言持续时间

响应时间。注意单位是毫秒,要会计算。

image-20240328195252227

image-20240328195140778

第二篇:Jmeter进阶使用

一、逻辑控制器

1、IF控制器

目标:如果val的值为hh123,则访问百度,反之不访问。

1、添加线程组、添加http请求、添加结果树、添加用户定义的变量image-20240328200557740

2、添加IF 控制器

image-20240328195913148

注意一定要将http请求放到if控制器的目录下!

image-20240328195951019

取消勾选Interpret Condi tion as Variable Expressi on?

注意语法:

 "xxx" == "xxx"

image-20240328200522884

2、ForEach控制器

目标:for循环百度搜索三个值

1、添加线程组、添加http请求、添加用户自定义变量

名称要按这个格式

image-20240328201553664

2、添加ForEach控制器

注意一定要将http请求放到ForEach的子目录image-20240329081024473

image-20240328201456015

3、添加结果树,运行,查看结果

image-20240329081124268

3、循环控制器

目标:访问百度10次,访问必应5次

直接在线程组设置循环次数,不可以做到对请求1循环10次,对请求2循环5次。

image-20240328201940914

1、添加循环控制器

image-20240329081604365

image-20240329081619167

2、运行,查看结果

image-20240329081507862

二、关联

关联:上一个请求的响应结果和下一个请求的数据有关系

1、xpath

目标:两个http请求,请求A访问博客主页,请求B访问百度,将请求A的title作为请求B的关键字搜索这个城市。

1、为第一个http请求添加XPath提取器

image-20240329083111002

2、核心: 取出传智播客页面源码的 title 值

image-20240329082845113

匹配数字:-1全部,1匹配第一个,2匹配第二个。

缺省值:如果我没有找到tilte,就返回博客。

3、传递给百度:${变量名} 的方式传值

image-20240329082945529

4、运行,查看结果

image-20240329082810343

2、正则表达式

目标:两个请求,请求A访问查询天气,请求B访问百度,将请求A响应数据的city作为请求B的关键字搜索。

1、为请求A添加正则表达式提取器

image-20240329083800472

2、写正则表达式

注意千万不要加空格!!! 空格是json格式人为加了空格。

image-20240329085329237

image-20240329083858897

数字代表想选择匹配哪个表达式。

image-20240328203635289

不加是贪婪模式。匹配到不会停止

image-20240328203956129

3、运行,查看结果

image-20240329085447126

三、跨线程组传值

变量作用域局限于当前线程组,其他线程组不可以直接调用。可以将请求A中提取的结果导出到公共空间 (可以被不同线程组共享),请求B再从公开空间调用该变量,相当于全局变量。

1、将请求A的数据导出到公共空间( setProperty)

调用函数助手,复制字符串

image-20240329085631256

2、添加BeanShell取样器,设置全局变量

image-20240328204800880

3、请求B从公共空间调用数据 (property)

image-20240329090109050

4、放入百度请求的路径中

image-20240329090249435

5、勾选独立运行每个线程组

image-20240329090331232

6、添加查看结果树,运行

image-20240329090431050

四、高并发

JMeter 中内置了定时器,可以实现时间模式相关的性能测试。

image-20240328210841690

目标:同一时刻 100 个同学去访问个人博客系统的查询所有文章信息功能,统计高并发情况下平均响应时间以及错误率(高并发)

1、搭框架,测试计划,线程组,取样器,结果树(局限性),指定线程组的线程数属性值为 100

image-20240328210949372

2、添加定时器 synchronizing timer(集合点组件)

模拟用户组的数量:总共100个人为一组一起访问

image-20240328210028619

推荐将超时时间以毫秒为单位设定一个数,不为0,防止死等。如果30为一组,且将超时时间设为0,100个人除不尽,最后10个人会不进行请求。但是绝大多情况会设置为除尽的。

image-20240328210157697

3、运行并查看结果查看:聚合报告组件,可以对结果汇总分析

image-20240328210802899

五、高频率

目标:一个用户以 20QPS ( == 20 次/s) 的频率访问个人博客系统服务器,持续15秒,统计服务器的平均响应时间

QPS: Query per Seconds 每秒查询数(查询率),每秒访问多少次服务器

1、搭框架,测试计划,线程组,取样器,聚合报告,根据题干计算数据: 循环次数 = 访问频率 * 持续时间

image-20240328211540956

2、添加QPS访问频率控制的相关组件: 每分钟访问次数 = 访问频率 * 60

image-20240328211443456

image-20240328211331936

3、运行,查看聚合报告

image-20240328211714422

如果本文对你有帮助的话,不妨点个小赞👍帮助更多的小伙伴!!!