如何使用pytest在测试用例中运行两次夹具?

时间:2017-06-24 06:48:28

标签: python pytest

这里我使用这个fixture来生成一个带有iprange的网络obj。虽然在某些情况下,我需要在同一测试中生成2个不同的网络。

@pytest.fixture(scope="function")
def fixture_user_create_network_with_iprange(get_user_token,
                                          fixture_user_create_network,
                                          fixture_user_create_iprange,
                                          request):
    token = get_user_token
    network_uuid = fixture_user_create_network
    iprange_uuid = fixture_user_create_iprange
    add_ipranges_to_networks(token,network_uuid,iprange_uuid)

    return network_uuid

但在同一测试中,灯具只能运行一次。我创建了另一个名为fixture_user_create_ 2nd _network_with_iprange的夹具,它是原始夹具的副本,但名称不同。

由于这2个灯具也使用fixture_user_create_networkfixture_user_create_iprange,它只在测试中运行一次。我只有一个网络对象。

所以我想知道,

  • 如果我可以在测试中使灯具运行两次,或
  • 如果我可以随时在测试用例中调用夹具。

2 个答案:

答案 0 :(得分:0)

你不能两次运行一个夹具。这违背了灯具的概念。

但是,你可以将network_uuid准备提取到一个函数中(只是函数),并声明2个以上的函数来调用它。

您也可以动态调用灯具:

@pytest.fixture
def fixt1(request):
    return 'hello'

@pytest.fixture
def fixt2(request):
    return request.getfuncargvalue('fixt1')

def test_me(fixt2):
    assert fixt2 == 'hello'

但是,每次测试只有一次。

如果你想要一个动态数量的类似灯具,你可以生成它们:

import pytest

# Just for proper var closures:
def _make_fixt_fn(i):
    @pytest.fixture
    def fixt_fn(....):
        return 'fixt{}'.format(i)
    return fixt_fn

# The fixtures must reside in the module's namespace. The decorator is just a mark.
for i in range(1, 4):
    name = 'dyn_fixt_{}'.format(i)
    global()[name] = _make_fixt_fn(i)

def test_dyn(dyn_fixt_1, dyn_fixt_2, dyn_fixt_3):
    pass

让我们检查:

$ pytest test_dyn.py --fixtures
...
------- fixtures defined from test_dyn ----------
dyn_fixt_1
    test_dyn.py:6: no docstring available
dyn_fixt_2
    test_dyn.py:6: no docstring available
dyn_fixt_3
    test_dyn.py:6: no docstring available

答案 1 :(得分:0)

你可以使用mark.parametrize和“indirect”开关来允许将基数参数传递给你的灯具,然后只返回它的副本数量:

@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}]