这里我使用这个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_network
,fixture_user_create_iprange
,它只在测试中运行一次。我只有一个网络对象。
所以我想知道,
答案 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}]