如何使用 pytest 在测试用例中运行固定装置两次?

Roc*_*ang 5 python pytest

这里我使用这个固定装置生成一个带有 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
Run Code Online (Sandbox Code Playgroud)

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

因为这 2 个装置也使用fixture_user_create_network, fixture_user_create_iprange,在测试中只运行一次。我只有一个网络对象。

所以我想知道,

  • 如果我可以让灯具在测试中运行两次,或者
  • 我是否可以根据需要随时在测试用例中调用夹具。

Ser*_*yev 1

您不能运行同一个装置两次。这违背了赛程的概念。

但是,您可以将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'
Run Code Online (Sandbox Code Playgroud)

但每次测试仍然只能进行一次。

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

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
Run Code Online (Sandbox Code Playgroud)

让我们检查:

$ 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
Run Code Online (Sandbox Code Playgroud)