pytest の PATH の問題 'ImportError: No module named ...' 質問する

pytest の PATH の問題 'ImportError: No module named ...' 質問する

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>=7pythonpath設定を使用する

最近、pytest新しいコアプラグインが追加されsys.pathpythonpath設定値解決策ははるかに簡単になり、回避策は不要になりました。

pyproject.toml例:

[tool.pytest.ini_options]
pythonpath = [
  "."
]

pytest.ini例:

[pytest]
pythonpath = .

パス エントリは rootdir を基準として計算されるため、この場合はディレクトリ.が追加されます。reposys.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.pysys.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 ファイルは何に使用されますか?

おすすめ記事