背景
测试工作中经常会遇到的一个场景-造数,比如有一个发券的活动,要求限制前6000名下单用户发放权益,这个时候就要造一些大于6000数量的订单,去校验是否6000名之后不发放
需求
前3100名用户下单,送2张优惠券,同一笔订单发送2张优惠券,基于这个场景,该怎么设计造数脚本?
方案
1.通过pymysql连接数据库
2.创建游标(通过游标执行sql语句)
3.构建插入语句(insert into … values …)
4.通过for或者while循环构建要插入数据的值列表
5.通过游标的executemany(sql,data)方法,批量插入数据
6.提交事务,关闭游标和连接
具体代码实例
import pymysql,random
from datetime import datetime
# 建立与MySQL数据库的连接
conn = pymysql.connect(
# 域名
host="xxx",
# 端口
port=xxxxx,
# 数据库用户名
user="xxx",
# 数据库密码
password="xxx",
# 数据库
database="xxxx"
)
# 创建游标对象
cursor = conn.cursor()
# 构建插入语句
insert_query = "INSERT INTO `xxxxx` (orderid, activit, Exe, ExecError, Result, IsDeleted, CreateUser, UpdateUser, CreateTime, datachange_lasttime) VALUES (%s, %s, %s, %s, %s, %s, %s, %s, %s, %s)"
# 构建数据列表
data = []
used_orderids = set() # 用于存储已使用的orderid
while len(data) < 7000: # 生成3500个orderid对应的2条记录,总共需要生成14000条记录
orderid = random.randint(10000000000, 99999999999) # 生成11位随机数
if orderid not in used_orderids:
used_orderids.add(orderid)
data.append((orderid, "011111111111111", 1, "", 1, 0, "meng", "meng", datetime.now(), datetime.now()))
data.append((orderid, "022222222222222", 1, "", 1, 0, "meng", "meng", datetime.now(), datetime.now()))
# 执行批量插入
cursor.executemany(insert_query, data)
# 提交事务
conn.commit()
# 关闭游标和连接
cursor.close()
conn.close()