本文为博主原创,未经授权,严禁转载及使用。
本文链接: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_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) # 抽奖
测试点:抽奖结果
隐藏规则有:
- 奖品是分档次的;假设实物为第5档,虚拟奖励分1-4档;
- 用户抽中的奖品,假设与用户的身份相关:用户是8类型,每次抽奖只给4档;用户是7类型,第一次抽奖给1档,第二、三次发放的是2档,第四、五次发放的是3档,其他都是4档;
在实际配置奖品时,我特意使用 字段name来区分不同档次;脚本是 通过请求抽奖接口,根据返回值中 name字段值来做校验;
(代码有删改)
def test_yyy(session: 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(session)
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)
return res
def fact_award(res: Response, level: str = '4', user_id: str = 'zyooooxie'):
res_dict = res.json()
if res_dict.get('obj'):
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