【pytest】(十)fixture参数化-巧用params和ids优雅的创建测试数据

我们都知道参数化。

比如我要测试一个查询接口/test/get_goods_list,这个接口可以查询到商品的信息。
在请求中,我可以根据请参数goods_status的不同传值,可以查询到对应状态的商品数据,比如:1-未销售2-销售中3-已售罄

那么在编写自动化测试case的时候,在断言里就要分别验证到这3种状态的商品数据。
通常,在执行case之前,会去数据库分别插入对应状态的商品数据,来满足测试需求。
而在pytest框架中,我喜欢用fixture()去实现测试数据的准备和清理工作。
于是,2种实现方式瞬间出现:

  • 写3个case,只有传参不一样。对应写3个fixture来分别初始化3种状态的商品数据。
  • 写1个case,在case里用@pytest.mark.parametrize()进行参数化。只写一个fixture一次性的插入3种状态的商品数据。

在这2个方法里,显然第二种更优雅,避免了case的冗余代码。
但是一把梭的插入所有的测试数据还是差点意思,如果我只想执行其中的某一个数据的case,那么其他2个不必要的数据也生成了。

所以,我想要的样子是,可以自由的根据执行的case的参数,去对应的初始化测试数据。
具体点的描述就是:参数化里3个参数,我只执行2-销售中的时候,只去插入2-销售中这一种状态的数据。

网上搜的都是简单的fixture参数化的东西,达不到我想要的需求。于是乎我自己去翻阅官方文档,发现可以用fixture中的params和ids
这2个参数去实现我的需求。

一、fixture中的params

params是一个列表,用来存放我们要参数化的值。
举例:这里的代码放了参数1参数2 这2个参数,2个测试case,都会用params里的参数去分别执行2次。

import pytest


@pytest.fixture(params=['参数1', '参数2'])
def my_fixture(request):
    return request.param


def test_fixtures_01(my_fixture):
    print('\n 执行test_fixtures_01')
    print(my_fixture)


def test_fixtures_02(my_fixture):
    print('\n 执行test_fixtures_02')
    print(my_fixture)

运行一下:

collecting ... collected 4 items

test_ids.py::test_fixtures_01[\u53c2\u65
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值