测试分享之抽奖【一】

本文为博主原创,未经授权,严禁转载及使用。
本文链接: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)

测试点:抽奖结果

隐藏规则有:

  1. 奖品是分档次的;假设实物为5档,虚拟奖励分1-4档;
  2. 用户抽中的奖品,也是规划好的,假设与用户的身份相关:【以天为单位】用户是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

Guess you like

Origin blog.csdn.net/zyooooxie/article/details/118419408