Pytest 在一个函数中两次使用相同的夹具
Pytest use same fixture twice in one function
对于我的网络服务器,我有一个 login
创建用户的装置和 returns 发送请求所需的 headers。对于某个测试,我需要两个用户。我怎样才能在一个函数中使用相同的夹具两次?
from test.fixtures import login
class TestGroups(object):
def test_get_own_only(self, login, login):
pass
我用 Dummy
class 来实现,这将实现夹具功能。然后从你的测试中调用它。提供明确的方法名称以更好地了解您的测试在做什么。
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
另一种方法是复制 fixture 函数。这既简单又正确地处理了参数化的装置,调用了带有两个装置的所有参数组合的测试函数。下面的示例代码提出了 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)
我需要我的测试直接调用 fixture 来覆盖当前的实例化结果,所以我写了一个包含对我所有 fixture 的引用的抽象层:
def call_fixture(fixture, session=''):
return {
'fixture_name': fixture_name(session),
}[fixture]
调用(get_session 是另一个夹具):
call_fixture('fixture_name', get_session)
我是这样做的:
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
...
诀窍是将 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}]
对于我的网络服务器,我有一个 login
创建用户的装置和 returns 发送请求所需的 headers。对于某个测试,我需要两个用户。我怎样才能在一个函数中使用相同的夹具两次?
from test.fixtures import login
class TestGroups(object):
def test_get_own_only(self, login, login):
pass
我用 Dummy
class 来实现,这将实现夹具功能。然后从你的测试中调用它。提供明确的方法名称以更好地了解您的测试在做什么。
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
另一种方法是复制 fixture 函数。这既简单又正确地处理了参数化的装置,调用了带有两个装置的所有参数组合的测试函数。下面的示例代码提出了 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)
我需要我的测试直接调用 fixture 来覆盖当前的实例化结果,所以我写了一个包含对我所有 fixture 的引用的抽象层:
def call_fixture(fixture, session=''):
return {
'fixture_name': fixture_name(session),
}[fixture]
调用(get_session 是另一个夹具):
call_fixture('fixture_name', get_session)
我是这样做的:
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
...
诀窍是将 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}]