Pytest框架—用例参数化(@pytest.mark.parametrize)

前言

在工作中,一个产品的自动化测试用例和测试数据基本都需要分离,使用Pytest框架时,可以使用@pytest.mark.parametrize装饰器进行测试用例数据参数化

1.只参数化一个测试数据集

把测试数据存储在一个列表里,如果有多条测试数据,列表里就有多个列表元素,示例代码如下:

testcase_data = [
             ['正常测试数据', 541, 1, 200, ''],
             ['产品ID不存在', 37747, 1, 500, '004'],
             ['产品已下架', 543, 1, 200, ''],
             ['产品已删除', 2144, 1, 200, ''],
             ['购买数量超过库存', 541, 99999999, 500, '451'],
             ['购买数量为0', 541, '0', 400, '004'],
             ['购买数量为负数', 541, '-1', 400, '004']
     ]
    @pytest.mark.parametrize('param', testcase_data) 
    def test_buy_now(self,param,get_redis_info):
        buy_now=Buy_Now(sku_id=param[1],num=param[2])
        resp=buy_now.send()
        if resp.status_code==200:
            # 立即购买接口,调用成功后,会将数据存储在redis中,并且响应body是空的,所以接下来用redis做数据判断
            redisassert = RedisAssert(host=get_redis_info['host'], pwd=get_redis_info['password'])
            res01 = redisassert.getkey('{BUY_NOW_ORIGIN_DATA_PREFIX}_'+str(BuyerLogin.uid))  # key对应的值res01是一个java对象
            print(res01)
            # 将从redis中得到的序列化java对象转换成python对象
            res1 = javaobj.loads(res01)
            print(res1)
            except_num=res1[0].__getattribute__("num")
            # 列表中第一个购买产品ID
            except_skuid=res1[0].__getattribute__("skuId")
            pytest.assume(param[1] == except_skuid)
            pytest.assume(param[2]==except_num)

        else:
            resp_code=buy_now.extract_resp("$.code")
            pytest.assume(resp_code==param[4])

说明:

1)在实际工作中,一条自动化用例都会包含正常测试数据、异常测试数据等好几组测试数据。我的示例中有7组测试数据,会执行7次。

2)@pytest.mark.parametrize('param', data)中的参数param就是指一组测试数据

3)测试数据可以存放在其他文件里,比如yaml文件,.py文件,excel里,然后在做一层封装转换到测试数据集列表中

2.参数化多个测试数据集

在实际业务中,有时需要测试多个接口交互,而每个接口又有多个枚举值的情况,这种情况接口越多,测试数据组合越多,如果按照参数化单个测试数据集的写法,测试数据组数=单个接口枚举值个数相乘,接口越多这个数量就越大,Pytest框架中有一种叫笛卡尔积方式参数化可以减少这个工作量,它的要点是:把每个接口的枚举值存储在一个测试数据集中,有几个测试数据集参数化几次,下面举例说明:

业务场景:

交易接口有两个参数:client,way。client有5种枚举:

way有2中枚举:

测试数据应该有5x2=10组,通过笛卡尔积方式参数化可以简化编写测试数据,实现方式如下:



class TestCreateTrate():
    
    #第一步定义测试数据集,一个接口的枚举一个测试数据集
    client_data = ['PC', 'WAP', 'NATIVE', 'REACT', 'MINI']
    way_data = ['BUY_NOW', 'CART']

    # 第二步:用装饰器参数化,一个装饰器参数化一个测试数据集
    @pytest.mark.parametrize('client', client_data)
    @pytest.mark.parametrize('way', way_data)

    #第三步把两个参数传给测试用例
    def test_create_trate(self,client,way):
        if way == "BUY_NOW":
            buy_now = Buy_Now(sku_id=541, num=1)
            buy_now.send()
        elif way == "CART":
            add_carts = Add_Carts(sku_id=541, num=1)
            add_carts.send()
        create_trate = Create_Trade(client=client,way=way)
        createtrate_resp = create_trate.send()

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值