easy_installを使ってインストールしましたpytestMac で、次のようなファイル構造を持つプロジェクトのテストを書き始めました。
repo/
|--app.py
|--settings.py
|--models.py
|--tests/
|--test_app.py
リポジトリpy.test
ディレクトリ内で実行すると、すべてが期待どおりに動作します。
しかし、Linux または Windows (どちらも pytest 2.2.3 がインストールされている) で同じことを実行すると、アプリケーション パスから何かを最初にインポートするたびに警告が出ます。たとえば、from app import some_def_in_app
.
編集する必要があるかパスこれらのシステムでpy.testを実行するには?
ベストアンサー1
推奨されるアプローチpytest>=7
:pythonpath
設定を使用する
最近、pytest
新しいコアプラグインが追加されsys.path
、pythonpath
設定値解決策ははるかに簡単になり、回避策は不要になりました。
pyproject.toml
例:
[tool.pytest.ini_options]
pythonpath = [
"."
]
pytest.ini
例:
[pytest]
pythonpath = .
パス エントリは rootdir を基準として計算されるため、この場合はディレクトリ.
が追加されます。repo
sys.path
複数のパスエントリも許可されます。レイアウトの場合
repo/
├── src/
| └── lib.py
├── app.py
└── tests
├── test_app.py
└── test_lib.py
構成
[tool.pytest.ini_options]
pythonpath = [
".", "src",
]
または
[pytest]
pythonpath = . src
app
はと の両方のlib
モジュールを に追加するのでsys.path
、
import app
import lib
どちらも動作します。
元の回答(最近のpytestバージョンでは推奨されません。pytest<7
のみに使用してください):conftest
解決策
conftest.py
最も侵襲性の低い解決策は、ディレクトリに次の名前の空のファイルを追加することですrepo/
。
$ touch repo/conftest.py
これで完了です。ファイルを改変したり、sys.path
ドラッグしたりPYTHONPATH
、__init__.py
本来は属さないディレクトリに配置したりするためのカスタムコードを記述する必要はありません(python -m pytest
アプテリクスの答えただし、これは良い解決策です。
その後のプロジェクト ディレクトリ:
repo
├── conftest.py
├── app.py
├── settings.py
├── models.py
└── tests
└── test_app.py
説明
pytest
テスト コレクション上のモジュールを検索してconftest
カスタム フックとフィクスチャを収集し、そこからカスタム オブジェクトをインポートするために、pytest
の親ディレクトリをconftest.py
sys.path
(この場合はディレクトリ)にrepo
追加します。
その他のプロジェクト構造
他のプロジェクト構造がある場合は、 をconftest.py
パッケージ ルート ディレクトリ (パッケージを含むがパッケージ自体ではないため、 を含まないディレクトリ) に配置します__init__.py
。次に例を示します。
repo
├── conftest.py
├── spam
│ ├── __init__.py
│ ├── bacon.py
│ └── egg.py
├── eggs
│ ├── __init__.py
│ └── sausage.py
└── tests
├── test_bacon.py
└── test_egg.py
src
レイアウト
src
このアプローチはレイアウト(ディレクトリconftest.py
内の場所src
)でも使用できますが、
repo
├── src
│ ├── conftest.py
│ ├── spam
│ │ ├── __init__.py
│ │ ├── bacon.py
│ │ └── egg.py
│ └── eggs
│ ├── __init__.py
│ └── sausage.py
└── tests
├── test_bacon.py
└── test_egg.py
src
を追加すると、レイアウトPYTHONPATH
の意味と利点が軽減されることに注意してください。インストールされたパッケージではなく、リポジトリからのコードをテストすることになります。これを行う必要がある場合は、 dir はまったくsrc
必要ないかもしれません。src
これからどこへ行くのか
もちろん、conftest
モジュールはソースコードの発見を助けるための単なるファイルではありません。フレームpytest
ワークのプロジェクト固有の機能強化やテストスイートのカスタマイズはすべてモジュールで行われます。モジュールpytest
に関する多くの情報が散在しています。conftest
彼らのドキュメント; 皮切りにconftest.py
: ローカルディレクトリごとのプラグイン
conftest
また、SO にはモジュールに関する優れた質問があります。py.test では、conftest.py ファイルは何に使用されますか?