web-dev-qa-db-ja.com

Py.testモジュールという名前はありません*

私はこのようなフォルダ構造を持っています

App
--App
  --app.py       
--Docs
--Tests
  --test_app.py

私のtest_app.py file、アプリモジュールをインポートする行があります。ルートフォルダーでpy.testを実行すると、appというモジュールがないというエラーが表示されます。これをどのように設定すればよいですか?

26
zsljulius

したがって、py.testから/Appを実行しています。 /App/App$PYTHONPATHにありますか?

そうでない場合、import appを試みるコードはそのようなメッセージで失敗します。

EDIT0:完全を期すために、以下のコメントからの情報を含めます。

アプリのインポートは、/App/App内で実行された場合にのみ成功しますが、ここではそうではありません。 /App/Appをその中に入れて__init__.pyをパッケージにし、アプリをfrom App import appとして修飾するようにインポートを変更します。

EDIT1:リクエストにより、以下の2番目のコメントからさらに説明を追加します。

__init__.py/App/Appの中に置くことにより、そのディレクトリがパッケージになります。つまり、ディレクトリ-が$PYTHONPATHに表示されている限り、そこからインポートできます。つまりApp import app/Appにある場合、$PYTHONPATHから実行できます。現在の作業ディレクトリは$PYTHONPATHに自動的に追加されるため、/Appからスクリプトを実行するとインポートが機能します。

13
Dun Peal

Python 3を使用し、同様のプロジェクトレイアウトで同じエラーが発生した場合、__init__ファイルをtestsモジュールに追加します。

$ touch tests/__init__.py

私はパッケージ化とインポートが得意ではありませんが、これはpytestがターゲットAppモジュールがある場所を見つけるのに役立つと思います。

35
jamesc

すでに__init__.pyファイルの/App/Appディレクトリを使用し、パスをマングルするマジックなしでプロジェクトルートからテストを実行したい:

 python -m pytest tests

出力はすぐに次のようになります。

➟  python -m pytest tests
====================================== test session starts ======================================
platform linux -- Python 3.5.1, pytest-2.9.0, py-1.4.31, pluggy-0.3.1
rootdir: /home/andrew/code/app, inifile: 
plugins: teamcity-messages-1.17
collected 46 items 

... lines omitted ...

============================= 44 passed, 2 skipped in 1.61 seconds ==============================
33
berezovskyi

以下の場所にあるアプリのテストケースを実行しているときにも同じエラーが発生しました

myproject
  --app1
    --__init.py__
    --test.py
  --app2
    --__init.py__
    --test.py
  --__init.py__

myproject's__ init.py __ファイルとブームを削除しました。テストケースは現在実行中です。

3
Jay