AttributeError: 'module'オブジェクトに属性 'tests'がありません


101

私はこのコマンドを実行しています:

python manage.py test project.apps.app1.tests

そしてそれはこのエラーを引き起こします:

AttributeError: 'module'オブジェクトに属性 'tests'がありません

以下は私のディレクトリ構造です。インストール済みのアプリ構成にapp1も追加しました。

Traceback (most recent call last):
    File "manage.py", line 10, in <module> execute_from_command_line(sys.argv)
    File "/home/username/local/dev/local/lib/python2.7/site-packages/django/core/management/__init__.py", line 385, in execute_from_command_line
    utility.execute()
    File "/home/username/local/dev/local/lib/python2.7/site-packages/django/core/management/__init__.py", line 377, in execute
    self.fetch_command(subcommand).run_from_argv(self.argv)
    File "/home/username/local/dev/local/lib/python2.7/site-packages/django/core/management/commands/test.py", line 50, in run_from_argv
    super(Command, self).run_from_argv(argv)
    File "/home/username/local/dev/local/lib/python2.7/site-packages/django/core/management/base.py", line 288, in run_from_argv
    self.execute(*args, **options.__dict__)
    File "/home/username/local/dev/local/lib/python2.7/site-packages/django/core/management/commands/test.py", line 71, in execute
    super(Command, self).execute(*args, **options)
    File "/home/username/local/dev/local/lib/python2.7/site-packages/django/core/management/base.py", line 338, in execute
    output = self.handle(*args, **options)
    File "/home/username/local/dev/local/lib/python2.7/site-packages/django/core/management/commands/test.py", line 88, in handle
    failures = test_runner.run_tests(test_labels)
    File "/home/username/local/dev/local/lib/python2.7/site-packages/django/test/runner.py", line 146, in run_tests
    suite = self.build_suite(test_labels, extra_tests)
    File "/home/username/local/dev/local/lib/python2.7/site-packages/django/test/runner.py", line 66, in build_suite
    tests = self.test_loader.loadTestsFromName(label)
    File "/usr/lib/python2.7/unittest/loader.py", line 100, in loadTestsFromName
    parent, obj = obj, getattr(obj, part)
    AttributeError: 'module' object has no attribute 'tests'

ディレクトリ構造:

ここに画像の説明を入力してください

回答:


181

私は最終的に別の問題に取り組むことを理解しました。問題は、テストでインポートが見つからないことでした。

テストのインポートに失敗すると、上記のエラーが発生するようです。テストスイートは壊れたテストをインポートできないため、これは理にかなっています。テストファイル内のインポートを修正し、十分に機能し始めたので、少なくともこれが起こっていると思います。

テストケースを検証するには、Pythonコンソールにテストケースファイルをインポートしてみてください。

例:

from project.apps.app1.tests import *

そのメッセージの悪い仮定。
AdamC 2016年

1
これはコマンドラインからも実行でき、Pythonシェルを開く必要がなくなります。 python -c "from project.apps.app1.tests import *"
ハカン・B.

1
+1は、混乱するエラーメッセージから私を救いました。あなたの提案の唯一の問題は、あなたがデススターを輸入しことです。実験用のコンソールでは問題ありませんが、コードでは、常に必要な名前だけをインポートしてください。
ピーターM.-

死の星」の使用を恐れる代わりに__all__、各ファイルで変数を使用することはできませんか?使用時にエクスポートするクラス名、関数、変数のリストを指定しますfrom package_name.module import *か?私はこのパターンでうまくいきました。__all__各ファイルの上部にあるビットを書き込むのに少し時間がかかることを理解しています。ただし、「デススター」を使用したインポートは問題なく動作するようです。
MikeyE

私はこの問題を抱えていて、本当に混乱していました。答えてくれてありがとう。Pythonはここで正しいことをしていません。より明確なメッセージが必要です。そうは言っても、あなたの "... import *"は単にテストをチェックするためのものであり、テストランナーの一部であることを意図していないと思います...後者は不適切だと思います。
rfportilla

35

使用する:

./manage.py shell

に続く

import myapp.tests

インポートエラーの性質を確認します。


私は努力に感謝し、これは多くの人にとってうまくいったようです。しかし、./manage.py shellそれを使用してpythonインタラクティブシェルを開いたときに、どちらかimport myapp.testsまたはfrom myapp.tests import *両方がエラーなしで機能しました。しかし、それでもOPで説明されているエラーが発生します。
MikeyE

21

私の場合、私のフォルダに空の__init__.pyを作成する必要がありapp/testsます


6

上記のSteve Bradshawの例は、インポートエラーに対して機能します(Steveに感謝)。

その他のタイプのエラー(ValueErrorなど)も発生する可能性があります

AttributeError: 'module' object has no attribute 'tests'

これらのエラーが何であるかを確認する

./manage.py shell
from myapp.tests import SomeTestCase
t = SomeTestCase()

4

私はクリスと同じエラーがありました。古いモデルを削除してから、tests.pyを実行しましたが、削除されたモデルを別のファイル(views.py)がインポートしようとしていました。

廃止されたインポート文を削除したところ、問題は解決しました。


3

スクリプトで使用しているすべてのモジュールが壊れていないことを確認してください。これは、インポートステートメントのスペルチェックを意味します。

# invalid import
from app.model.notification import Notification
# valid import
from app.models.notification import Notification

djanoのインタラクティブコンソールでimportsステートメントを実行して、モジュールをテストできます。

$root@13faefes8: python manage.py shell
Type "help", "copyright", "credits" or "license" for more information (InteractiveConsole)
>>> from app.model.notification import Notification
Traceback (most recent call last): 
   File "<console>", line 1, in <module>
ImportError: No module named model.notification

2

循環インポート参照を修正して、「AttributeError:module 'utils' has no attribute 'name_of_my_function'」というエラーを解決しました。私のファイルmanage.pyとutils.pyはそれぞれ、お互いを指すimportステートメントを持っていました。


1

djangoドキュメントによると、テスト実行すると、テストユーティリティのデフォルトの動作では、名前がtestで始まるファイル内のすべてのテストケース(つまり、unittest.TestCaseのサブクラス)が検索され、自動的にテストスイートがビルドされます。これらのテストケース、およびそのスイートを実行します。

だからこれを試してください: python manage.py test tests.py


1

同じエラーが発生しましたが、ここですべての理由リストを確認しても問題は解決しませんでした。

最後に、その理由は、インポートされたがまだ使用されていない1つのメソッドの名前が正しくないことです。愚かなエラーですが、起こります。


1

同じエラーが発生しました。それは、私が自分のモジュールにcommon.pyという名前を付けたからですが、すでに他のcommon.pyモジュールがいくつかありました。モジュールの名前を変更するだけで済みました。


0

unittest.TestCaseの作成中に同様のエラーが発生しました。同じメソッド定義をそのまま再入力すると、うまくいったようです!

setup(self)メソッドはTestCaseで定義された元のメソッドをオーバーライドする必要があるため、PyCharmで気付いた唯一の変更は2回目の「オーバーライド」アイコンポップアップでした。

ここに画像の説明を入力してください

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.