[python] pytest ‘ImportError : No YadaYadaYada’라는 모듈이없는 PATH 문제

easy_install을 사용하여 Mac에 pytest를 설치하고 파일 구조가 다음과 같은 프로젝트에 대한 테스트 작성을 시작했습니다.

repo/
repo/app.py
repo/settings.py
repo/models.py
repo/tests/
repo/tests/test_app.py

py.testrepo 디렉토리에서 실행 하면 모든 것이 예상대로 작동합니다.

그러나 Linux 또는 Windows에서 동일한 것을 시도하면 (둘 다 pytest 2.2.3이 있음) 내 응용 프로그램 경로에서 처음으로 가져 오기 할 때마다 짖습니다. 예를 들어from app import some_def_in_app

이 시스템에서 py.test를 실행하려면 PATH를 편집해야합니까? 누구든지 이것을 경험 했습니까?



답변

예, cdtests 디렉토리 로 가면 소스 폴더가 Python의 경로에 없습니다 .

두 가지 선택이 있습니다 :

  1. 테스트 파일에 다음과 같은 경로를 수동으로 추가하십시오.

    import sys, os
    myPath = os.path.dirname(os.path.abspath(__file__))
    sys.path.insert(0, myPath + '/../')
  2. env var로 테스트를 실행하십시오 PYTHONPATH=../.


답변

py.test가 PYTHONPATH 자체에 현재 디렉토리를 추가하지 않는 이유는 확실하지 않지만 다음은 해결 방법입니다 (저장소 루트에서 실행).

python -m pytest tests/

파이썬이 PYTHONPATH에 현재 디렉토리를 추가하기 때문에 작동합니다.


답변

conftest 해결책

최소 침습적 솔루션라는 빈 파일을 추가하고 conftest.py에서 repo/디렉토리를 :

$ touch repo/conftest.py

그게 다야. 맹 글링하기 위해 커스텀 코드를 작성할 필요가 없으며 , sys.path드래그 PYTHONPATH하거나 __init__.py자신이 속해 있지 않은 디렉토리에 배치 해야합니다.

이후 프로젝트 디렉토리 :

repo
├── conftest.py
├── app.py
├── settings.py
├── models.py
└── tests
     └── test_app.py

설명

pytest에 대한 외모 conftest테스트 컬렉션 모듈은 사용자 정의 후크 및 비품을 수집하고, 그들로부터 사용자 정의 개체를 가져하기 위해하기 pytest의 상위 디렉토리에 추가 conftest.py받는 사람sys.path (이 경우 repo디렉토리).

다른 프로젝트 구조

다른 프로젝트 구조가 conftest.py있는 경우 패키지 루트 디렉토리 (패키지를 포함하지만 패키지 자체는 아니므로)를 포함 하지 않는 루트 디렉토리에 배치하십시오 __init__.py.

repo
├── conftest.py
├── spam
   ├── __init__.py
   ├── bacon.py
   └── egg.py
├── eggs
   ├── __init__.py
   └── sausage.py
└── tests
     ├── test_bacon.py
     └── test_egg.py

src 나열한 것

이 방법은 함께 사용할 수 있지만 src레이아웃 (장소 conftest.py에서 srcDIR) :

repo
├── src
   ├── conftest.py
   ├── spam
      ├── __init__.py
      ├── bacon.py
      └── egg.py
   └── eggs
       ├── __init__.py
       └── sausage.py
└── tests
     ├── test_bacon.py
     └── test_egg.py

추가 것을주의 srcPYTHONPATH완화시킨다 의미와 혜택 src레이아웃을! 설치된 패키지가 아닌 리포지토리에서 코드를 테스트하게됩니다. 당신이 그것을해야한다면, 아마도 srcdir 이 전혀 필요하지 않을 수도 있습니다 .

여기서 갈 곳

물론, conftest모듈은 소스 코드 발견을 돕는 일부 파일이 아닙니다. 여기에서 pytest프레임 워크 의 모든 프로젝트 별 개선 사항 과 테스트 스위트의 사용자 정의가 발생합니다. 문서 전체 pytestconftest흩어져있는 모듈 에 대한 많은 정보가 있습니다 . 로 시작 : 로컬 디렉토리 별 플러그인conftest.py

또한 SO는 conftest모듈 에 대한 훌륭한 질문 이 있습니다 .py.test에서 conftest.py 파일의 사용법은 무엇입니까?


답변

나는 같은 문제가 있었다. 빈 __init__.py파일을 tests디렉토리 에 추가하여 수정했습니다 .


답변

다음 pytest을 사용하여 모듈로 실행하십시오 .
python -m pytest tests


답변

프로젝트 루트에서 PYTHONPATH로 실행할 수 있습니다.

PYTHONPATH=. py.test

또는 편집 가능한 가져 오기로 pip install을 사용하십시오.

pip install -e .   # install package using setup.py in editable mode


답변

나는 이것을 당신의 질문과 내 자신의 혼란에 대한 답변으로 만들었습니다. 도움이 되길 바랍니다. py.test 명령 행과 tox.ini에서 PYTHONPATH에주의하십시오.

https://github.com/jeffmacdonald/pytest_test

구체적으로, py.test와 tox에 포함하고있는 모듈을 찾을 위치를 알려줘야합니다.

py.test를 사용하면 다음을 수행 할 수 있습니다.

PYTHONPATH=. py.test

tox와 함께 tox.ini에 추가하십시오 :

[testenv]
deps= -r{toxinidir}/requirements.txt
commands=py.test
setenv =
    PYTHONPATH = {toxinidir}