我想为单个测试间接地参数化多个装置,这与“对特定参数应用间接”下的pytest documentation中描述的非常相似
测试代码大致如下所示:
import pytest
@pytest.fixture
def getDataA(request):
"""Expensive method to call data A (utilizing request.param)"""
if (request.param = "DetailedDataElementinA"):
return True
@pytest.fixture
def getDataB(request):
"""Expensive method to call data B (utilizing request.param)"""
if (request.param = "DetailedDataElementinB"):
return True
@pytest.mark.parametrize("getDataA, getDataB ", ["DetailedDataElementinA", " DetailedDataElementinB"], indirect=["getDataA ", "getDataB"])
def test_comparedata(getDataA, getDataB):
"""Test that compares specific elements (detailed in request param) of two data sets"""
assert(getDataA == getDataB)
我的问题是@pytest.mark.parametrize
。pytest文档中的示例仅使用一个间接参数化,而我使用两个间接参数化。我尝试了几种不同的语法结构,但迄今为止我没有成功,我收到了如下错误消息:
有人知道哪种语法可能有效吗
使用} for fixtures to indirectly parametrize 。但是,根据您当前的代码:
indirect=['getDataA', 'getDataB']
应该是可行的,因为它应该是pass a list or tuple of arguments’ names to ^{您有2个间接参数化装置,但在每次测试运行时,您只有1个参数值传递给它。^{} 的第二个参数应该是要传递给每个测试运行上的每个夹具的参数值:
第一次运行将尝试将仅
"DetailedDataElementinA"
传递到2个装置中,并将失败:因为它期望每个装置有2个值,1
按照方法的描述,由于存在2个装置,因此每个装置需要2个-元组值,1个值
(这里我简化了示例fixture,使fixture只返回param值,然后让断言无法看到
getDataA
和getDataB
的实际返回值)应该有3个测试(3个元组),每次运行时,索引
[0]
处的元组元素将传递给getDataA
,索引[1]
处的元组元素将传递给getDataB
,顺序与定义夹具的顺序相同:虽然这样做有效,但当你有很多固定装置时可能会出现问题,因为你必须自己列出所有不同的组合,而且依赖顺序也会让人困惑
您可以改为使用stack the parametrized tests,它将获得所有参数组合:
在这里,您可以简单地使用普通的
indirect=True
,参数值更清晰,仅用于getDataA
或仅用于getDataB
。参数化仍然遵循一个顺序:最里面的parametrize
d fixture也应该是传递给函数的最里面/第一个fixture。然后它会向外扩散运行该命令将导致:
您不是在特定参数上使用间接变量,而是在所有参数上使用间接变量,因此最简单的方法是使用
indirect=True
。除此之外,您的版本也应该工作,您的代码中只有几个错误主要问题是您提供了两个单独的值,它们被解释为用于参数化的两个不同的值。您必须提供值的元组,因为您有两个参数。在您的示例中,只有一个元组:
第二个问题是在字符串中放入一些随机空间。空格是字符串的一部分,但这也可能是您在复制代码时出错的原因(例如,您在fixture中使用的赋值而不是比较)
(这有助于将工作代码粘贴到问题中,否则很难理解什么是真正的错误,什么只是打字错误)
相关问题 更多 >
编程相关推荐