AttributeError: o objeto 'módulo' não tem atributo 'testes'

101

Estou executando este comando:

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

e isso causa este erro:

AttributeError: o objeto 'módulo' não tem atributo 'testes'

Abaixo está minha estrutura de diretório. Eu também adicionei app1 à minha configuração de aplicativos instalados.

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'

Estrutura do diretório:

insira a descrição da imagem aqui

Chris
fonte

Respostas:

182

Eu finalmente descobri trabalhando em outro problema. O problema é que meu teste não conseguiu encontrar uma importação.

Parece que você obtém o erro acima se o teste falhar ao importar. Isso faz sentido porque o conjunto de testes não pode importar um teste quebrado. Pelo menos eu acho que é isso que está acontecendo porque eu consertei a importação no meu arquivo de teste e com certeza ele começou a funcionar.

Para validar o seu caso de teste, tente importar o arquivo do caso de teste no console do Python.

Exemplo:

from project.apps.app1.tests import *
Chris
fonte
Má suposição nessa mensagem.
AdamC
1
Isso também pode ser feito na linha de comando, eliminando a necessidade de abrir um shell Python:python -c "from project.apps.app1.tests import *"
Hakan B.
1
1 me salvou de mensagem de erro confusa. O único problema com sua sugestão é que você importou a estrela da morte . OK no console para experimentos, mas no código, sempre importe apenas os nomes necessários.
Peter M. - representa Monica
Em vez de temer o uso da " estrela da morte ", você não pode simplesmente usar a __all__variável em cada arquivo? E especificar uma lista de nomes de classes, funções e variáveis ​​para exportar ao usar from package_name.module import *? Tive sorte com esse padrão. Eu entendo que leva um pouco mais de tempo para escrever a parte __all__no topo de cada arquivo. Mas a importação usando " estrela da morte " parece funcionar bem.
MikeyE
Eu simplesmente tive esse problema e estava muito confuso. Obrigado pela resposta. Python não está fazendo a coisa certa aqui. Precisa de uma mensagem mais clara. Dito isso, suponho que seu "... import *" seja apenas para verificar os testes, não para fazer parte do executor de testes ... acho que este último seria inadequado.
rfportilla de
35

Usar:

./manage.py shell

Seguido por

import myapp.tests

para encontrar a natureza do erro de importação.

Steve Bradshaw
fonte
Agradeço o esforço e parece que funcionou para muitas pessoas. Mas, quando abri um shell interativo Python usando ./manage.py shellentão um import myapp.testsou from myapp.tests import *ambos funcionaram sem erros. Mas, ainda recebo o erro descrito pelo OP.
MikeyE
21

Para o meu caso, preciso criar um __init__.py vazio na minha app/testspasta

tmin
fonte
6

O exemplo de Steve Bradshaw acima funciona para erros de importação (obrigado Steve).

Outros tipos de erros (por exemplo, ValueError) também podem causar

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

para ver quais são esses erros

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

Eu tive o mesmo erro que Chris. Eu havia excluído um modelo antigo e executado tests.py, mas outro arquivo (views.py) ainda estava tentando importar o modelo excluído.

Quando tirei a declaração de importação, agora obsoleta, o problema foi resolvido.

Doug Murphy
fonte
3

Certifique-se de que todos os módulos que você está usando em seu script não estejam corrompidos. Com isso, quero dizer verificar a ortografia em suas declarações de importação.

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

Você pode testar seus módulos executando instruções de importação no console interativo do 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
fonte
2

Resolvi o erro "AttributeError: módulo 'utils' não tem atributo 'name_of_my_function'" corrigindo uma referência de importação circular. Cada um dos meus arquivos manage.py e utils.py tinha uma declaração de importação apontando um para o outro.

Rudyt
fonte
1

De acordo com o documento django Quando você executa seus testes , o comportamento padrão do utilitário de teste é encontrar todos os casos de teste (isto é, subclasses de unittest.TestCase ) em qualquer arquivo cujo nome comece com test, construir automaticamente um conjunto de testes a partir de esses casos de teste e execute esse conjunto.

então tente isto: python manage.py test tests.py

Kasravnd
fonte
1

Recebi o mesmo erro, mas verifiquei todos os motivos da lista aqui, não corrigiu meu problema.

Por fim, descubra isso, o motivo é que o nome de um método que importou, mas ainda não foi usado, não está correto. Embora seja um erro estúpido, isso acontece.

Zhihong
fonte
1

Eu tive o mesmo erro. Acontece que eu chamei meu módulo de common.py, mas já havia algum outro módulo common.py. Tudo que precisei fazer foi renomear meu módulo.

Davide Andrea
fonte
0

Eu tive um erro semelhante ao escrever um unittest.TestCase. Quando redigitei a mesma definição de método atual, pareceu funcionar!

A única mudança que notei no PyCharm foi o ícone 'override' pop-up pela segunda vez, já que o método setup (self) precisa substituir o método original definido no TestCase.

insira a descrição da imagem aqui

dpsahoo
fonte