2016-07-20 8 views
1

거의 동일한 설정을 필요로하는 여러 개의 pytest 테스트 케이스가 있으므로 DRT를 유지하기 위해 fixture를 다시 사용하도록하고 싶습니다. 설정은 외부 티켓 추적 시스템에 새 티켓을 작성한 다음 테스트 케이스가 데이터를 기반으로 티켓과 상호 작용하고 최종적으로 티켓을 닫아 클린업합니다. 여기서의 도전 과제는 각 테스트 케이스가 티켓에서 준비되는 약간 다른 데이터를 필요로한다는 것입니다.pytest yieldt fixture에서 request.function을 사용할 때 AttributeError

각 테스트 케이스는 서로 다른 호출과 서로 다른 어설 션을 가지므로 단일 테스트 픽스처로 단일 매개 변수화 된 테스트 케이스에 모두 결합 할 수는 없습니다. 조명기 자체를 파라미터 화하면 모든 테스트 케이스가 조명기 데이터의 모든 순열을 실행하게되어 무관 한 테스트 실패로 끝납니다.

테스트 케이스에 변수를 설정 한 다음 해당 변수를 사용하여 티켓을 만들 때 테스트 데이터를 설정합니다. 나는 pytest fixture docs에 지정된 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 

내 코드는 다음과 같습니다

import pytest 


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


@pytest.yield_fixture 
def ticket(request): 
    ticket_summary = getattr(request.function, "summary") 
    new_ticket = ticket_system_api(summary=ticket_summary) 
    yield new_ticket 


class TestMCVE: 
    def test_stuff(self, ticket): 
     summary = 'xyz' 
     # do real things here, except MCVE 
     assert 'xyz' == ticket 

내가 request.node 대신 request.function뿐만 아니라 binding the summary variable per this answer를 사용하여 시도했다, 변경 summary = 'xyz' to test_stuff.summary = 'xyz'하지만 여전히 동일한 AttributeError로 실패합니다.

어떻게 함수 레벨 데이터를 조명기에 전달할 수 있습니까?

+1

문은 "티켓"고정에 항복하기 전에 다음 "요약"개체 – AlokThakur

+0

의 창조 이전에 실행 될'ticket' 테스트 기능보다 먼저 실행됩니다. 조명기 실행이 완료되면'summary'가 초기화됩니다. 당신은 fixture 대신에'ticket '을 일반적인 함수로 사용할 수 없습니까? –

답변

1

indirect parametrization으로이를 수행 할 수 있습니다. 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'