124

ファイル構造内のテストスクリプトの下にあるモジュールを認識させるために、 noseテストフレームワークを取得できないようです。問題を示す最も簡単な例を設定しました。以下に説明します。

パッケージファイルの構造は次のとおりです。

./__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ファイルが空です

nosetests -vvメインディレクトリ(foo.pyがある場所)で実行すると、次のようになります。

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はすべての親パッケージをパスとそれが呼び出されるディレクトリに追加することになっていますが、私の場合はそうではないようです。

Python2.6.2でUbuntu8.04を実行しています。それが重要な場合は、手動で(setup_toolsではなく)noseを構築してインストールしました。

4

9 に答える 9

232

あなたは__init__.pyあなたのトップレベルのディレクトリにいます。それはそれをパッケージにします。あなたがそれを取り除くならば、あなたnosetestsは働くはずです。

削除しない場合は、をに変更する必要がありますimportimport dir.fooここで、dirはディレクトリの名前です。

于 2010-06-18T22:09:39.723 に答える
35

あなたはvirtualenvにいますか?私の場合nosetests/usr/bin/nosetests、を使用していたの/usr/bin/pythonです。virtualenv内のパッケージは、間違いなくシステムパスに含まれません。以下はこれを修正しました:

source myvirtualenv/activate
pip install nose
which nosetests
/home/me/myvirtualenv/bin/nosetests
于 2014-03-23T18:37:50.457 に答える
14

__init__.py後でこの質問を見つけた方へ:テストディレクトリにファイルがない場合、インポートエラーが発生します。

私のディレクトリ構造は次のようになりました。

./tests/
  ./test_some_random_stuff.py

ぼくが動物園を実行した場合:

nosetests -w tests

ImportErrorそれは他の誰もが見ていることを与えるでしょう。空のファイルを追加すると、__init__.py問題なく機能します。

./tests/
  ./__init__.py
  ./test_some_random_stuff.py
于 2014-01-23T22:36:32.870 に答える
11

もう1つの潜在的な問題は、ディレクトリツリーのハイフン/ダッシュであるように見えます。sub-dir最近、ディレクトリの名前をからに変更することで、ノーズのImportErrorの問題を修正しましたsub_dir

于 2012-06-15T17:25:04.900 に答える
4

もちろん、インポート中のモジュールに構文エラーがある場合は、これが発生します。私の場合、tests.pyと同じディレクトリにmodule / tests.bak.pyのようなパスを持つテストファイルのバックアップがあったときに、問題が頭に浮かびました。また、Djangoアプリのinitパッケージ/モジュールの問題に対処するには、次のコマンドを(bash / OSXシェルで)実行して、 init.pycファイルが存在しないことを確認します。

find . -name '*.pyc' -delete
于 2013-05-29T21:55:07.517 に答える
4

nosetests間違ったディレクトリからコマンドを実行したため、このエラーメッセージが表示されました。

愚かな、しかし起こります。

于 2016-08-02T19:10:42.380 に答える
3

たとえば、次のディレクトリ構造で、で実行する場合nosetestsm1またはm2m3一部の関数をテストする場合はn.py、でを使用する必要がありfrom m2.m3 import nますtest.py

m1
└── m2
    ├── __init__.py
    └── m3
        ├── __init__.py
        ├── n.py
        └── test
            └── test.py
于 2016-07-27T05:14:37.197 に答える
2

この問題を引き起こす可能性のあるもう1つの問題に遭遇しました。それは、フォームでのテストの命名ですtestname.test.py。その余分な.ものは鼻を混乱させ、それがすべきでないものをインポートすることにつながります。型にはまらないテスト命名規則を使用すると問題が発生することは明らかかもしれませんが、注目に値するかもしれません。

于 2015-10-01T23:28:58.480 に答える
2

質問を完了するためだけに:このような構造に苦労している場合:

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ルートのアクティブ化の中に貼り付けます

于 2018-05-29T07:22:08.193 に答える