Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/286.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Pytest在一个函数中使用同一夹具两次_Python_Dependency Injection_Pytest_Fixtures - Fatal编程技术网

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

Python Pytest在一个函数中使用同一夹具两次,python,dependency-injection,pytest,fixtures,Python,Dependency Injection,Pytest,Fixtures,对于我的web服务器,我有一个loginfixture,用于创建用户并返回发送请求所需的标题。对于某个测试,我需要两个用户。如何在一个函数中使用同一夹具两次 from test.fixtures import login class TestGroups(object): def test_get_own_only(self, login, login): pass 我使用Dummy类来实现夹具功能。那就从你的测试中调用它。提供澄清方法名称,以便更好地理解您的测

对于我的web服务器,我有一个
login
fixture,用于创建用户并返回发送请求所需的标题。对于某个测试,我需要两个用户。如何在一个函数中使用同一夹具两次

from test.fixtures import login


class TestGroups(object):

    def test_get_own_only(self, login, login):
         pass

我使用
Dummy
类来实现夹具功能。那就从你的测试中调用它。提供澄清方法名称,以便更好地理解您的测试在做什么。


另一种方法是复制fixture函数。这既简单又正确地处理了参数化的fixture,使用两个fixture的所有参数组合调用test函数。下面的示例代码引发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_会话是另一个装置):


我是这样做的:

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.parametize,因此:

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

因为fixture是按函数缓存的,所以我看不出一种简单的方法。我想最好的解决方案是有一个
\u login
函数,然后是一个
login1
login2
装置,这两个装置都可以
返回
左右。不幸的是,如果
首先通过它所依赖的装置对其进行参数化,这是没有帮助的。
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
    ...
@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}]