接口方法中包含多个参数
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 的问题。
首先,我们需要确认几件事情:
-
project_query_api.get_project_list
的签名:确保你了解这个函数期望什么类型的参数。如果它期望六个单独的位置参数,那么你不能直接将request.param
(一个元组)作为单个参数传递给它。 -
data
的内容:确保data
中的每个元素都是一个包含六个元素的元组,这些元素与project_query_api.get_project_list
所需的参数相对应。 -
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
参考文心一言