AttributeError: l'objet 'module' n'a pas d'attribut 'tests'

101

J'exécute cette commande:

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

et cela provoque cette erreur:

AttributeError: l'objet 'module' n'a pas d'attribut 'tests'

Voici ma structure de répertoires. J'ai également ajouté app1 à ma configuration d'applications installées.

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'

Structure du répertoire:

entrez la description de l'image ici

Chris
la source

Réponses:

182

Je l'ai finalement compris en travaillant sur un autre problème. Le problème était que mon test ne pouvait pas trouver une importation.

Il semble que vous obteniez l'erreur ci-dessus si votre test échoue à importer. Cela a du sens car la suite de tests ne peut pas importer un test interrompu. Au moins, je pense que c'est ce qui se passe car j'ai corrigé l'importation dans mon fichier de test et bien sûr, cela a commencé à fonctionner.

Pour valider votre scénario de test, essayez simplement d'importer le fichier de scénario de test dans la console Python.

Exemple:

from project.apps.app1.tests import *
Chris
la source
Mauvaise hypothèse dans ce message.
AdamC
1
Cela peut également être fait à partir de la ligne de commande, éliminant le besoin d'ouvrir un shell Python:python -c "from project.apps.app1.tests import *"
Hakan B.
1
+1 m'a sauvé d'un message d'erreur déroutant. Le seul problème avec votre suggestion est que vous avez importé l' étoile de la mort . OK dans la console pour les expériences, mais dans le code, importez toujours uniquement les noms nécessaires.
Peter M. - représente Monica le
Au lieu de craindre l'utilisation de "l' étoile de la mort ", ne pouvez-vous pas simplement utiliser la __all__variable dans chaque fichier? Et spécifiez une liste de noms de classe, de fonctions et de variables à exporter lors de l'utilisation from package_name.module import *? J'ai eu de la chance avec ce modèle. Je comprends qu'il faut un peu plus de temps pour écrire le __all__bit en haut de chaque fichier. Mais importer en utilisant " Death Star " semble bien fonctionner.
MikeyE
Je viens d'avoir ce problème et j'étais vraiment confus. Merci d'avoir répondu. Python ne fait pas la bonne chose ici. Il a besoin d'un message plus clair. Cela étant dit, je suppose que votre "... import *" est juste pour vérifier les tests, pas pour faire partie du testeur ... Je pense que ce dernier serait inapproprié.
rfportilla le
35

Utilisation:

./manage.py shell

suivi par

import myapp.tests

pour trouver la nature de l'erreur d'importation.

Steve Bradshaw
la source
J'apprécie l'effort, et il semble que cela a fonctionné pour beaucoup de gens. Mais, lorsque j'ai ouvert un shell interactif python en utilisant ./manage.py shell, l'un import myapp.testsou l' autre ou les from myapp.tests import *deux fonctionnaient sans erreur. Mais, j'obtiens toujours l'erreur décrite par l'OP.
MikeyE
21

Pour mon cas, je dois créer un __init__.py vide dans mon app/testsdossier

tmin
la source
6

L'exemple de Steve Bradshaw ci-dessus fonctionne pour les erreurs d'importation (merci Steve).

D'autres types d'erreurs (par exemple ValueError) peuvent également causer

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

pour voir quelles sont ces erreurs

./manage.py shell
from myapp.tests import SomeTestCase
t = SomeTestCase()
lukeaus
la source
4

J'ai eu la même erreur que Chris. J'avais supprimé un ancien modèle, puis exécuté tests.py, mais un autre fichier (views.py) essayait toujours d'importer le modèle supprimé.

Lorsque j'ai sorti la déclaration d'importation désormais obsolète, le problème a été résolu.

Doug Murphy
la source
3

Assurez-vous que tous les modules que vous utilisez dans votre script ne sont pas endommagés. J'entends par là vérifier l'orthographe de vos déclarations d'importation.

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

Vous pouvez tester vos modules en exécutant des instructions d'importation dans la console interactive de 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
Lukasz Dynowski
la source
2

J'ai résolu l'erreur "AttributeError: le module 'utils' n'a pas d'attribut 'name_of_my_function'" en fixant une référence d'importation circulaire. Mes fichiers manage.py et utils.py avaient chacun une instruction d'importation pointant l'un vers l'autre.

Rudyt
la source
1

Selon le document django Lorsque vous exécutez vos tests , le comportement par défaut de l'utilitaire de test est de trouver tous les cas de test (c'est-à-dire les sous-classes de unittest.TestCase ) dans tout fichier dont le nom commence par test, construire automatiquement une suite de tests à partir de ces cas de test et exécutez cette suite.

alors essayez ceci: python manage.py test tests.py

Kasravnd
la source
1

J'ai eu la même erreur, mais j'ai vérifié toutes les raisons de la liste ici, je n'ai pas résolu mon problème.

Enfin comprendre que, la raison est que le nom d'une méthode qui a importé mais pas encore utilisée n'est pas correct. Bien que ce soit une erreur stupide, cela arrive.

zhihong
la source
1

J'ai eu la même erreur. Il s'est avéré que c'était parce que j'avais nommé mon module common.py, alors qu'il y avait déjà un autre module common.py. Tout ce que j'avais à faire était de renommer mon module.

Davide Andrea
la source
0

J'ai eu une erreur similaire lors de l'écriture d'un unittest.TestCase. Lorsque j'ai retapé la même définition de méthode telle quelle, cela semblait fonctionner!

Le seul changement que j'ai remarqué sur PyCharm a été la fenêtre contextuelle de l'icône `` override '' la deuxième fois, car la méthode de configuration (auto) doit remplacer la méthode d'origine définie dans TestCase.

entrez la description de l'image ici

dpsahoo
la source