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を編集する必要がありますか?誰もこれを経験しましたか?
はい、cd
がtestsディレクトリにある場合、ソースフォルダーはPythonのパスにありません。
次の2つの選択肢があります。
次のようなテストファイルにパスを手動で追加します。
import sys, os
myPath = os.path.dirname(os.path.abspath(__file__))
sys.path.insert(0, myPath + '/../')
Env var PYTHONPATH=../
を使用してテストを実行します。
Py.testがPYTHONPATH自体に現在のディレクトリを追加しない理由はわかりませんが、次の回避策があります(リポジトリのルートから実行する)。
python -m pytest tests/
PythonがPYTHONPATHに現在のディレクトリを自動的に追加するため、機能します。
同じ問題がありました。空の__init__.py
ファイルをtests
ディレクトリに追加することで修正しました。
プロジェクトルートでPYTHONPATHを使用して実行できます
PYTHONPATH=. py.test
または、編集可能なインポートとしてpip installを使用します
pip install -e . # install package using setup.py in editable mode
pytest
自体をモジュールとして実行します:python -m pytest tests
これはあなたの質問への答えと私自身の混乱として作成しました。役に立てば幸いです。 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}
誤ってConftestImportFailure: ImportError('No module named ...
ファイルをsrcディレクトリに追加したときに、奇妙な__init__.py
エラーが発生し始めました(これはPythonパッケージではなく、すべてのソースのコンテナーでした)。
ソースの親フォルダーにある最上位の__init__.py
を削除して修正しました。
もっと簡単なものが原因でこのエラーが発生していました(ささいなことさえ言えます)。 pytest
モジュールをインストールしていません。簡単なapt install python-pytest
で修正されました。
「pytest」は、テストの依存関係としてsetup.pyにリストされていました。テスト要件もインストールしてください。
同様の問題がありました。 pytest
は、私が働いていた環境にインストールされたモジュールを認識しませんでした。
pytest
も同じ環境にインストールすることで解決しました。
私にとって問題は、tests
ディレクトリと共にDjangoによって生成されたtests.py
でした。 tests.py
を削除すると、問題は解決しました。
相対インポートを誤って使用したため、このエラーが発生しました。 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にアクセスできるようにするには、以下を行う必要がありました。
from microbit.activity_indicator.activity_indicator import *
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