2012-09-25 4 views
42

py.test를 사용하면 다른 디렉토리에서 동일한 테스트를 수행하여 py.test가 실패하게됩니다. 왜 그런가요? 모든 테스트의 이름을 바꾸지 않고 어떻게 변경할 수 있습니까? 복제py.test - 다른 디렉토리의 테스트가 동일하게 호출 될 때 테스트 검색 실패

는 수행

; cd /var/tmp/my_test_module 
; mkdir -p ook/test   
; mkdir -p eek/test 
; touch ook/test/test_proxy.py 
; touch eek/test/test_proxy.py 
; py.test 
============================= test session starts ============================== 
platform linux2 -- Python 2.7.3 -- pytest-2.2.4 
collected 0 items/1 errors 

==================================== ERRORS ==================================== 
___________________ ERROR collecting ook/test/test_proxy.py ____________________ 
import file mismatch: 
imported module 'test_proxy' has this __file__ attribute: 
    /home/ygolanski/code/junk/python/mymodule/eek/test/test_proxy.py 
which is not the same as the test file we want to collect: 
    /home/ygolanski/code/junk/python/mymodule/ook/test/test_proxy.py 
HINT: remove __pycache__/.pyc files and/or use a unique basename for your test file modules 
=========================== 1 error in 0.01 seconds ============================ 

답변

30

__init__.py 충돌을 해결하는 방법 중 하나입니다 퍼팅. 코와 달리 현재 pytest는 동일한 가져 오기 이름으로 테스트 모듈을 가져 오기 위해 테스트 모듈을 언로드하려고하지 않습니다. 나는 이것이 자동 unimporting을하는 약간 마술이라고 생각 했었고 수입 메커니즘이하는 것에서 사람들의 기대를 엉망으로 만들었다. 때로는 사람들이 테스트 모듈의 전역 상태에 의존하고 자동 언로드를하면 잃게됩니다 (다른 테스트 모듈에서 가져 오는 테스트 모듈은 예기치 않은 일을 할 수 있습니다). 그러나 실제적인 이슈가 아니므로 pytest는 비슷한 해킹을 추가 할 수 있습니다 ...

+2

나는 __init__.py를 요구하는 것이 합리적이라는 데 동의합니다. 테스트가 패키지에없는 경우, 본질적으로 최상위 모듈 (OP의 test_proxy)이며 하나만 있어야합니다. 테스트 모듈을 관련 패키지 (ook 및 eek)에 넣음으로써 테스트의 적절한 네임 스페이스를 제공합니다. 나는 현상 유지가 최고라고 말한다. 이 질문에 대한 오류 메시지 링크 또는 문제 해결을위한 추론과 기술을 설명하는 문서의 일부가 통증을 완화 할 수 있습니다. –

+20

py.test docs는 테스트 디렉토리에'__init __. py'를 넣지 말 것을 권장합니다 : _ "__init __. py' 파일을 테스트 디렉토리에 넣지 마십시오. 이렇게하면 설치된 mypkg 버전에 대해 테스트를 쉽게 실행할 수 있습니다. 설치된 패키지에 테스트가 포함되어 있는지 여부와는 독립적으로 "_. [pytest.org - Good Integration Practices] (http://pytest.org/latest/goodpractises.html#choosing-a-test-layout-import-rules)에서 가져 왔습니다. – famousgarkin

+1

업데이트 : 위의 @ famousgarkin의 의견과 answer (https://stackoverflow.com/a/21942491/260303)의 권장 사항은 더 이상 문서에 나타나지 않습니다. (최소한 "피하는"은 견적을 제기하지 않습니다. 위) : https://docs.pytest.org/en/latest/goodpractices.html#tests-as-part-of-application-code. 사실,이 링크의 예제는 테스트 디렉토리에'__init __. py'를 보여 주므로, 받아 들인 대답이 정확한 것 같습니다. –

14

이것은 py.test의 실제 기능입니다. 당신은 pytest.org - Good Integration Practices - Choosing a test layout/import rules에 명시된이 문제에 대한 이유를 찾을 수 있습니다 테스트 디렉토리에

  • 피할 __init__.py 파일을. 이렇게하면 설치된 패키지에 테스트가 포함되어 있는지 여부와 관계없이 설치된 버전 mypkg에 대해 테스트를 쉽게 실행할 수 있습니다. 과

는 py.test 작업의 권장 워크 플로 : 테스트 후, pip install -e으로 개발 패키지를 설치합니다.

이 때문에 필자는 구성 방식에 따라 고유 한 테스트 이름을 선택했습니다. 또한 다양한 테스트 실행 결과에서 모호한 테스트 이름을 사용하지 않도록합니다.

테스트 이름을 유지해야하고 위에서 언급 한 기능에 신경 쓰지 않는다면 __init__.py을 넣으면됩니다.

+0

유스 케이스를 얻지 못했습니다 : "이 방법은 설치된 버전의 mypkg에 대해 테스트를 쉽게 실행할 수 있습니다". 내 개발 버전의'mypkg'에 대해 테스트를합니다. 이 방법은 테스트가 존재합니다. 이 "unique basename"오류 메시지를 피하기 위해'__init __. py' 파일을 만듭니다. – guettli

+1

문서를 변경하는 기능 요청을 만들었습니다 : https : // bitbucket.org/hpk42/pytest/issue/529/unique-basename-and -__ init__py-docs – guettli

+1

@guettli 유스 케이스는 setup.py를 통해 설치된 패키지를 테스트하려는 경우입니다. 이것은 번들 된 데이터와 같이 모든 필수 파일을 설치에 포함하고 모든 종속성이 올바르게 처리되도록하기 위해 사용할 수 있습니다. 또한 대상 시스템에 컴파일러가없고 설치에 바이너리 달걀이나 휠을 사용하려는 환경에도 설치할 수 있습니다. –