Pytest无法将date对象作为参数传递给fixture问题咨询
问题解答
根因说明
request.param没有任何类型限制,支持传递任意Python对象,包括datetime.date、自定义类实例等复杂类型,你遇到的报错和参数类型无关,是参数传递写法和后续数据处理逻辑的问题。- 你当前写法的问题:
@pytest.mark.parametrize("getData", [(date.today())], indirect=["getData"])中,(date.today())因为没有尾部逗号,本质上等价于直接传入date.today()对象,如果你的后续处理逻辑里误将传入的参数当作元组/列表取下标(比如写了date[0]),就会触发'datetime.date' object is not subscriptable报错。 could not convert string to Timestamp报错通常是因为你的数据处理逻辑里有将date对象强制转字符串再转Timestamp的多余操作,date对象可以直接传入Timestamp相关方法生成时间戳,不需要中转字符串。
正确实现方案
方案1:单参数直接传递
如果fixture只需要接收一个date参数,直接按单个值传递即可,不需要额外套冗余括号:
import pytest from datetime import date @pytest.fixture def getData(request): """Variable data query""" input_date = request.param # 直接使用input_date即可,不需要取下标 # do some data calls with input_date return input_date # 参数列表直接放date对象即可 @pytest.mark.parametrize("getData", [date.today()], indirect=["getData"]) def test_data(getData): # do some tests with the data assert isinstance(getData, date)
方案2:多参数打包传递
如果需要给fixture传多个参数,再用元组打包,注意单元素元组必须加尾部逗号:
import pytest from datetime import date, timedelta @pytest.fixture def getData(request): # 按元组顺序解包参数即可 input_date, offset_day = request.param target_date = input_date + timedelta(days=offset_day) # do some data calls with target_date return target_date # 多参数直接写在元组中即可,单元素元组要加逗号:(date.today(),) @pytest.mark.parametrize("getData", [(date.today(), 3)], indirect=["getData"]) def test_data(getData): # do some tests with the data pass
扩展:复杂自定义对象传递示例
哪怕是自定义类的实例也可以正常传递给fixture:
import pytest from datetime import date class QueryParams: def __init__(self, date, biz_type, user_group): self.date = date self.biz_type = biz_type self.user_group = user_group @pytest.fixture def getData(request): params = request.param # 直接读取对象属性使用即可 # do some data calls with params.date/params.biz_type etc. return params @pytest.mark.parametrize("getData", [QueryParams(date.today(), "pay", "new")], indirect=["getData"]) def test_data(getData): # do some tests with the data assert getData.biz_type == "pay"
内容的提问来源于stack exchange,提问作者MWBerlin
相关产品推荐
相关产品推荐

