Python 在pytest中使用request.function时的AttributeError

Python 在pytest中使用request.function时的AttributeError,python,pytest,fixtures,Python,Pytest,Fixtures,我有几个pytest测试用例,它们需要几乎相同的设置,所以我想让它们重用一个夹具来保持干燥。设置包括在外部票证跟踪系统中创建一个新票证,然后测试用例根据数据与票证交互,最后夹具通过关闭票证进行清理。这里的挑战是,每个测试用例需要在票据中准备稍有不同的数据 每个测试用例都有不同的调用和不同的断言,所以我不能用一个测试夹具将它们组合成一个参数化的测试用例。参数化夹具本身将导致每个测试用例运行夹具数据的每个排列,这最终导致许多不相关的测试失败 我想做的是在测试用例中设置一个变量,然后让夹具在创建票据时

我有几个pytest测试用例,它们需要几乎相同的设置,所以我想让它们重用一个夹具来保持干燥。设置包括在外部票证跟踪系统中创建一个新票证,然后测试用例根据数据与票证交互,最后夹具通过关闭票证进行清理。这里的挑战是,每个测试用例需要在票据中准备稍有不同的数据

每个测试用例都有不同的调用和不同的断言,所以我不能用一个测试夹具将它们组合成一个参数化的测试用例。参数化夹具本身将导致每个测试用例运行夹具数据的每个排列,这最终导致许多不相关的测试失败

我想做的是在测试用例中设置一个变量,然后让夹具在创建票据时使用该变量来设置测试数据。我已尝试使用中指定的
request.function
,但我一直得到:

=================================== ERRORS ===================================
    ____________________ ERROR at setup of TestMCVE.test_stuff ___________________

request = <SubRequest 'ticket' for <Function 'test_stuff'>>

    @pytest.yield_fixture
    def ticket(request):
>       ticket_summary = getattr(request.function, "summary")
E       AttributeError: 'function' object has no attribute 'summary'

tests\test_mcve.py:11: AttributeError
我尝试过使用
request.node
而不是
request.function
以及将
summary='xyz'
更改为
test\u stuff.summary='xyz'
,但仍然失败,属性错误相同


如何将功能级别的数据传递给夹具?

您可以使用。API(和文档)可能更友好,但您想要的功能就在那里

您的示例非常接近,需要进行一些小的调整。看一看:

import pytest


def ticket_system_api(summary):
    # stub for MCVE purposes
    return summary


@pytest.fixture
def ticket(request):
    # NOTE: This will raise `AttributeError` if the fixture
    # doesn't receive a parameter.
    ticket_summary = request.param
    new_ticket = ticket_system_api(summary=ticket_summary)
    return new_ticket


class TestMCVE:
    @pytest.mark.parametrize('ticket', ('abc',), indirect=True)
    def test_abc(self, ticket):
        # do real things here, except MCVE
        assert ticket == 'abc'

    @pytest.mark.parametrize('ticket', ('xyz',), indirect=True)
    def test_xyz(self, ticket):
        # do real things here, except MCVE
        assert ticket == 'xyz'

“ticket”fixture中屈服之前的语句将在创建“summary”object之前执行这里,
ticket
将比test function先执行。夹具执行完成后,
摘要
将被初始化。你不能用
ticket
来代替fixture吗?
import pytest


def ticket_system_api(summary):
    # stub for MCVE purposes
    return summary


@pytest.fixture
def ticket(request):
    # NOTE: This will raise `AttributeError` if the fixture
    # doesn't receive a parameter.
    ticket_summary = request.param
    new_ticket = ticket_system_api(summary=ticket_summary)
    return new_ticket


class TestMCVE:
    @pytest.mark.parametrize('ticket', ('abc',), indirect=True)
    def test_abc(self, ticket):
        # do real things here, except MCVE
        assert ticket == 'abc'

    @pytest.mark.parametrize('ticket', ('xyz',), indirect=True)
    def test_xyz(self, ticket):
        # do real things here, except MCVE
        assert ticket == 'xyz'