py.test が sys.path にアプリケーションのディレクトリを含むことを確認します。
質問
私は以下のようなプロジェクトのディレクトリ構造を持っています(これはかなり標準的だと思います)。
my_project
setup.py
mypkg
__init__.py
foo.py
tests
functional
test_f1.py
unit
test_u1.py
私はテストフレームワークにpy.testを使用しており、その際に
py.test tests
の中にあるとき
my_project
ディレクトリでテストを実行します。これは確かにうまくいきますが、アプリケーションのコードを (例えば)
import mypkg
を使ってインポートしようとするまでです。このとき、"No module named mypkg"というエラーが表示されました。少し調査してみると、どうやら
py.test
にあるテストファイルのディレクトリでテストを実行するようです。
sys.path
でテストを実行しますが
ではなく
というディレクトリは
py.test
が実行されたディレクトリではありません。
これを回避するために、私は
conftest.py
ファイルを
tests
ディレクトリに置き、以下のコードを含む。
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
のドキュメントを見ましたが、この問題についての説明や、この問題に対処するために推奨されるアプローチは見当たりません。
どのように解決するのですか?
あなたが自分で言うように、py.testは基本的にPYTHONPATHが正しく設定されていることを前提としています。 これを達成するためにいくつかの方法があります。
-
あなたのプロジェクトにsetup.pyを与え
pip install -e .
をこのプロジェクト用の virtualenv で実行します。 これが標準的な方法でしょう。 -
virtualenv があって setup.py がない場合のバリエーションとして、sys.path に projects ディレクトリを追加する venv の機能を使います、例.
pew add .
pew を使っている場合はadd2virtualenv .
を、virtualenv と virtualenvwrapper の拡張を使う場合はとなります。 -
もし、常に sys.path 上のカレントワーキングディレクトリが好きなら、単に常に
PYTHONPATH=''
をシェルで指定します。 これは、python が現在の作業ディレクトリとして解釈する sys.path 上の空文字列を確保することです。 しかし、これは潜在的にセキュリティハザードです。 -
私自身のお気に入りのハックは、py.testがconftestファイルをロードする方法を悪用することです: 空の
conftest.py
をプロジェクトのトップレベルディレクトリに置くことです。
py.testがこのように振る舞う理由は、インストールされたパッケージに対して、チェックアウトのtests/ディレクトリにあるテストを簡単に実行できるようにするためです。 もし無条件にプロジェクトディレクトリをPYTHONPATHに追加するならば、これはもう不可能でしょう。
関連
-
[解決済み] 億の相対的輸入
-
[解決済み】典型的なテストディレクトリ構造でunittestを実行する
-
[解決済み】pytestのPATH問題 'ImportError: YadaYadaYadaという名前のモジュールがない'
-
[解決済み] py.testテストを実行するようにPyCharmを設定するにはどうすればよいですか?
-
[解決済み] sys.path/PYTHONPATHにディレクトリを追加する。
-
[解決済み] Pythonのキャッシュライブラリはありますか?
-
[解決済み] スペースがないテキストを単語のリストに分割する方法
-
[解決済み] PyQtアプリケーションのスレッド化。QtスレッドとPythonスレッドのどちらを使うか?
-
[解決済み] Flaskで非同期タスクを作る
-
[解決済み] py.testを使用して、テストディレクトリにパッケージを作成せずに、テストでヘルパー関数を作成し、インポートします。
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] PythonでのAWS Lambdaのインポートモジュールエラー
-
[解決済み] Pythonのインスタンス変数とクラス変数
-
[解決済み] Django Rest Framework ファイルアップロード
-
[解決済み] Pythonで0xを使わずにhex()を使うには?
-
[解決済み] Django で全てのリクエストヘッダを取得するにはどうすれば良いですか?
-
[解決済み] Flaskで非同期タスクを作る
-
[解決済み] virtualenv の `--no-site-packages` オプションを元に戻す。
-
[解決済み] Pythonの文字列の前にあるbという接頭辞は何を意味するのですか?
-
[解決済み] Pythonでランダムなファイル名を生成する最良の方法
-
[解決済み] Python の sorted() はどのようなアルゴリズムを使っているのですか?重複