これは、さまざまな形式で頻繁に尋ねられる質問であり、多くの場合、「あなたはそれをきちんとやっていない」という応答を得ることがあります。確かに、人々(私を含む)が実装として使用しようとしている常識的なシナリオがあり、解決策は明らかではありません(以前にそれをやったことがない場合)。
「ボトルからフライを飛ばす」という答えを受け入れます。
与えられた
project/
__init__.py
/code
__init__.py
sut.py
/tests
__init__.py
test_sut.py
Tests_sut.pyが始まる場所:
import code.sut
ルートディレクトリでnosetestsを実行すると、次の結果になります。
ImportError: No module named code.sut
旅行した通り:
a)を使用して親relativeを行う
from ..code import sut
b)プロジェクトのルートをPYTHONPATHに追加します
c)使用する
sys.path.append
各テストモジュールの開始時にインポートの前に..パスを追加します。
d)忘れずに
setup.py
プロジェクトを実行して、テストを実行する前にモジュールをサイトパッケージにインストールします。
そのため、プロジェクトにアクセスできるテストパッケージルートの下にテストを配置する必要があります。上記のそれぞれは、私にとって「自然」ではなく、問題があると判明したか、大変な作業でした。
Javaこれは動作しますが、基本的にはビルドツールのdintによって/ IDEすべてのクラスをクラスパスに配置します。おそらく問題は、 Pythonの魔法」?Flask webframeworkテスト、オプションd)に記載されている方が望ましいようです。
いずれにせよ、好ましい解決策を推奨する以下のステートメントは、私自身の「不自然さ」の感覚を取り除きます。
すでに十分にあなたの質問に答えました。D(システムの場所にインストールする)は、配布可能なコードの場合に推奨されます。私は通常、C(sys.pathの変更)を使用します。何百ものカスタムライブラリをシステム全体にインストールしたくないからです。理論上、A(相対インポート)はより良いように見えますが、失敗する場合があります。私の意見では、B(PYTHONPATH)はまさにテスト目的のためだけのものです。
それはほとんどすべてのオプションを要約しています。あなたが好むオプション(Pythonは魔法のようにどこを見ればいいかを知っています)は実際には実行可能なソリューションではありません。
私の意見では、最も良いことはあなたのプログラムへのエントリーポイントにこれを置くことです:
import sys, os
sys.path = [os.path.abspath(os.path.dirname(__file__))] + sys.path
私は同じ問題を抱えていましたが、関連する質問で answer を見つけました。
プロジェクトのルートにある__init__.pyを削除するだけです。
私は答えがチェックされていることを知っていますが、それでも他の選択肢を共有することは正当な理由だと思います:)
nose-pathmunge があり、sys.path
nosestests
の呼び出し中。