本文为博主原创,未经授权,严禁转载及使用。
本文链接:https://blog.csdn.net/zyooooxie/article/details/118419408
最近手上有几个需求和抽奖有关,想着总结下,做些分享;因为是好几个需求综合起来的,计划分2期来说;
【实际这篇博客推迟发布N个月】
个人博客:https://blog.csdn.net/zyooooxie
【以下所有内容仅为个人项目经历,如有不同,纯属正常】
需求1
某福利大抽奖活动的规则是: 用户每天最多参与10次抽奖,每次抽奖消耗20积分;每次抽奖都有奖品:实物、虚拟奖励;随机中奖;
操作步骤:进入活动页-抽奖模块,点击 开始抽奖,弹窗(扣除20积分)- 确定,抽奖动效,弹窗-抽奖结果;
测试过程中,我实际的关注点:抽奖次数、抽奖结果、积分的变动。
基础脚本-多用户抽奖
一个用户抽来抽去,结果可能 不准确;就想着 使用不同用户来做测试;手上有个测试环境的用户信息txt,文件每一行的内容是:userId,、手机号。
(代码有删改)
def test_2_func(file: str = r'D:\0002-十万用户_手机信息.txt'):
# 想要读的行数
nrows = 10
# 需要忽略的行数
skiprows = random.randint(1, 99900)
data = pd.read_csv(file, encoding='utf-8', skiprows=skiprows, nrows=nrows)
# all_data_gen = (d for d in data.values)
# return all_data_gen
all_data_list = data.values.tolist()
return all_data_list
def get_session(phone: str):
Log.info('当前手机号:{}'.format(phone))
url = 'https://blog.csdn.net/zyooooxie'
data = {
'mobile': phone}
res = requests.post(url, json=data, verify=False)
res_dict = res.json()
return res_dict['obj']['sessionId']
data_list = test_2_func()
for d in data_list:
user, ph = d[0], d[1]
s = get_session(ph)
# test_0(user_id=user) # 清理抽奖记录
for _ in range(30):
test_1(s, user_id=user) # 抽奖
测试点:抽奖次数
(代码有删改)
def test_0(user_id: str = 'zyooooxie'):
# 清理 表的抽奖记录
db, cur = connect_db()
try:
sql = """
DELETE FROM table_r WHERE user_id = '{0}';
DELETE FROM table_r_2 WHERE user_id = '{0}';""".format(user_id)
cur.execute(sql)
except Exception as e:
db.rollback()
Log.info(e.args)
finally:
cur.close()
db.close()
def test_1(session_id: str, user_id: str = 'zyooooxie'):
# 抽奖、积分不足时 去表里修改用户的总积分
url = 'https://blog.csdn.net/zyooooxie'
header = {
'Cookie': 'sessionId={}'.format(session_id)}
res = requests.post(url, json={
}, headers=header, verify=False)
res_text = res.text
if res_text.find('积分不足') != -1:
mysql_host = 'host'
mysql_pwd = 'pwd'
mysql_db = 'db'
mysql_user = 'user'
db = pymysql.connect(host=mysql_host, passwd=mysql_pwd, user=mysql_user, port=3306, autocommit=True,
database=mysql_db)
cur = db.cursor()
sql = """UPDATE t_point SET USABLE_POINT = {} WHERE USER_ID = "{}";""".format(random.randint(100, 999),user_id)
try:
cur.execute(sql)
except Exception as e:
db.rollback()
Log.info(e.args)
finally:
cur.close()
db.close()
else:
# 抽奖结果
res_dict = res.json()
if 'obj' in res_dict:
some_dict = res_dict['obj'][0]
Log.info(some_dict) # 抽中的奖品
else: # error,不抛出;实际要看每个用户的抽奖结果来分析
Log.info(res_dict)
s = 'sessionId123456'
test_0()
for _ in range(30): # 抽 > 10次
test_1(s)
测试点:抽奖结果
隐藏规则有:
- 奖品是分档次的;假设实物为5档,虚拟奖励分1-4档;
- 用户抽中的奖品,也是规划好的,假设与用户的身份相关:【以天为单位】用户是8类型,每次抽奖只给4档;用户是7类型,第一次抽奖给1档,第二、三次发放的是2档,第四、五次发放的是3档,其他都是4档;
在实际配置奖品时,我特意使用 字段name来区分不同档次;脚本是 通过请求抽奖接口,根据返回值中 name字段值来做校验;
(代码有删改)
def test_yyy(s: str):
ug = 8 # 某客群
Log.info('当前用户分组:{}'.format(ug))
for i in range(190):
Log.info('当前第{}次抽奖'.format(i+1))
current_level = str(test_Config(ug, i))
r = req_Award(s)
fact_award(r, level=current_level)
def test_Config(user_group: int, index_int: int):
# 返回 某用户分组、用户抽奖次数下的 奖品level
if user_group == 7:
if index_int == 0:
c_level = 1
elif index_int == 1 or index_int == 2:
c_level = 2
elif index_int == 3 or index_int == 4:
c_level = 3
else:
c_level = 4
elif user_group == 8:
c_level = 4
else:
raise Exception('用户分组 {} 有问题'.format(user_group))
return c_level
def req_Award(s: str):
headers = {
'Cookie': 'sessionId={}'.format(s)}
url = 'https://blog.csdn.net/zyooooxie'
res = requests.post(url, json={
}, verify=False, headers=headers)
assert res.json()['success'] is True
return res
def fact_award(res: Response, level: str = '4', user_id: str = 'zyooooxie'):
res_dict = res.json()
if res_dict.get('obj'):
assert res_dict['success'] is True
obj_dict = res_dict['obj'][0]
assert level == obj_dict.get('name')
Log.info('发放的Name:{} 符合'.format(level))
else:
assert res_dict['success'] is False
if res_dict['errorMessage'].find('今日已经领取过') != -1:
Log.info(res_dict)
return
else:
raise Exception(res_dict['errorMessage']) # 其他的error 抛出来
测试点:积分变动
假设 用户的初始integral 都是10000;
Home接口,有个integralAmount 代表当前用户的总积分;
Award接口,会有个spent的字段 来标识实际花费的积分;
(代码有删改)
def test_check_amount(s: str, user_group: int):
new_ba = None
Log.info('当前用户分组:{}'.format(user_group))
for i in range(15):
res_dh = req_Home(s)
ba = res_dh.json()['obj']['integralAmount']
if i == 0:
assert ba == 10000
Log.info('首次的integralAmount是 10000')
else:
assert new_ba == ba
Log.info(new_ba)
res_da = req_Award(s)
sub_value = res_da.json()['obj'][0]['spent']
Log.info('当次抽奖 spent:{}'.format(sub_value))
new_ba = ba - sub_value
本文链接:https://blog.csdn.net/zyooooxie/article/details/118419408
交流技术 欢迎+QQ 153132336 zy
个人博客 https://blog.csdn.net/zyooooxie