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