【问题标题】:Pytest skip test with certain parameter value具有特定参数值的 Pytest 跳过测试
【发布时间】:2018-01-22 10:01:53
【问题描述】:

我有一些想要参数化的测试,但有些测试只能应用于参数的一个值。下面举一个具体的例子,我想将参数onetwo应用到test_A,但只提供参数onetest_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 中正确编码:

@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

【问题讨论】:

    标签: python unit-testing pytest


    【解决方案1】:

    根据您的回答,如果您不想运行测试,可以检查输入并致电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')
    

    【讨论】:

    • 如果我将测试分成两个单独的类,参数化是否仍适用于 TestA?
    • 是的,你的data 夹具是一个参数化的测试夹具,它将保持参数化。当您在另一个夹具中使用参数化测试夹具时,参数化会“延续”。使用多个参数化夹具会生成所有结果排列。这个答案给出了一些更复杂的例子:stackoverflow.com/a/22390931/1812727
    【解决方案2】:

    我找到了一个可行的解决方案,但我也欢迎更多解决方案,因为这感觉有点“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'
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-03-24
      • 1970-01-01
      • 1970-01-01
      • 2013-03-28
      • 1970-01-01
      • 2022-12-08
      • 1970-01-01
      • 2018-02-24
      相关资源
      最近更新 更多