Jmeter直连数据库
直接数据库的使用场景
直连数据库的关键配置
- 添加MYSQL驱动Jar包
- 方式一:在测试计划面板点击“浏览”按钮,将你的JDBC驱动添加进来
- 方式二:将MySQL驱动jar包放入到lib/ext目录下,重启JMeter
- 配置数据库连接信息
- 添加方式-测试计划->线程组->(右键添加)配置元件JDBC Connection Configuration
参数介绍:
- Variable Name:mysql数据库连接池名称(JDBC请求时要引用)
- Database URL:jdbc:mysql://localhost:3306/tpshop2.0
- 组成:协议+数据库IP+数据库端口+连接的数据库名称
- JDBC DRIVER class:com.mysql.jdbc.Driver(MySQL驱动包 位置固定格式---- 下拉框)
- Username:root(连接数据库用户名,如实填写)
- Password:(MySQL数据库密码,如实填写,如果密码为空不写)
-
添加JDBC请求
- 添加方式:测试计划—线程组—取样器—JDBC Request
参数介绍:
- Variable Name :数据库连接池的名字,需要与JDBC Connection Configuration的Variable Name Bound pool名字保持一致
- Query Type:
- 查询操作:选择“select statement”
- 增加、删除、修改操作:选择“Update Statement"
- Query:填写的SQL语句,末尾不要加";"
- Variable names:保存SQL语句返回结果的变量名
练习1:
1、连接tpshop商城数据库获取商品名包含:小米手机5的商品id
准备工作:
1.启动tpshop数据库服务器
2.添加MySQL驱动jar包
操作步骤:
- 添加线程组
- 添加 JDBC Connection Configuration
- 添加 JDBC Request
- 添加查看结果树
遇到问题
在使用 JMeter 进行 JDBC 查询数据库时,sql 语句使用英文和数字可以查询到记录,而使用中文则查询不到记录,而且使用相同的中文语句,可以在终端命令上和数据库管理工具上也可以查询到。
原因
以上问题是因为数据库使用的编码与jmeter 查询时,使用的编码不一致,导致查询的条件转换后不一致,导致查询不到正确记录或查询到错误记录。
JMeter 的默认编码是ISO-8859-1,而 mysql 数据库因为要存储中文信息,所以一般使用utf-8。在 JMeter 上填写的中文查询语句经字符编码转换到 mysql 上,不是之前填写的中文字段,导致查询条件失效了。
解决办法
在 JMeter 的 jdbc 链接配置插件上,连接 mysql 的 url上加useUnicode=true&characterEncoding=UTF-8即可解决问题。
练习2:
1、在tpshop首页中搜索商品名称包含"小米手机5",
请求url:http://192.168.234.129/Home/Goods/search.html
请求方法:GET
请求参数:q
2、 在搜索的响应数据中检查是否有该商品对应的商品链接:/Home/Goods/goodsInfo/id/237.html
(id:237需要通过数据库查询返回,才保证每次都是有效的)
编写JDBC脚本步骤(搜索指定商品,在返回结果中检查是否包含指定商品的ID的详情URL):
1.添加线程组
2.添加 JDBC Connection Configuration
3.添加 JDBC request
4.添加 HTTP请求 - 搜索商品
5.在搜索HTTP请求下,添加响应断言,检查响应结果中的字符 是否包含 商品URL。引用格式:${变
量名_索引}
6.添加查看结果树
Jmeter逻辑控制器
如果(If)控制器
作用:If控制器用来控制它下面的测试元素是否执行
位置:测试计划–>线程组—>(右键添加)逻辑控制器—>如果(If)控制器
参数介绍
练习:
1.使用“用户定义的变量”定义一个变量name,name的值可以是“baidu"或”itcast"
2.根据name的变量值实现对应网站的访问。
操作步骤:
1.添加线程组
2.用户定义的变量
3.添加If控制器,判断name是否等于baidu
- 不勾选Interpret Condition,“${name}”==“baidu”
- 勾选,KaTeX parse error: Expected group after '_' at position 2: {_̲_jexl3("{name}"==“baidu”,)}
4.添加HTTP请求,用来访问百度
5.添加If控制器,判断name是否等于itcast
6.添加HTTP请求,用来访问传智播客
7.添加查看结果树
循环控制器
作用:通过设置循环次数,来实现循环发送请求
位置:测试计划–>线程组–(右键添加)逻辑控制器—>循环控制器
参数介绍
案例:1.循环访问百度10次
操作步骤:
1.添加线程组
2.添加循环控制器----设置循环次数
3.添加HTTP请求
4.添加查看结果树
思考:线程组属性可以控制循环次数,那么循环器有什么用?
控制的作用域不同:线程组控制是线程组下的所有请求,循环控制器控制逻辑控制器下的所有请求
如果线程组循环次数为M,循环控制器循环次数为N:
- 循环控制器下的HTTP请求运行:M*N次
- 线程组下的其他HTTP请求运行:M次
ForEach控制器
作用:一般和用户自定义变量或者正则表达式提取器一起使用,读取返回结果中一系列相关的变量值。
该控制器下的取样器都会被执行一次或多次,每次读取不同的变量值。
位置:测试计划—>线程组—>(右键添加)逻辑控制器—>ForEach控制器
练习:
1.有一组关键字[hello,python,测试],使用用户定义的变量存储
2.要依次取出关键字,并在百度搜索,例如:https://www.baidu.com/s?wd=hel
步骤:
1.添加线程组
2.添加用户自定义的变量
3.添加ForEach控制器
4.添加HTTP请求
5.添加查看结果树
与正则表达式配合使用(案例2):
案例2:
1. 访问黑马首页http://www.heima.cn,获取首页中的地址信息,并全部保存下来
2. 要依次取出地址关键字,并在百度搜索,例如:https://www.baidu.com/s?wd=地址
操作步骤:
1.添加线程组
2.添加HTTP请求1-heima
3.在HTTP请求1下面,添加正则表达式提取器,提取出所有的地址信息
4.添加ForEach控制器
5.添加HTTP请求2-百度
6.添加查看结果树
- 注意:结束循环字段可以设置为空,自动读取到最后一个
定时器
同步定时器
同步定时器:阻塞线程(累计一定的请求),当在规定的时间内达到一定的线程数量,这些线程会在同一个时间点一起释放,瞬间产生很大的压力。
提示:在Jmeter中叫做同步定时器,在Loadrunner中又叫集合点。
位置:测试计划–>线程组–>HTTP请求–>(右键添加)定时器—>Synchronizing Timer
参数介绍:
- Number of Simulated Users to Group by:模拟用户的数量,即指定同时释放的线程数数量。
- 若设置为0,等于设置为线程组中的线程数量。
- Timeout in millisseconds:超出时间,即超时多少毫秒后同时释放指定的线程数;
- 如果设置为0,该定时器将会等待线程数达到了设置的线程数才释放,若没有达到设置的线程数会一直死等。
- 如果大于0,那么如果超过 Timeout in millisseconds中设置的最大等待时间后还没达到设置的线程数,Timer将不再等待,释放已到达的线程,默认为0.
练习1:
模拟100个用户同时访问百度首页,统计各种高并发情况下运行情况。
操作步骤:
1.添加线程组-设置线程数100人
2.添加HTTP请求
3.添加同步定时器,并发数可分别设置20/30人
- 设置并发线程数:同时发送请求的虚拟用户数
- 设置超时时间:
- 建议设置:不设置的话,没有达到设置的线程数会一直死等。
- 不能设置太小:等待时间后还没达到设置的线程数,会释放已到达的线程。
4.添加查看结果树
5.添加监听器-聚合报告
常数吞吐量定时器
作用:让JMeter按指定的吞吐量执行,以每分钟为单位
位置:测试计划–>线程组—>HTTP请求–>(右键添加)定时器—>Constant Throughput Timer
参数介绍:
- 目标吞吐量:每个用户每分钟发送的请求数
案例要求
- 模拟用户真实的业务场景要求:20 QPS
- 如果线程数设置为1,则目标吞吐量设置为20*60=1200
- 如果线程数设置为2,则目标吞吐量设置为20*60/2=600
练习:
(1) 一个用户以20 QPS(20次/S)的频率访问百度首页,持续一段时间,统计运行情况
(2)2个用户针对 (服务器的QPS要求:20QPS (20 次/s)) 的频率访问百度首页,持续一段时间,统计运行情况
操作步骤:
1.添加线程组,循环次数设置成永远
2.添加HTTP请求
3.添加常数吞吐量定时器
- 设置目标吞吐量:每个用户每分钟发送的请求数
- 计算方法:要求QPS*60/线程数
4.添加查看结果树
5.添加监听器-聚合报告
固定定时器
案例:
(1)IHRM系统登录错误3次后,锁定1分钟,等待1分钟后重新输入正确的用户名密码登录成功
请求方法:POST
请求URL:http://ihrm-java.itheima.net/api/sys/login
请求头:Content-Type: application/json;charset=UTF-8
请求体:{“mobile”:“13800000002”,“password”:“888itcast.CN764%…”}
操作步骤:
1.添加线程组
2.添加HTTP请求1-错误1次
3.添加HTTP请求2-错误2次
4.添加HTTP请求3-错误3次
5.添加HTTP请求4-正确用户名密码
6.在HTTP请求4下,添加固定定时器
7.添加查看结果树
注意:
- 固定定时器,必须添加在需要等待的HTTP请求的子节点下
- 在HTTP信息头管理中,修改HTTP请求的头域