Pytest跳过测试,具有一定的参数值

时间:2017-08-14 14:18:52

标签: python unit-testing pytest

我有要参数化的测试,但是某些测试只应该应用于参数的一个值。为了给出一个具体的例子,我想将参数twotest_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()

2 个答案:

答案 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'