2014-01-07 4 views
30

にアプリケーションディレクトリが含まれています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.testsys.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ドキュメントで見てきたが、私はこの問題の説明やどのような推奨されるアプローチは、それに対処することですを見ることができません。

答えて

26

あなた自身が言うようにpy.testは基本的にあなたが正しくPYTHONPATHのセットアップまでを前提としています。これを達成するいくつかの方法があります。

  • は、プロジェクトsetup.pyを付けて、このプロジェクトのためにvirtualenvのでpip install -e .を使用しています。これはおそらく標準的な方法です。

  • virtualenvを持っていてもsetup.pyを使用していない場合、ven.pyの機能を使ってsys.pathにprojectsディレクトリを追加します。 pew add .あなたはvirtualenvのとvirtualenvwrapperの拡張を使用する場合は、PEW、またはadd2virtualenv .を使用している場合。

  • sys.pathの現在の作業ディレクトリが常に好きな場合は、シェル内に常にPYTHONPATH=''をエクスポートすることができます。これは、sys.path上の空文字列が、現在の作業ディレクトリ名として解釈されるようにします。しかし、これは潜在的にセキュリティ上の危険です。

  • py.testがconftestファイルを読み込む方法を嫌います。conftest.pyをプロジェクトの最上位ディレクトリに入れてください。

このように動作するpy.testの理由は、それが簡単にインストールされたパッケージに対するチェックアウトのテスト/ディレクトリにテストを実行するようにすることです。プロジェクトディレクトリを無条件にPYTHONPATHに追加すると、これはもはや不可能になります。

+1

あなたはvirtualenvを持っていない場合、 "python setup.py develop"を使って同じ効果を得ることができます。 –

+0

ありがとう、私は、PYTHONPATHハッキングのさまざまなオプションを認識していました。しかし、一般的には、私はそれらを使う傾向がありません。私はプロジェクトのルートディレクトリからPythonを実行するだけです。 IIRC、unittestもPYTHONPATHハッキングなしで動作します(少なくとも、私は決して複雑なことをやったことはありません:-))私はpy.testで弾丸を噛んで、PYTHONPATHを正しく設定する必要があると思います。 –

+5

conftest.pyハックは素晴らしい考えです!あまりにも悪いのは、それは離れて行くかもしれない: – lab419

8

答えは実際にははるかに容易で、hereと表示されています。

テストディレクトリと各サブディレクトリに__init__.pyを追加するだけです。

tests/__init__.py 
tests/functional/__init__.py 
tests/unit/__init__.py 
+1

これは実際にテストをパッケージに追加します。 –

+1

-1これはpytest docsの["good practices"]セクション(http://doc.pytest.org/ja/latest/goodpractices.html)で明示的に**推奨されていません**。 )。 – wim

関連する問題