web-dev-qa-db-ja.com

pytest 'ImportError:Noada module named YadaYadaYada'のPATH問題

Easy_installを使用してpytestをMacにインストールし、次のようなファイル構造を持つプロジェクトのテストの作成を開始しました。

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

リポジトリディレクトリでpy.testを実行すると、すべてが期待どおりに動作します

しかし、LinuxまたはWindowsの両方で同じことを試してみると(両方にpytest 2.2.3があります)、アプリケーションパスから何かの最初のインポートをヒットするたびにbarえます。たとえばfrom app import some_def_in_appと言います

これらのシステムでpy.testを実行するには、PATHを編集する必要がありますか?誰もこれを経験しましたか?

163
MattoTodd

はい、cdがtestsディレクトリにある場合、ソースフォルダーはPythonのパスにありません。

次の2つの選択肢があります。

  1. 次のようなテストファイルにパスを手動で追加します。

    import sys, os
    myPath = os.path.dirname(os.path.abspath(__file__))
    sys.path.insert(0, myPath + '/../')
    
  2. Env var PYTHONPATH=../を使用してテストを実行します。

70
Not_a_Golfer

Py.testがPYTHONPATH自体に現在のディレクトリを追加しない理由はわかりませんが、次の回避策があります(リポジトリのルートから実行する)。

python -m pytest tests/

PythonがPYTHONPATHに現在のディレクトリを自動的に追加するため、機能します。

198
Apteryx

同じ問題がありました。空の__init__.pyファイルをtestsディレクトリに追加することで修正しました。

94
Aron Curzon

プロジェクトルートでPYTHONPATHを使用して実行できます

PYTHONPATH=. py.test

または、編集可能なインポートとしてpip installを使用します

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

pytest自体をモジュールとして実行します:python -m pytest tests

28
Stefano Messina

これはあなたの質問への答えと私自身の混乱として作成しました。役に立てば幸いです。 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}
18
Jeff MacDonald

誤ってConftestImportFailure: ImportError('No module named ...ファイルをsrcディレクトリに追加したときに、奇妙な__init__.pyエラーが発生し始めました(これはPythonパッケージではなく、すべてのソースのコンテナーでした)。

7
jbasko

ソースの親フォルダーにある最上位の__init__.pyを削除して修正しました。

3
Gonzalo

もっと簡単なものが原因でこのエラーが発生していました(ささいなことさえ言えます)。 pytestモジュールをインストールしていません。簡単なapt install python-pytestで修正されました。

「pytest」は、テストの依存関係としてsetup.pyにリストされていました。テスト要件もインストールしてください。

3
craq

同様の問題がありました。 pytestは、私が働いていた環境にインストールされたモジュールを認識しませんでした。

pytestも同じ環境にインストールすることで解決しました。

1
nocibambi

私にとって問題は、testsディレクトリと共にDjangoによって生成されたtests.pyでした。 tests.pyを削除すると、問題は解決しました。

1
Paweł Mucha

相対インポートを誤って使用したため、このエラーが発生しました。 OPの例では、test_app.pyは、たとえば.

from repo.app import *

ただし、__ init__.pyファイルはファイル構造全体に散らばっています。これによりnotが機能し、ファイルとテストファイルが同じディレクトリにない限り、ImportErrorが発生します。

from app import *

私のプロジェクトの1つで私がしなければならなかったことの例を次に示します。

プロジェクトの構造は次のとおりです。

microbit/
microbit/activity_indicator/activity_indicator.py
microbit/tests/test_activity_indicator.py

Test_activity_indicator.pyからactivity_indicator.pyにアクセスできるようにするには、以下を行う必要がありました。

  • 正しい相対インポートでtest_activity_indicatory.pyを開始します。
    from microbit.activity_indicator.activity_indicator import *
  • プロジェクト構造全体に__init__.pyファイルを配置します。
    microbit/
    microbit/__init__.py
    microbit/activity_indicator/__init__.py
    microbit/activity_indicator/activity_indicator.py
    microbit/tests/__init__.py
    microbit/tests/test_activity_indicator.py
1
Oppy