Pytest-如何使用不同的参数将不同的测试数据参数化发送到灯具?

时间:2019-10-07 09:29:03

标签: python pytest

我正在研究pyTest。因此,在这种情况下,同一个pyTest具有多个测试数据,但是,不同的测试数据在灯具中具有不同的设置。我浏览了pyTest的文档,并弄清楚了如何使用parametrized函数来独立完成这两个任务,如下所示:

对于数据驱动的测试数据: @pytest.mark.parametrize('valid_data', test_data, ids=test_data_ids) 在这种情况下,test_data是一个json文件,其中包含大约6种不同的测试数据,而test_data_ids是测试数据ID的列表。

然后将参数传递到夹具: @pytest.mark.parametrize('setup_person', [['student']], indirect=True)。在这种情况下,setup_person是我的灯具名称,student是灯具接受的参数之一。

但是,现在我需要将它们结合起来才能工作,但我找不到与此有关的任何文档或资源。我想要实现的是数据驱动测试,同时向夹具发送不同的参数。这是我的装置:

@pytest.fixture(params=['student', 'teacher', 'outsider'])
def setup_person(request):
    if request.param is 'student':
        setup = 'This is student.'
    elif request.param is 'teacher':
        setup = 'This is teacher.'
    elif request.param is 'outsider':
        setup = 'This is outsider'
    else:
        setup = 'Incorrect parameter passed'
    return setup

这是我的灯具外观的一个简单示例,如您所见,我在灯具中有3个参数,每个参数都会将不同的东西返回到测试中。

这是我的测试结果:

@pytest.mark.parametrize('setup_person', [['student']], indirect=True)
@pytest.mark.parametrize('valid_data', test_data, ids=test_data_ids)
def test_person(setup_person, valid_data):
    response = setup_person
    assert response == 'This is student.'

但是,当我尝试组合两个参数化函数时,似乎参数student仅在第一个参数运行时才传递一次,然后第二个参数与测试数据将不会传递{{1 }}和灯具也不会保存。

因此,当我运行测试时,它将导致总是进入student部分,因为当我运行测试数据参数化函数时,什么都没有通过。

是否还有其他方法可以将两个功能组合在一起,或者还有其他解决方法?感谢您的阅读,感谢您的帮助!

2 个答案:

答案 0 :(得分:1)

我认为您只是通过使用列表中的列表在第一个@pytest.mark.parametrize装饰器中犯了一个错误。像这样的简单列表:

@pytest.mark.parametrize('setup_person', ['student'], indirect=True)
@pytest.mark.parametrize('valid_data', test_data, ids=test_data_ids)

...应该从第一个parametrize装饰器(在这种情况下,student将始终传递到Fixture函数)和第二个parametrize装饰器产生值的所有可能组合这意味着test_data包含的内容。

答案 1 :(得分:0)

我通常使用此类:

class parameterized:
    '''
    Use this decorator on test methods like this:
    @parameterized(actual=[5,6],expected=[5,6])
    def test3(self, actual, expected):
        self.shouldEqual(actual,expected)

    The example uses parameters actual and expected, but they can be anything you like, as long
    as the parameters match in number and name.
    This decorator uses unittest.TestCase.subTest to separately markup every failing test.
    '''
    def __init__(self, **kwargs):
        self.kwargs = kwargs

    def __call__(self, fn):
        def test_wrapped(itself):
            size = len(self.kwargs[list(self.kwargs.keys())[0]])
            for index in range(size):
                test_method_parameters = {k: self.kwargs[k][index] for k in self.kwargs}
                with itself.subTest(**test_method_parameters):
                    fn(itself, **test_method_parameters)

        return test_wrapped

我将其与unittest结合使用,因此由于使用pytest,我不确定它是否可以与subTest一起使用。

来源:https://bitbucket.org/teamqu/qutest/src/default/Test.py