にアプリケーションディレクトリが含まれていますpy.testを確保することは、次のように私は(私はかなり標準であると考えている)プロジェクトのディレクトリ構造を持っているのsys.path
my_project
setup.py
mypkg
__init__.py
foo.py
tests
functional
test_f1.py
unit
test_u1.py
私は私のテストフレームワークのためのpy.testを使用しています私のテストを実行するにはmy_project
ディレクトリにあるpy.test tests
を実行することができます。テストでimport mypkg
などを使用してアプリケーションコードをインポートしようとするまで、これは実際に動作します。その時点で、「No module mypkg」というエラーが表示されます。調査のビットを行うことで、py.test
がsys.path
でテストファイルのディレクトリでテストを実行しますが、py.test
から実行されたことをないディレクトリことが表示されます。
これを回避するために、私は次のコードを含む、私のtests
ディレクトリにconftest.py
ファイルを追加しました:
import sys, os
# Make sure that the application source directory (this directory's parent) is
# on sys.path.
here = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
sys.path.insert(0, here)
これが動作しているようですが、それは確認して作るのは良い方法ですテストはアプリケーションコードを参照してください?これを達成するためのより良い方法があるのですか、私はプロジェクトの構造をどうやって間違っていますか?
私はpy.test
(たとえば、pip
)を使用する他のいくつかのプロジェクトを見てきましたが、このようなコードを見ることはできませんが、まだ実行中のpy.test tests
はそこで動作するようです。理由は分かりませんが、より単純な方法で同じ結果が得られているのではないかと心配しています。
私はpy.test
ドキュメントで見てきたが、私はこの問題の説明やどのような推奨されるアプローチは、それに対処することですを見ることができません。
あなたはvirtualenvを持っていない場合、 "python setup.py develop"を使って同じ効果を得ることができます。 –
ありがとう、私は、PYTHONPATHハッキングのさまざまなオプションを認識していました。しかし、一般的には、私はそれらを使う傾向がありません。私はプロジェクトのルートディレクトリからPythonを実行するだけです。 IIRC、unittestもPYTHONPATHハッキングなしで動作します(少なくとも、私は決して複雑なことをやったことはありません:-))私はpy.testで弾丸を噛んで、PYTHONPATHを正しく設定する必要があると思います。 –
conftest.pyハックは素晴らしい考えです!あまりにも悪いのは、それは離れて行くかもしれない: – lab419