AttributeError: el objeto 'módulo' no tiene atributo 'pruebas'

101

Estoy ejecutando este comando:

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

y causa este error:

AttributeError: el objeto 'módulo' no tiene atributo 'pruebas'

A continuación se muestra la estructura de mi directorio. También agregué app1 a la configuración de mis aplicaciones instaladas.

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'

Estructura de directorios:

ingrese la descripción de la imagen aquí

Chris
fuente

Respuestas:

182

Finalmente lo descubrí trabajando en otro problema. El problema fue que mi prueba no pudo encontrar una importación.

Parece que obtiene el error anterior si su prueba no se puede importar. Esto tiene sentido porque el conjunto de pruebas no puede importar una prueba rota. Al menos creo que esto es lo que está sucediendo porque arreglé la importación dentro de mi archivo de prueba y, efectivamente, comenzó a funcionar.

Para validar su caso de prueba, intente importar el archivo del caso de prueba en la consola de Python.

Ejemplo:

from project.apps.app1.tests import *
Chris
fuente
Mala suposición en ese mensaje.
AdamC
1
Esto también se puede hacer desde la línea de comandos, eliminando la necesidad de abrir un shell de Python:python -c "from project.apps.app1.tests import *"
Hakan B.
1
+1 me salvó de un mensaje de error confuso. El único problema con tu sugerencia es que importaste la estrella de la muerte . Está bien en la consola para experimentos, pero en el código, siempre importe solo los nombres necesarios.
Peter M. - representa a Monica
En lugar de temer el uso de la " estrella de la muerte ", ¿no se puede simplemente usar la __all__variable en cada archivo? ¿Y especificar una lista de nombres de clases, funciones y variables para exportar cuando se usa from package_name.module import *? He tenido buena suerte con este patrón. Entiendo que se necesita un poco más de tiempo para escribir el __all__bit en la parte superior de cada archivo. Pero la importación con " estrella de la muerte " parece funcionar bien.
MikeyE
Acabo de tener este problema y estaba realmente confundido. Gracias por la respuesta. Python no está haciendo lo correcto aquí. Necesita un mensaje más claro. Dicho esto, supongo que su "... importación *" es solo para verificar las pruebas, no pretende ser parte del corredor de pruebas ... Creo que lo último sería inapropiado.
rfportilla
35

Utilizar:

./manage.py shell

seguido por

import myapp.tests

para encontrar la naturaleza del error de importación.

Steve Bradshaw
fuente
Agradezco el esfuerzo y parece que esto funcionó para muchas personas. Pero, cuando abrí un shell interactivo de Python usando ./manage.py shell, uno import myapp.testso from myapp.tests import *ambos funcionaron sin error. Pero sigo recibiendo el error descrito por el OP.
MikeyE
21

Para mi caso, necesito crear un __init__.py vacío en mi app/testscarpeta

tmin
fuente
6

El ejemplo anterior de Steve Bradshaw funciona para errores de importación (gracias Steve).

Otro tipo de errores (por ejemplo, ValueError) también pueden causar

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

para ver cuáles son estos errores

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

Tuve el mismo error que Chris. Había eliminado un modelo antiguo, luego ejecuté tests.py, pero otro archivo (views.py) todavía estaba intentando importar el modelo eliminado.

Cuando saqué la declaración de importación ahora obsoleta, el problema se resolvió.

Doug Murphy
fuente
3

Asegúrese de que todos los módulos que está utilizando en su secuencia de comandos no estén dañados. Con esto me refiero a revisar la ortografía en sus declaraciones de importación.

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

Puede probar sus módulos ejecutando declaraciones de importación en la consola interactiva 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
fuente
2

Resolví el error "AttributeError: el módulo 'utils' no tiene el atributo 'name_of_my_function'" arreglando una referencia de importación circular. Mis archivos manage.py y utils.py tenían cada uno una declaración de importación apuntando entre sí.

Rudyt
fuente
1

De acuerdo con el documento de django Cuando ejecuta sus pruebas , el comportamiento predeterminado de la utilidad de prueba es encontrar todos los casos de prueba (es decir, subclases de unittest.TestCase ) en cualquier archivo cuyo nombre comience con prueba, automáticamente construya una suite de pruebas a partir de esos casos de prueba y ejecutar esa suite.

así que prueba esto: python manage.py test tests.py

Kasravnd
fuente
1

Obtuve el mismo error, pero verifiqué todas las razones aquí, no solucionó mi problema.

Finalmente, averigüe que la razón es que el nombre de un método que se importó pero que aún no se usó no es correcto. Aunque es un error estúpido, sucede.

zhihong
fuente
1

Yo tenía el mismo error. Resultó ser porque nombré a mi módulo common.py, pero ya había algún otro módulo common.py. Todo lo que tenía que hacer era cambiar el nombre de mi módulo.

Davide Andrea
fuente
0

Tuve un error similar al escribir un unittest.TestCase. Cuando volví a escribir la misma definición de método tal como estaba, ¡pareció funcionar!

El único cambio que noté en PyCharm fue el icono emergente 'anular' la segunda vez, ya que el método de configuración (auto) debe anular el método original definido en TestCase.

ingrese la descripción de la imagen aquí

dpsahoo
fuente