一般需要并发测试的接口大多是登录、下单等接口。尤其需要抢购的下单接口。下面做的就是下单并发测试,由于用户需要用到微信号注册,所以不从注册后获取用户,直接在数据库里插入用户数据,然后通过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