首页 > 其他分享 >Jmeter简单并发及压测--JDBC Request

Jmeter简单并发及压测--JDBC Request

时间:2022-11-25 10:34:13浏览次数:44  
标签:JDBC VARCHAR 压测 res 数据库 Request DEFAULT DECLARE

一般需要并发测试的接口大多是登录、下单等接口。尤其需要抢购的下单接口。下面做的就是下单并发测试,由于用户需要用到微信号注册,所以不从注册后获取用户,直接在数据库里插入用户数据,然后通过sql正则查询语句来获取插入的用户数据,进行测试。废话不多的说,上图:

一、数据库插入用户数据:

数据库必须使用字段:

 

 

我是用的使用的数据库是MySQL,所以写一个生成随机字符串的函数代表openid,一个生成随机11位数字代表手机号:

1.生成随机字符串函数:

USE test;
SET GLOBAL log_bin_trust_function_creators=1;
DELIMITER $$
CREATE FUNCTION rs(n INT)
RETURNS VARCHAR(1024)
BEGIN
DECLARE chars CHAR(62) DEFAULT 'abcdefghijklmnopqrstuvwxyzABCDEFJHIJKLMNOPQRSTUVWXYZ0123456789';
DECLARE res VARCHAR(1024) DEFAULT '';
DECLARE i INT DEFAULT 0;
REPEAT
SET i = i + 1;
SET res = CONCAT(res,SUBSTRING(chars,FLOOR(1+RAND()*62),1));
UNTIL i=n END REPEAT;
RETURN res;
END
$$
DELIMITER ;

2.生成随机电话号码:

USE test;
DELIMITER $$
CREATE FUNCTION mobiles()
RETURNS VARCHAR(1024)
BEGIN
DECLARE chars CHAR(62) DEFAULT '0123456789';
DECLARE res VARCHAR(1024) DEFAULT '135';
DECLARE i INT DEFAULT 0;
REPEAT
SET i = i + 1;
SET res = CONCAT(res,SUBSTRING(chars,FLOOR(1+RAND()*10),1));
UNTIL i=8 END REPEAT;
RETURN res;
END
$$
DELIMITER ;

其中CONCAT(res,SUBSTRING(chars,FLOOR(1+RAND()*62),1),concat拼接;substring(string, position, length)字符截取,position从位置1开始;floor(n)向下取整;rand()取0~1随机数;

3.构造存储过程循环插入用户数据:

USE test;
DROP PROCEDURE IF EXISTS insertuser;
DELIMITER $$
CREATE PROCEDURE insertuser(IN quantity INT(10))
BEGIN
DECLARE i INT DEFAULT 0;
DECLARE oi VARCHAR(128);
DECLARE rn VARCHAR(128);
DECLARE tk VARCHAR(128);
DECLARE mb VARCHAR(128);
WHILE i<quantity DO
SET @oi=rs(28);
SET @rn=rs(5);
SET @tk=rs(64);
SET @mb=mobiles();
INSERT INTO jldc.`tb_user`(gzh_openid,phone,real_name,id_num,token) VALUES(@oi,@mb,@rn,"450421198708028521",@tk);
SET i=i+1;
END WHILE;
END $$
USE test;

如插入20条用户数据可以调用CALL insertuser(20);

二、Jmeter获取用户数据:

1.添加JDBC配置:

 

 

 

2.配置JDBC Connection Configguration:

 

Variable Name for created pool:对这个数据库连接的别名,在JDBC Request中也有一个叫做“Variable name of Pool declared in JDBC Connection Configuration”的变量名称,这两者的变量名称是需要一致的;

Database URL: jdbc:mysql://ip:端口/数据库名;

JDBC Driver class:数据库JDBC驱动类名,按连接的数据库用的是哪种来决定选哪个,如数据库是MySQL的话选com.mysql.jdbc.Driver;

Username:数据库连接用户名;

password:数据库连接密码;

3.添加JDBC Request:

 

 

 

4.JDBC Request写查询语句以及设置查询出来的使用哪些变量接收:

 

 查询插入的数据:

SELECT id,gzh_openid,token FROM jldc.`tb_user` WHERE real_name REGEXP '[a-zA-Z0-9]';

5.把查询到的数据写入csv文件:

 

 

 

 

import java.io.BufferedWriter;
import java.io.FileWriter;
import java.io.IOException;
vars.get("userid_#");
log.info("${userid_#}");
//指定需要写入到哪个文件,格式:TXT,csv
FileWriter fstream = new FileWriter("E:/jldc/jmeterData/mysql_users.csv",true);

//创建一个字符缓存输出流
BufferedWriter out = new BufferedWriter(fstream);

//返回的结果有值从数字 1 开始,一共有 ${userid_#} 次
for(int num=1; num<=${userid_#}; num++){
    //拼接变量名称
       userid = "userid"+"_"+num;
    openid = "openid"+"_"+num;
    token = "token"+"_"+num;
    
    //把拼接的名称赋值给 userid/openid/token
    vars.put("userid",userid);
    vars.put("openid",openid);
    vars.put("token",token);
    
    //vars.get()获取到变量名称,并和上面返回的 (1,2,3)名称一致,取到变量的值
    //","体现在csv文档中就是向右移一个单元格
    out.write(vars.get(userid)+","+vars.get(openid)+","+vars.get(token)+"\n");
}

out.close();

fstream.close();

三、接口并发:

1.csv数据文件设置:

使用上面数据库查询到的数据所存储的csv。

 

 

2.写接口请求:

 

 在请求下加一个请求信息头

 

 3.请求下设置好同步定时器:

 

 

 4.断言:

 

 简单的并发到这基本就完成了,当然如果要做大量的话需要做分布式,还要观察TPS,响应时间,网络,cpu,内存占用等。

 

标签:JDBC,VARCHAR,压测,res,数据库,Request,DEFAULT,DECLARE
From: https://www.cnblogs.com/lkc-test/p/16924361.html

相关文章