2014-08-28 3 views
6

조명기에서 여러 테스트/테스트 클래스로 값을 반환 할 수 있기를 원하지만 전달 된 값은 함수입니다.pytest fixture는 항상 함수를 반환합니다.

=================================== FAILURES =================================== 
_____________________________ TestThings.test_user _____________________________ 

self = <tests.test_again.TestThings instance at 0x10aed6998> 

    def test_user(self): 
>  assert user_setup['name'] == 'chad' 
E  TypeError: 'function' object has no attribute '__getitem__' 

tests/test_again.py:14: TypeError 
=========================== 1 failed in 0.02 seconds =========================== 

그러나이 usefixtures 장식을 사용하지 않도록 내 테스트를 다시 작성하는 경우, 그것은 예상대로 작동 :

import pytest 

@pytest.fixture() 
def user_setup(): 
    user = { 
     'name': 'chad', 
     'id': 1 
    } 
    return user 

@pytest.mark.usefixtures('user_setup') 
class TestThings: 
    def test_user(self): 
     assert user_setup['name'] == 'chad' 

출력은 다음과 같습니다

여기

내 코드입니다
def test_user(user_setup): 
    assert user_setup['name'] == 'chad' 

데코레이터 메서드를 사용하려고 할 때 작동하지 않는 이유는 무엇입니까?

답변

13

같은 결과를 첨자 할 말은 생각 테스트 기능. 의 입력 인자로 고정구 함수의 이름은 나중에 미리 테스트 실행의 호출을 야기하기를 참조 할 수

... 테스트 기능을 직접 사용할 수 조명기 이름 다음 py.test docs for fixtures 한 바와 같이

이 경우 조명기 함수에서 반환 된 조명기 인스턴스 이 삽입됩니다.

따라서 @pytest.mark.usefixtures 데코레이터를 사용하면 함수가 호출됩니다. 입력 인수를 제공하면 해당 함수의 결과를 얻을 수 있습니다.

조명기를 호출하기를 원하지만 테스트의 입력 인수로 사용하지 않으려는 경우에만 @pytest.mark.usefixtures을 사용해야합니다. py.test docs에 설명 된대로

user_setup에 대해 이야기하는 예외가 발생하는 이유는 test_user 함수 내에서 user_setup 함수가 실제로 파일에서 앞에서 정의한 함수를 참조하기 때문입니다. 이름 user_setup이 반환되는 함수 인수를 참조 할 test_user 기능의 관점에서 지금

@pytest.mark.usefixtures('user_setup') 
class TestThings: 
    def test_user(self, user_setup): 
     assert user_setup['name'] == 'chad' 

: 코드는 당신이 test_user 함수에 인수를 추가해야합니다 예상대로 작동하도록하려면 py.test에 의해 주입 된 조명기의 값.

하지만 실제로는 @pytest.mark.usefixtures 데코레이터를 사용할 필요가 없습니다.

+2

어떻게 작동하는지 명확히 설명해 주셔서 감사합니다. 내 테스트 클래스에있는 각 테스트 함수에 인수를 추가하지 않고도이 작업을 수행 할 수 있다고 생각했습니다. – Cass

+0

나는이 두 변종의 차이점 및/또는 유스 케이스를 찾고 있었는데,이 두 가지 변종을 언제 사용하는지,이 설명에 감사드립니다. – Zelphir

+0

공식 문서에 따르면'@ pytest.mark.usefixtures'로 장식 된 클래스로 그룹화 될 때 각 테스트 함수에'user_setup '을 추가해서는 안됩니다 : "usefixtures 마커로 인해, 각 테스트 메소드의 실행에 cleandir fixture가 필요합니다. 각 메소드에 "cleandir"함수 인수를 지정한 것과 같습니다. "(출처 : http://pytest.org/latest/fixture.html#using-fixtures -from-classes-modules-or-projects) 결국, 이런 그룹화 테스트의 전체 요점은 일괄 처리로 그룹화하는 것입니다.) ... 아마도 이것은 pytest 버그입니까? – Zearin

-1

두 경우 모두 범위 user_setup은 기능을 나타냅니다. 차이점은 비 정착 버전에서는 같은 이름의 매개 변수를 작성하는 것이고 이는 혼란을 방지하는 고전적인 방법입니다.

test_user 범위의 비 고정 버전에서는 사용자의 user_setup 식별자가 전역 범위의 기능이 아니라 전달 중인지 여부를 나타냅니다.

나는 당신이 @pytest.mark.usefixtures 마커를 사용하면 당신은 아마 당신은 아직도 당신이 그기구가 주입되도록하려는 경우, 비슷한 이름의 입력 인수를 제공 할 필요가 user_setup를 호출하고

assert user_setup()['name'] == 'chad' 
관련 문제