nose testing framework を取得して、ファイル構造内のテストスクリプトの下にあるモジュールを認識できないようです。問題を示す最も単純な例を設定しました。以下で説明します。
パッケージファイルの構造は次のとおりです。
./__init__.py
./foo.py
./tests
./__init__.py
./test_foo.py
foo.pyの内容:
def dumb_true():
return True
tests/test_foo.pyの内容:
import foo
def test_foo():
assert foo.dumb_true()
両方のinit。pyファイルは空です
メインディレクトリ(foo.pyがある場所)でnosetests -vv
を実行すると、次の結果が得られます。
Failure: ImportError (No module named foo) ... ERROR
======================================================================
ERROR: Failure: ImportError (No module named foo)
----------------------------------------------------------------------
Traceback (most recent call last):
File "/usr/lib/python/site-packages/nose-0.11.1-py2.6.Egg/nose/loader.py", line 379, in loadTestsFromName
addr.filename, addr.module)
File "/usr/lib/python/site-packages/nose-0.11.1-py2.6.Egg/nose/importer.py", line 39, in importFromPath
return self.importFromDir(dir_path, fqname)
File "/usr/lib/python/site-packages/nose-0.11.1-py2.6.Egg/nose/importer.py", line 86, in importFromDir
mod = load_module(part_fqname, fh, filename, desc)
File "/home/user/nose_testing/tests/test_foo.py", line 1, in <module>
import foo
ImportError: No module named foo
----------------------------------------------------------------------
Ran 1 test in 0.002s
FAILED (errors=1)
Tests /ディレクトリ内から実行すると、同じエラーが発生します。ドキュメントと 例 によると、noseはすべての親パッケージをパスとそれが呼び出されたディレクトリに追加することになっていますが、これは私の中で起こっていないようです場合。
私はUbuntu 8.04をPython 2.6.2で実行しています。それが重要な場合は、手動で(setup_toolsではなく)noseをビルドしてインストールしました。
最上位ディレクトリに__init__.py
があります。それがパッケージになります。削除すると、nosetests
が機能するはずです。
削除しない場合は、import
をimport dir.foo
に変更する必要があります。ここで、dir
はディレクトリの名前です。
あなたはvirtualenvにいますか?私の場合、nosetests
は/usr/bin/nosetests
にあり、/usr/bin/python
を使用していました。 virtualenvのパッケージは間違いなくシステムパスに含まれません。以下はこれを修正しました:
source myvirtualenv/activate
pip install nose
which nosetests
/home/me/myvirtualenv/bin/nosetests
後でこの質問を見つけた方へ:テストディレクトリに__init__.py
ファイルがない場合、インポートエラーが発生します。
私のディレクトリ構造は次のようなものでした:
./tests/
./test_some_random_stuff.py
鼻テストを実行した場合:
nosetests -w tests
他の人が見ているImportError
を提供します。空の__init__.py
ファイルを追加すると、うまく機能します。
./tests/
./__init__.py
./test_some_random_stuff.py
別の潜在的な問題は、ディレクトリツリーのハイフン/ダッシュのようです。最近、ディレクトリの名前をsub-dir
からsub_dir
に変更して、nose ImportErrorの問題を修正しました。
間違ったディレクトリからnosetests
コマンドを実行したため、このエラーメッセージが表示されました。
愚かな、しかし起こる。
もちろん、インポートされるモジュールに構文エラーがあり、これが発生する場合。私にとっては、tests.pyと同じディレクトリにmodule/tests.bak.pyのようなパスを持つテストファイルのバックアップがあると、問題は頭をよぎりました。また、Djangoアプリでinitパッケージ/モジュールの問題に対処するには、次の(bash/OSXシェルで)を実行して、 'init。pycファイルが存在しない:
find . -name '*.pyc' -delete
この問題を引き起こす可能性のあるもう1つの問題に遭遇しました:testname.test.py
という形式のテストの命名。余分な.
は鼻を混乱させ、本来すべきでないものをインポートすることにつながります。型にはまらないテスト命名規則を使用すると事態が悪化することは明らかであると思われますが、注意する価値があると思いました。
たとえば、次のディレクトリ構造で、m1
、m2
、またはm3
でnosetests
を実行してn.py
の一部の関数をテストする場合は、 from m2.m3 import n
でtest.py
を使用する必要があります。
m1
└── m2
├── __init__.py
└── m3
├── __init__.py
├── n.py
└── test
└── test.py
質問を完了するために:このような構造に苦労している場合:
project
├── m1
├ ├── __init__.py
├ ├── foo1.py
├ └──m2
├ ├── __init__.py
├ └── foo2.py
├
└── test
├── __init__.py
└── test.py
また、プロジェクトの外部のパスからテストを実行したい場合は、プロジェクトパスをPYTHONPATHに含めます。
export PYTHONPATH=$PYTHONPATH:$HOME/path/to/project
.profile内に貼り付けます。仮想環境下にいる場合は、venvルートのactivate内に貼り付けます