AttributeError: l'oggetto "module" non ha attributi "test"


101

Sto eseguendo questo comando:

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

e causa questo errore:

AttributeError: l'oggetto "module" non ha attributi "test"

Di seguito è riportata la struttura della mia directory. Ho anche aggiunto app1 alla configurazione delle mie app installate.

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'

Struttura delle directory:

inserisci qui la descrizione dell'immagine

Risposte:


182

Alla fine l'ho capito lavorando su un altro problema. Il problema era che il mio test non riusciva a trovare un'importazione.

Sembra che tu riceva l'errore precedente se l'importazione del test non riesce. Questo ha senso perché la suite di test non può importare un test non funzionante. Almeno penso che questo sia quello che sta succedendo perché ho corretto l'importazione nel mio file di prova e abbastanza sicuro che ha iniziato a funzionare.

Per convalidare il tuo test case, prova a importare il file del test case nella console python.

Esempio:

from project.apps.app1.tests import *

Cattiva supposizione in quel messaggio.
AdamC

1
Questo può essere fatto anche dalla riga di comando, eliminando la necessità di aprire una shell Python:python -c "from project.apps.app1.tests import *"
Hakan B.

1
+1 mi ha salvato da un messaggio di errore confuso. L'unico problema con il tuo suggerimento è che hai importato la Morte Nera . OK nella console per gli esperimenti, ma nel codice importa sempre solo i nomi necessari.
Peter M. - sta per Monica

Invece di temere l'uso della " stella della morte " non puoi usare la __all__variabile in ogni file? E specificare un elenco di nomi di classi, funzioni e variabili da esportare quando si utilizza from package_name.module import *? Ho avuto fortuna con questo schema. Capisco che ci vuole un po 'più di tempo per scrivere il __all__bit all'inizio di ogni file. Ma l'importazione utilizzando "la stella della morte " sembra funzionare bene.
MikeyE

Ho appena avuto questo problema ed ero davvero confuso. Grazie per la risposta. Python non sta facendo la cosa giusta qui. Ha bisogno di un messaggio più chiaro. Detto questo, presumo che il tuo "... import *" sia solo per controllare i test, non destinato a far parte del test runner ... Penso che quest'ultimo sarebbe inappropriato.
rfportilla il

35

Uso:

./manage.py shell

seguito da

import myapp.tests

per trovare la natura dell'errore di importazione.


Apprezzo lo sforzo e sembra che questo abbia funzionato per molte persone. Ma, quando ho aperto una shell interattiva python usando ./manage.py shell, una import myapp.testso from myapp.tests import *entrambe hanno funzionato senza errori. Ma ricevo ancora l'errore descritto dall'OP.
MikeyE

21

Nel mio caso, devo creare un __init__.py vuoto nella mia app/testscartella


6

L'esempio di Steve Bradshaw sopra funziona per errori di importazione (grazie Steve).

Possono causare anche altri tipi di errori (ad es. ValueError)

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

per vedere quali sono questi errori

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

4

Ho avuto lo stesso errore di Chris. Avevo eliminato un vecchio modello, quindi eseguito tests.py, ma un altro file (views.py) stava ancora cercando di importare il modello eliminato.

Quando ho estratto la dichiarazione di importazione ormai obsoleta, il problema è stato risolto.


3

Assicurati che tutti i moduli che stai usando nello script non siano danneggiati. Con questo intendo controllare l'ortografia nelle dichiarazioni di importazione.

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

Puoi testare i tuoi moduli eseguendo le istruzioni imports nella console interattiva di djano.

$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

Ho risolto l'errore "AttributeError: module 'utils' has no attribute 'name_of_my_function'" correggendo un riferimento circolare all'importazione. I miei file manage.py e utils.py avevano ciascuno una dichiarazione di importazione che puntava l'uno verso l'altro.


1

Secondo il documento di django Quando esegui i tuoi test , il comportamento predefinito dell'utilità di test è trovare tutti i casi di test (cioè le sottoclassi di unittest.TestCase ) in qualsiasi file il cui nome inizia con test, crea automaticamente una suite di test da quei casi di test ed eseguire quella suite.

quindi prova questo: python manage.py test tests.py


1

Ho ricevuto lo stesso errore, ma ho controllato l'elenco di tutti i motivi qui, non ha risolto il mio problema.

Infine capiscilo, il motivo è che il nome di un metodo importato ma non ancora utilizzato non è corretto. Sebbene sia uno stupido errore, succede.


1

Ho avuto lo stesso errore. È risultato essere perché ho chiamato il mio modulo common.py, ma c'era già qualche altro modulo common.py. Tutto quello che dovevo fare era rinominare il mio modulo.


0

Ho avuto un errore simile durante la scrittura di unittest.TestCase. Quando ho riscritto la stessa definizione del metodo così com'è, sembrava funzionare!

L'unico cambiamento che ho notato su PyCharm è stato il pop-up dell'icona "override" la seconda volta, poiché il metodo di configurazione (self) deve sovrascrivere il metodo originale definito in TestCase.

inserisci qui la descrizione dell'immagine

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.