前言
在工作中,一个产品的自动化测试用例和测试数据基本都需要分离,使用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()