AttributeError: Das Objekt 'module' hat kein Attribut 'tests'.


101

Ich führe diesen Befehl aus:

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

und es verursacht diesen Fehler:

AttributeError: Das Objekt 'module' hat kein Attribut 'tests'.

Unten ist meine Verzeichnisstruktur. Ich habe auch app1 zu meiner installierten Apps-Konfiguration hinzugefügt.

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'

Verzeichnisaufbau:

Geben Sie hier die Bildbeschreibung ein

Antworten:


181

Ich habe es endlich herausgefunden und an einem anderen Problem gearbeitet. Das Problem war, dass mein Test keinen Import finden konnte.

Es sieht so aus, als würden Sie den obigen Fehler erhalten, wenn Ihr Test nicht importiert werden kann. Dies ist sinnvoll, da die Testsuite keinen fehlerhaften Test importieren kann. Zumindest denke ich, dass dies der Fall ist, weil ich den Import in meiner Testdatei korrigiert habe und sicher genug angefangen habe zu funktionieren.

Um Ihren Testfall zu validieren, importieren Sie einfach die Testfalldatei in die Python-Konsole.

Beispiel:

from project.apps.app1.tests import *

Schlechte Annahme in dieser Nachricht.
AdamC

1
Dies kann auch über die Befehlszeile erfolgen, sodass keine Python-Shell geöffnet werden muss:python -c "from project.apps.app1.tests import *"
Hakan B.

1
+1 hat mich vor einer verwirrenden Fehlermeldung bewahrt. Das einzige Problem mit Ihrem Vorschlag ist, dass Sie den Todesstern importiert haben . OK in der Konsole für Experimente, aber im Code immer nur die benötigten Namen importieren.
Peter M. - steht für Monica

Können Sie nicht die Variable in jeder Datei verwenden, anstatt die Verwendung des " Todessterns " zu fürchten __all__? Und eine Liste von Klassennamen, Funktionen und Variablen angeben, die bei Verwendung exportiert werden sollen from package_name.module import *? Ich habe viel Glück mit diesem Muster gehabt. Ich verstehe, dass es etwas länger dauert, das __all__Bit oben in jede Datei zu schreiben . Aber das Importieren mit " Todesstern " scheint gut zu funktionieren.
MikeyE

Ich hatte gerade dieses Problem und war wirklich verwirrt. Danke für die Antwort. Python macht hier nicht das Richtige. Es braucht eine klarere Botschaft. Davon abgesehen gehe ich davon aus, dass Ihr "... Import *" nur dazu dient, die Tests zu überprüfen, und nicht dazu gedacht ist, Teil des Testläufers zu sein ... Ich denke, letzteres wäre unangemessen.
rfportilla

35

Verwenden:

./manage.py shell

gefolgt von

import myapp.tests

um die Art des Importfehlers zu finden.


Ich schätze die Mühe und es scheint, dass dies für viele Menschen funktioniert hat. Aber als ich eine interaktive Python-Shell mit öffnete, ./manage.py shellfunktionierte einer import myapp.testsoder from myapp.tests import *beide ohne Fehler. Aber ich bekomme immer noch den vom OP beschriebenen Fehler.
MikeyE

21

Für meinen Fall muss ich eine leere __init__.py in meinem app/testsOrdner erstellen


6

Das obige Beispiel von Steve Bradshaw funktioniert bei Importfehlern (danke Steve).

Andere Arten von Fehlern (z. B. ValueError) können ebenfalls Ursachen haben

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

um zu sehen, was diese Fehler sind

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

4

Ich hatte den gleichen Fehler wie Chris. Ich hatte ein altes Modell gelöscht und dann tests.py ausgeführt, aber eine andere Datei (views.py) versuchte immer noch, das gelöschte Modell zu importieren.

Als ich die veraltete Importanweisung herausnahm, war das Problem gelöst.


3

Stellen Sie sicher, dass nicht alle Module, die Sie in Ihrem Skript verwenden, beschädigt sind. Damit meine ich die Rechtschreibprüfung in Ihren Importanweisungen.

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

Sie können Ihre Module testen, indem Sie Importanweisungen in der interaktiven Konsole von djano ausführen.

$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

Ich habe den Fehler "AttributeError: Modul 'utils' hat kein Attribut 'name_of_my_function'" behoben, indem ich eine zirkuläre Importreferenz korrigiert habe. Meine Dateien manage.py und utils.py hatten jeweils eine Importanweisung, die aufeinander zeigte.


1

Laut Django-Dokument Wenn Sie Ihre Tests ausführen , besteht das Standardverhalten des Testdienstprogramms darin, alle Testfälle ( dh Unterklassen von unittest.TestCase ) in einer Datei zu finden, deren Name mit test beginnt. Erstellen Sie automatisch eine Testsuite aus diese Testfälle und führen Sie diese Suite aus.

Versuchen Sie Folgendes: python manage.py test tests.py


1

Ich habe den gleichen Fehler erhalten, aber alle Gründe hier überprüft. Mein Problem wurde nicht behoben.

Stellen Sie schließlich fest, dass der Grund dafür ist, dass der Name einer Methode, die importiert, aber noch nicht verwendet wurde, nicht korrekt ist. Obwohl es ein dummer Fehler ist, passiert es.


1

Ich hatte den gleichen Fehler. Es stellte sich heraus, dass ich mein Modul common.py nannte, aber es gab bereits ein anderes common.py-Modul. Ich musste lediglich mein Modul umbenennen.


0

Ich hatte einen ähnlichen Fehler beim Schreiben eines unittest.TestCase. Als ich die gleiche Methodendefinition wie sie ist neu eingegeben habe, schien es zu funktionieren!

Die einzige Änderung, die ich bei PyCharm bemerkt habe, war das Popup-Fenster "Überschreiben" beim zweiten Mal, da die Setup-Methode (Selbstmethode) die in TestCase definierte ursprüngliche Methode überschreiben muss.

Geben Sie hier die Bildbeschreibung ein

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.