web-dev-qa-db-ja.com

Python noseを使用したテストのインポート-現在のパッケージより上のモジュールのインポートのベストプラクティスは何ですか?

これは、さまざまな形式で頻繁に尋ねられる質問であり、多くの場合、「あなたはそれをきちんとやっていない」という応答を得ることがあります。確かに、人々(私を含む)が実装として使用しようとしている常識的なシナリオがあり、解決策は明らかではありません(以前にそれをやったことがない場合)。

「ボトルからフライを飛ばす」という答えを受け入れます。

与えられた

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)に記載されている方が望ましいようです。

いずれにせよ、好ましい解決策を推奨する以下のステートメントは、私自身の「不自然さ」の感覚を取り除きます。

61
leonigmig

すでに十分にあなたの質問に答えました。D(システムの場所にインストールする)は、配布可能なコードの場合に推奨されます。私は通常、C(sys.pathの変更)を使用します。何百ものカスタムライブラリをシステム全体にインストールしたくないからです。理論上、A(相対インポート)はより良いように見えますが、失敗する場合があります。私の意見では、B(PYTHONPATH)はまさにテスト目的のためだけのものです。

それはほとんどすべてのオプションを要約しています。あなたが好むオプション(Pythonは魔法のようにどこを見ればいいかを知っています)は実際には実行可能なソリューションではありません。

私の意見では、最も良いことはあなたのプログラムへのエントリーポイントにこれを置くことです:

import sys, os
sys.path = [os.path.abspath(os.path.dirname(__file__))] + sys.path
10
Luke

私は同じ問題を抱えていましたが、関連する質問で answer を見つけました。

プロジェクトのルートにある__init__.pyを削除するだけです。

44
cnu

私は答えがチェックされていることを知っていますが、それでも他の選択肢を共有することは正当な理由だと思います:)

nose-pathmunge があり、sys.pathnosestestsの呼び出し中。

4
Drake Guan