Pytest在一个函数中使用相同的夹具两次

时间:2016-03-19 10:38:14

标签: python dependency-injection pytest fixtures

对于我的Web服务器,我有一个login fixture来创建用户并返回发送请求所需的头。对于某个测试,我需要两个用户。如何在一个功能中两次使用相同的夹具?

from test.fixtures import login


class TestGroups(object):

    def test_get_own_only(self, login, login):
         pass

5 个答案:

答案 0 :(得分:7)

另一种方法是复制夹具功能。这既简单又正确处理参数化夹具,使用两个夹具的所有参数组合调用测试功能。下面的示例代码引发了9个断言:

import pytest

@pytest.fixture(params=[0, 1, 2])
def first(request):
    return request.param

second = first

def test_double_fixture(first, second):
    assert False, '{} {}'.format(first, second)

答案 1 :(得分:4)

我使用Dummy类来实现夹具功能。然后从测试中调用它。提供澄清方法名称以更好地了解您的测试操作。

import pytest

@pytest.fixture
def login():
    class Dummy:
        def make_user(self):
            return 'New user name'
    return Dummy()

def test_something(login):
    a = login.make_user()
    b = login.make_user()
    assert a == b

答案 2 :(得分:3)

诀窍是使用mark.parametrize和"间接"切换,因此:

@pytest.fixture
def data_repeated(request):
    return [deepcopy({'a': 1, 'b': 2}) for _ in range(request.param)]


@pytest.mark.parametrize('data_repeated', [3], indirect=['data_repeated'])
def test(data_repeated):
    assert data_repeated == [
        {'a': 1, 'b': 2},
        {'a': 1, 'b': 2},
        {'a': 1, 'b': 2}]

答案 3 :(得分:0)

我需要我的测试直接调用fixture来覆盖当前的实例化结果,所以我写了一个抽象层,其中包含对我所有灯具的引用:

def call_fixture(fixture, session=''):
    return {
        'fixture_name': fixture_name(session),
    }[fixture]

用(get_session是另一个夹具)调用:

call_fixture('fixture_name', get_session)

答案 4 :(得分:0)

我这样做了:

limits = [10, 20, 30]

@pytest.fixture(params=limits)
def number(request):
    return random.randint(request.param)

@pytest.fixture(params=limits)
def two_numbers(request):
    return number(request), number(request)

def test_numbers(two_numbers):
    num_1, num_2 = two_numbers
    ...