313

easy_installを使用してMacにpytestをインストールし、次のようなファイル構造を持つプロジェクトのテストを書き始めました。

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を実行するには、PATHを編集する必要がありますか?誰かがこれを経験しましたか?

4

23 に答える 23

382

py.test が PYTHONPATH 自体に現在のディレクトリを追加しない理由はわかりませんが、次の回避策があります (リポジトリのルートから実行します)。

python -m pytest tests/

これが機能するのは、Python が現在のディレクトリを PYTHONPATH に追加するためです。

于 2015-12-07T18:21:06.537 に答える
271

conftest解決

最も侵襲性の低い解決策はconftest.pyrepo/ディレクトリに指定された空のファイルを追加することです。

$ touch repo/conftest.py

それでおしまい。sys.pathをマングリングしたり、ドラッグすることを忘れないPYTHONPATHで、またはそれが属していないディレクトリに配置するためのカスタムコードを記述する必要はありません(ただし、 Apteryx回答で提案されているように__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の意味と利点が損なわれることに注意してください。srcインストールされたパッケージではなく、リポジトリからコードをテストすることになります。それを行う必要がある場合、ディレクトリはまったく必要ないかもしれませんsrc

ここからどこへ

もちろん、conftestモジュールはソース コードの発見に役立つ単なるファイルではありません。ここで、フレームワークのプロジェクト固有の機能強化とpytestテスト スイートのカスタマイズがすべて行われます。ドキュメント全体に散らばっているモジュールpytestに関する多くの情報があります。で始まる: ディレクトリごとのローカルプラグインconftestconftest.py

conftestまた、SO にはモジュールに関する優れた質問があります。py.test では、conftest.py ファイルの使用は何ですか?

于 2018-05-30T17:42:02.510 に答える
135

私も同じ問題を抱えていました。__init__.pyディレクトリに空のファイルを追加して修正しましたtests

于 2013-09-24T01:20:44.237 に答える
125

cdはい、 tests ディレクトリに移動すると、ソース フォルダーは Python のパスにありません。

次の 2 つの選択肢があります。

  1. 次のように、パスを手動でテスト ファイルに追加します。

    import sys, os
    myPath = os.path.dirname(os.path.abspath(__file__))
    sys.path.insert(0, myPath + '/../')
    
  2. env var でテストを実行しますPYTHONPATH=../

于 2012-04-20T21:39:12.060 に答える
24

あなたの質問と私自身の混乱に対する答えとしてこれを作成しました。お役に立てば幸いです。py.test コマンドラインと tox.ini の両方で PYTHONPATH に注意してください。

https://github.com/jeffmacdonald/pytest_test

具体的には: py.test と tox に、含めるモジュールの場所を伝える必要があります。

py.test を使用すると、次のことができます。

PYTHONPATH=. py.test

tox を使用して、これを tox.ini に追加します。

[testenv]
deps= -r{toxinidir}/requirements.txt
commands=py.test
setenv =
    PYTHONPATH = {toxinidir}
于 2016-07-15T13:46:39.053 に答える
5

Flask チュートリアルに従っているときに同じ問題が発生し、公式の Pytestドキュメント で答えを見つけました。

setup.pyプロジェクトのルート ディレクトリに、少なくとも次の 2 行を含むファイルを作成する必要があります。

from setuptools import setup, find_packages
setup(name="PACKAGENAME", packages=find_packages())

ここで、PACKAGENAME はアプリの名前です。次に、pipでインストールする必要があります:

pip install -e .

この-eフラグは、編集可能モードまたは「開発」モードでパッケージをインストールするように pip に指示します。したがって、次に実行するpytestと、標準でアプリが見つかるはずですPYTHONPATH

于 2020-03-08T18:34:04.183 に答える