fixture参数化多个参数

接口方法中包含多个参数

def get_project_list(project_type, contract_no, internal_contractNo, applicant_deptname, project_code,
                      project_name):
    """获取项目信息列表"""
    params = {
        "current": constant.CURRENT,
        "size": constant.SIZE,
        "contractNo": contract_no,
        "internalContractNo": internal_contractNo,
        "applicantDeptName": applicant_deptname,
        "orgProjectType": project_type,
        "projectCode": project_code,
        "projectName": project_name
    }
    return request(path, 'GET', body=params)

参数取值

data = [
    ('', '', '', '', '', ''),
    ('GCXM', '', '', '', '', ''),
    ('SQXM', '', '', '屯留-武乡县', '', ''),
    ('', '', '', '', 'GG240027', ''),
    ('', '', 'S240686', '', '', '')
]

正确写法

fixture参数化 把参数分别对应到每一个data值

@pytest.fixture(scope='class',params=data)
def get_project_list(request):
    project_list = project_query_api.get_project_list(
        request.param[0],  # project_type
        request.param[1],  # contract_no
        request.param[2],  # internal_contractNo
        request.param[3],  # applicant_deptname
        request.param[4],  # project_code
        request.param[5]   # project_name
    )
    # 如果你还需要返回原始的项目信息,你可以这样做:
    return request.param, project_list

报错情况

直接将多个参数当成一个参数使用报错

@pytest.fixture(scope='class',params=data)
def get_project_list(request):
    return request.param, project_query_api.get_project_list(request.param)

报错信息:

解析

这里的错误信息 TypeError: get_project_list() missing 5 required positional arguments 实际上是非常误导人的,因为它看起来像是 get_project_list fixture 本身缺少了参数,但实际上这个错误是指向了一个完全不同的函数或方法,很可能是 project_query_api.get_project_list。然而,由于错误信息的格式和上下文,它可能被错误地解释为 get_project_list fixture 的问题。

首先,我们需要确认几件事情:

  1. project_query_api.get_project_list 的签名:确保你了解这个函数期望什么类型的参数。如果它期望六个单独的位置参数,那么你不能直接将 request.param(一个元组)作为单个参数传递给它。

  2. data 的内容:确保 data 中的每个元素都是一个包含六个元素的元组,这些元素与 project_query_api.get_project_list 所需的参数相对应。

  3. fixture 的实现:你的 fixture 实现看起来是正确的,假设 project_query_api.get_project_list 能够接受一个元组作为参数(尽管这通常不是函数期望的,因为函数通常期望单独的位置参数或关键字参数)。

现在,让我们假设 project_query_api.get_project_list 实际上需要六个单独的位置参数,而不是一个元组。在这种情况下,你不能直接传递 request.param。相反,你应该在调用 project_query_api.get_project_list 时解包 request.param。但是,由于你已经在 fixture 内部解包过了,你实际上不需要再次解包它;你只需要确保你传递的是正确的参数。

@pytest.fixture(scope='class', params=data)  
def get_project_list(request):  
    # 这里不需要再次解包 request.param,因为它已经在装饰器中被解包为 fixture 的参数  
    # 但由于 project_query_api.get_project_list 需要单独的参数,我们需要直接传递它们  
    # 注意:这里我们不再返回 request.param,因为它是一个元组,而函数需要的是单独的参数  
    project_list = project_query_api.get_project_list(  
        request.param[0],  # project_type  
        request.param[1],  # contract_no  
        request.param[2],  # internal_contractNo  
        request.param[3],  # applicant_deptname  
        request.param[4],  # project_code  
        request.param[5]   # project_name  
    )  
    # 如果你还需要返回原始的项目信息,你可以这样做:  
    return request.param, project_list

参考文心一言

  • 3
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值