Python 是否可以使用夹具将测试参数化?
我想通过Python 是否可以使用夹具将测试参数化?,python,pytest,factory-boy,Python,Pytest,Factory Boy,我想通过@pytest.mark.parametrize不是特定的值而是装置。像这样 与以下人员进行了一次谈话: @pytest.fixture def name1(): return 'foo' @pytest.fixture def name2(): return 'bar' 在我的测试范围内.py 这当然有效: @pytest.mark.parametrize('name', ['foo', 'bar', 'baz']) def test_name(name):
@pytest.mark.parametrize
不是特定的值而是装置。像这样
与以下人员进行了一次谈话:
@pytest.fixture
def name1():
return 'foo'
@pytest.fixture
def name2():
return 'bar'
在我的测试范围内.py
这当然有效:
@pytest.mark.parametrize('name', ['foo', 'bar', 'baz'])
def test_name(name):
print(name)
这并不是:
@pytest.mark.parametrize('name', [name1, name2])
def test_name(name):
print(name)
我知道,在这个简单的例子中,我可以只创建一个名称fixture并将fixture参数化,但是在有些情况下,这是不可解的
我发现的一种解决方法是使用pytest\u factoryboy
的LazyFixture
。
但是,我经常无法在测试中访问lazyfixtures属性。我会坚持
在您的示例中,这相当于:
@pytest.fixture(params=['foo', 'bar'])
def name(request):
return request.param
def test_name(name):
print(name)
另一种选择:
@pytest.fixture(params=[1,2])
def name(name1, name2, request):
if request.param == 1:
return name1()
elif request.param == 2:
return name2()
def test_name(name):
print(name)
哪种方法最适合您将取决于您测试的具体情况,可能还取决于您可能试图利用哪些预先存在的装置。我真的不认为仅对装置进行参数化是不够的。然而,我想到的是这样的:
@pytest.mark.parametrize('name',[name1(),name2()])def test\u name(name):print(name)
。当然,这并不是你想要的,因为在本例中,fixture是标准函数,而不是fixture。pytest tracker对此有很长的历史,但到目前为止,还没有人对其进行过研究。