本文为博主原创,未经授权,严禁转载及使用。
本文链接:https://blog.csdn.net/zyooooxie/article/details/123822776
最近接了个需求,我们系统做为基础能力,提供给其他组N个接口,故而做了些压测;因为测试环境数据量比较少 + 每次压测后都有5W多的缓存要清理,想着做期关于 数据准备+清理缓存 的分享。
【实际这篇博客推迟发布N个月】
【以下所有内容仅为个人项目经历,如有不同,纯属正常】
个人博客:https://blog.csdn.net/zyooooxie
数据准备【数据库 表】
压测 为了压出效果,我想着 多准备点数据( 线上数据量*2);
造假数据 直接使用Faker库,我之前分享过 https://blog.csdn.net/zyooooxie/article/details/124680302 ;
不过这次说点 ‘不同的’,还要从一个bug说起:
有个接口要传参 一个日期,根据字段值 对表里的create_date字段【datetime】做筛选;实际我用脚本造数据时,‘误打误撞’传了date格式的值,表里存的是 这个日期的00:00:00;在测接口时,发现这几条数据没被算进来。
(后来我们开发改了这条SQL,由原本的 > 改为>=)
我要反思下:造数据时,一直依赖Faker库,完全忘记了 边界值测试。很惭愧。
代码做‘特别调整’
"""
@blog: https://blog.csdn.net/zyooooxie
@qq: 153132336
@email: zyooooxie@gmail.com
"""
def create_external_user(nums: int, qw_user_id: str, create_date: datetime.date = None):
f = faker.Faker('zh_CN')
create_user = qw_user_id
if create_date is None:
create_date = datetime.date.today()
print(create_date, 'create_date')
create_date_0 = datetime.date.today()
print(create_date_0, type(create_date_0))
# time.min = time(0, 0, 0)
# time.max = time(23, 59, 59, 999999)
create_date_1 = datetime.datetime.combine(create_date, datetime.time.min)
print(create_date_1, type(create_date_1))
# create_date_2 = datetime.datetime.combine(create_date, datetime.time.max)
create_date_2 = datetime.datetime.combine(create_date, datetime.time(hour=23, minute=59, second=59))
print(create_date_2, type(create_date_2))
add_time = (datetime.datetime.now() + datetime.timedelta(days=-1 * random.randint(10, 19))).strftime(
'%Y-%m-%d %H:%M:%S')
all_data = list()
for i in range(nums):
# create_date = create_date_0
create_date = f.date_time_between(start_date=create_date_1, end_date=create_date_2) if random.getrandbits(
1) else random.choice([create_date_1, create_date_2])
user_id = 'wm' + f.uuid4().replace('-', '')
gender = f.random_choices(elements=(1, 2), length=1)[0]
name = f.name()
ele = (create_date, create_user, user_id, gender, name)
all_data.append(ele)
return all_data
数据准备【JMeter参数化】
- 把 表的某个字段 所有值全部取出来,用做参数化。
压测情景: 某接口的传参user_id,不能随便传,要取表里 已有的值。
"""
@blog: https://blog.csdn.net/zyooooxie
@qq: 153132336
@email: zyooooxie@gmail.com
"""
def write_txt():
sql = """
SELECT DISTINCT user_id FROM table_user WHERE user_id IS NOT NULL;
"""
data = fetch_sql(sql=sql, db_name='zyooooxie_db', fetch_mode='fetchall')
# data_list = [''.join([d[0], '\n']) if len(data) - 1 != d_index else d[0] for d_index, d in
# enumerate(data)] # 最后一条 没有换行符
data_list = [''.join([d[0], '\n']) for d in data]
Log.info(data_list[-10:])
file = 'user_id.txt'
with open(file, mode='w', encoding='utf-8') as f:
f.writelines(data_list)
- 对表里某些数据 做了处理后,用做参数化。
压测情景: 某接口的传参 abc_json,不能随便传,要取表里字段已有的值 做个处理、组装。
【这是我给别人写的。传参 abc_json 所需的值 分了2种:(150个成员)、(随机数量、小于150个成员) ;大概思路:先取出来 所有data,再从data 取(每个请求(150条) * 请求数量),剩下的data 分给 (总请求数 - 150个成员的请求数)】
"""
@blog: https://blog.csdn.net/zyooooxie
@qq: 153132336
@email: zyooooxie@gmail.com
"""
def test_1122(db: Connection, cur: Cursor, len_150: int, csv_nums: int, ):
sql = """
SELECT abpcb.emp_, abum.manage_, abpcb.user_id, abpcb.user_name, abpcb.id, abpcb.act_, abpcb.act_, abpcb.promotion_
FROM table_a_b_p_c abpcb
LEFT JOIN table_a_b_u_m abum ON abpcb.emp_ = abum.manage_
WHERE abpcb.delete_flag = 0 AND abum.delete_flag = 0 AND abpcb.act_ = 123
GROUP BY abpcb.id
ORDER BY abpcb.update_tm DESC ;
"""
data = fetch_sql(sql, fetch_mode='fetchall', db_name='cempwechat_db', db=db, cur=cur)
data = [{'spNo': d[0], 'spName': d[1], 'userId': d[2], 'userName': d[3], 'actId': d[4], 'act': d[5],
'act_': d[6], 'promotion': d[7]} for d in data]
Log.info(len(data))
# Log.info(data[-5:])
random.shuffle(data)
res = list()
every_150_len = 150
Log.info(f'{len_150},{every_150_len}')
for i in range(len_150):
d = data[i * every_150_len: (i + 1) * every_150_len]
res.append([json.dumps(d, ensure_ascii=False)])
used = len_150 * every_150_len
data_ = data[used:]
Log.info(f'剩余长度:{len(data_)}')
no_used = csv_nums - len_150
if no_used:
every_len_ = math.floor(len(data_) / no_used)
Log.info(f'{no_used},{every_len_}')
for i in range(no_used):
d = data_[i * every_len_: (i + 1) * every_len_]
res.append([json.dumps(d, ensure_ascii=False)])
random.shuffle(res)
write_txt(res)
redis集群 缓存清理-KEYS命令
【测试环境,那就 KEYS命令给它安排上】
http://doc.redisfans.com/key/keys.html
https://redis.io/commands/keys/
"""
@blog: https://blog.csdn.net/zyooooxie
@qq: 153132336
@email: zyooooxie@gmail.com
"""
def cluster_get_key_Use_KEYS(key_name: str, rc: RedisCluster, target_nodes: str = RedisCluster.PRIMARIES):
"""
:param key_name:
:param rc:
:param target_nodes:
:return:
"""
# keys命令 使用: 只能在测试环境 + 单独业务使用的集群
data_list = rc.keys(key_name, target_nodes=target_nodes)
Log.info(f'keys命令 查找到的所有key的数量:{len(data_list)}')
Log.info(data_list[-10:])
return data_list
拿到 所有key的name,调 DEL 、UNLINK命令 (对应 delete() 、 unlink())。 可以 参考之前写的 https://blog.csdn.net/zyooooxie/article/details/120334491
本文链接:https://blog.csdn.net/zyooooxie/article/details/123822776
交流技术 欢迎+QQ 153132336 zy
个人博客 https://blog.csdn.net/zyooooxie