1

プロジェクトの構造は次のとおりです。

/root
- /crawler
 - /basic
   - agent.py
 - settings.py
 - main.py
- /tests
 - /basic
   - test_agent.py
 - test_main.py

main.pyインポートagent.py、およびagent.pyインポートsettings.py。で実行main.pyし、インタープリターをsys.path に/root/crawler追加する/root/crawler(そこにあるため) ので、正常に動作します。main.pyagent.pyimport settings

しかし、 nose underを使用して単体テストを実行すると/root、 を除いて他のすべてのテストは問題test_agent.pyありませんsettings

/root/crawlテスト対象のモジュールをインポートする前に内部のパスに追加すると機能test_agent.pyしますが、それは悪い習慣と見なされますよね?

もしそうなら、どのように回避するのImportErrorですか?

4

1 に答える 1

0

settings最上位モジュールでなければならない場合は、テスト ファイル内から追加しても問題ありません/root/crawl。それ自体が別の場所にインポート可能で、別のプログラムのライブラリのように使用される可能性があるsys.pathと思われる場合は、パッケージの再構築を検討する必要があります。crawl

次のようなことをしたいかもしれません:

/root $ tree
.
├── crawler
│   ├── __init__.py
│   ├── basic
│   │   ├── __init__.py
│   │   └── agent.py
│   └── settings.py
├── main.py
├── test_main.py
└── tests
    ├── __init__.py
    └── crawler
        ├── __init__.py
        └── basic
            ├── __init__.py
            └── test_agent.py

main から次のようにします。

from crawler.basic import agent
agent.do_work()

エージェントから次のように設定をインポートします。

from crawler import settings # or: from .. import settings
print settings.my_setting

test_main.py:

from tests.crawler.basic import test_agent¬
print 'in test_main'

test_agent.py:

from crawler.basic import agent

そして、すべてが想定どおりに機能します。秘訣は、ライブラリのようなフォルダー構造をパッケージとして作成し、その構造の外にあるプログラムへのエントリ ポイントを持ち、パッケージをインポートすることです。

また、tests ディレクトリをクローラー ディレクトリに移動して、crawler.tests.basic.test_agent.

于 2013-11-08T13:08:32.657 に答える