AttributeError: объект 'модуль' не имеет атрибута 'тесты'

101

Я запускаю эту команду:

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

и это вызывает эту ошибку:

AttributeError: объект 'модуль' не имеет атрибута 'тесты'

Ниже представлена ​​моя структура каталогов. Я также добавил app1 в конфигурацию моих установленных приложений.

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'

Структура каталога:

введите описание изображения здесь

Крис
источник

Ответы:

182

Я наконец понял это, работая над другой проблемой. Проблема заключалась в том, что мой тест не смог найти импорт.

Похоже, вы получите указанную выше ошибку, если не удается импортировать тест. Это имеет смысл, потому что набор тестов не может импортировать неработающий тест. По крайней мере, я думаю, что это то, что происходит, потому что я исправил импорт в моем тестовом файле, и, конечно же, он начал работать.

Чтобы проверить свой тестовый пример, просто попробуйте импортировать файл тестового примера в консоль python.

Пример:

from project.apps.app1.tests import *
Крис
источник
Плохое предположение в этом сообщении.
AdamC
1
Это также можно сделать из командной строки, что избавляет от необходимости открывать оболочку Python:python -c "from project.apps.app1.tests import *"
Хакан Б.
1
+1 спасло меня от запутанного сообщения об ошибке. Единственная проблема с вашим предложением заключается в том, что вы импортировали звезду смерти . Хорошо в консоли для экспериментов, но в коде всегда импортируйте только нужные имена.
Питер М. - расшифровывается как Monica
Вместо того, чтобы бояться использования « звезды смерти », разве вы не можете использовать __all__переменную в каждом файле? И укажите список имен классов, функций и переменных для экспорта при использовании from package_name.module import *? Мне повезло с этим узором. Я понимаю, что для записи __all__бита в верхней части каждого файла требуется немного больше времени . Но импорт с использованием « звезды смерти », похоже, работает хорошо.
MikeyE
У меня была эта проблема, и я был очень смущен. Спасибо за ответ. Python здесь поступает неправильно. Требуется более четкое сообщение. При этом, я полагаю, ваш "... import *" предназначен только для проверки тестов, а не для участия в программе запуска тестов ... Я думаю, что последнее было бы неуместным.
rfportilla
35

Использование:

./manage.py shell

с последующим

import myapp.tests

чтобы выяснить природу ошибки импорта.

Стив Брэдшоу
источник
Я ценю усилия, и, похоже, это сработало для многих. Но когда я открыл интерактивную оболочку python, используя ./manage.py shellthen, один import myapp.testsили from myapp.tests import *оба работали без ошибок. Но я все еще получаю ошибку, описанную OP.
MikeyE
21

В моем случае мне нужно создать пустой __init__.py в моей app/testsпапке

tmin
источник
6

Приведенный выше пример Стива Брэдшоу работает с ошибками импорта (спасибо Стиву).

Другой тип ошибок (например, ValueError) также может вызывать

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

чтобы увидеть, что это за ошибки

./manage.py shell
from myapp.tests import SomeTestCase
t = SomeTestCase()
Lukeaus
источник
4

У меня была та же ошибка, что и у Криса. Я удалил старую модель, затем запустил tests.py, но другой файл (views.py) все еще пытался импортировать удаленную модель.

Когда я удалил теперь уже устаревший оператор импорта, проблема решена.

Дуг Мерфи
источник
3

Убедитесь, что все модули, которые вы используете в своем скрипте, не сломаны. Под этим я подразумеваю проверку орфографии в ваших операторах импорта.

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

Вы можете протестировать свои модули, выполнив операторы импорта в интерактивной консоли 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

Я исправил ошибку «AttributeError: модуль 'utils' не имеет атрибута 'name_of_my_function'», исправив ссылку на циклический импорт. В моих файлах manage.py и utils.py был оператор импорта, указывающий друг на друга.

рудит
источник
1

Согласно документу django, когда вы запускаете тесты , поведение тестовой утилиты по умолчанию заключается в том, чтобы найти все тестовые примеры (то есть подклассы unittest.TestCase ) в любом файле, имя которого начинается с test, автоматически построить набор тестов из эти тестовые примеры и запустите этот пакет.

так что попробуйте это: python manage.py test tests.py

Касравнд
источник
1

Получил ту же ошибку, но проверил весь список причин здесь, не устранил мою проблему.

Наконец выясните, что причина в том, что имя одного метода, который был импортирован, но еще не использовался, неверно. Хотя это и глупая ошибка, но бывает.

Чжихун
источник
1

У меня была такая же ошибка. Оказалось, что это потому, что я назвал свой модуль common.py, но уже был другой модуль common.py. Все, что мне нужно было сделать, это переименовать мой модуль.

Давиде Андреа
источник
0

У меня была аналогичная ошибка при написании unittest.TestCase. Когда я повторно набрал то же определение метода как есть, казалось, что оно сработало!

Единственное изменение, которое я заметил в PyCharm, - это второй раз всплывающий значок «переопределить», поскольку метод установки (self) должен переопределить исходный метод, определенный в TestCase.

введите описание изображения здесь

dpsahoo
источник