我有要参数化的测试,但是某些测试只应该应用于参数的一个值。为了给出一个具体的例子,我想将参数two
和test_A
应用于one
,但只将参数test_B
提供给@pytest.fixture(params=['one', 'two'])
def data(request):
if request.param == 'one'
data = 5
return data
def test_A(data):
assert True
def test_B(data):
assert True
。
当前代码
@pytest.fixture(params=['one', 'two'])
def data(request):
data = 5
return data
def test_A(data):
assert True
@pytest.skipif(param=='two')
def test_B(data):
assert True
期望的结果
我基本上想要这样的东西,但我无法弄清楚如何在pytest中正确编码:
import threading
def siren_loop(running):
while running:
print 'dit is een print'
t = threading.Thread(target=siren_loop, kwargs=dict(running=True))
t.start()
答案 0 :(得分:8)
根据您的回答,您可以查看输入,如果您不希望测试运行,请致电pytest.skip()
。
您可以在测试中进行检查:
def test_A(data):
assert True
def test_B(data):
if data.param == 'two':
pytest.skip()
assert 'foo' == 'foo'
或者您可以在子类中重新定义测试夹具:
class TestA:
def test_A(self, data):
assert True
class TestB:
@pytest.fixture
def data(self, data):
if data.param == 'two':
pytest.skip()
return data
def test_B(self, data):
assert 'foo' == 'foo'
另一个小建议:你的Data
类可以用一个命名元组替换,即
import collections
Data = collections.namedtuple('Data', 'data, param')
答案 1 :(得分:1)
我找到了一个有效的解决方案,但是我也欢迎更多的解决方案,因为这感觉有点" hacky":
class Data:
def__init__(self, data, param):
self.data = data
self.param = param
@pytest.fixture(params=['one', 'two'])
def data(request):
data = 5
return Data(data, request.param)
def test_A(data):
assert True
def test_B(data):
if data.param == 'two':
assert True
else:
assert 'foo' == 'foo'