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

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

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'

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

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


person Chris    schedule 29.08.2014    source источник


Ответы (11)


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

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

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

Пример:

from project.apps.app1.tests import *
person Chris    schedule 29.08.2014
comment
Плохое предположение в этом сообщении. - person AdamC; 26.01.2016
comment
Это также можно сделать из командной строки, избавляя от необходимости открывать оболочку Python: python -c "from project.apps.app1.tests import *" - person Hakan B.; 16.09.2017
comment
+1 спасло меня от запутанного сообщения об ошибке. Единственная проблема с вашим предложением заключается в том, что вы импортировали звезду смерти. Хорошо в консоли для экспериментов, но в коде всегда импортируйте только нужные имена. - person Peter M. - stands for Monica; 17.01.2018
comment
Вместо того, чтобы бояться использования звезды смерти, разве вы не можете использовать переменную __all__ в каждом файле? И укажите список имен классов, функций и переменных для экспорта при использовании from package_name.module import *? Мне повезло с этим узором. Я понимаю, что для записи бита __all__ в верхней части каждого файла требуется немного больше времени. Но импорт с использованием звезды смерти, похоже, работает нормально. - person MikeyE; 11.01.2020
comment
У меня была эта проблема, и я был очень смущен. Спасибо за ответ. Python здесь не так поступает. Требуется более четкое сообщение. При этом я предполагаю, что ваш ... import * предназначен только для проверки тестов, а не для участия в программе запуска тестов ... Я думаю, что последнее было бы неуместным. - person rfportilla; 20.04.2020
comment
Этот ответ нельзя принять, хотя он работает. Никогда не импортируйте в Python со звездочкой - person Raphaël; 19.01.2021
comment
Да, звезда была просто примером. - person Chris; 20.01.2021

Использовать:

./manage.py shell

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

import myapp.tests

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

person Steve Bradshaw    schedule 30.03.2015
comment
Я ценю усилия, и, похоже, это сработало для многих. Но когда я открыл интерактивную оболочку python с помощью ./manage.py shell, либо import myapp.tests, либо from myapp.tests import * оба работали без ошибок. Но я все еще получаю ошибку, описанную OP. - person MikeyE; 11.01.2020

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

person tmin    schedule 03.05.2016

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

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

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

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

./manage.py shell
from myapp.tests import SomeTestCase
t = SomeTestCase()
person lukeaus    schedule 25.04.2015

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

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

person Doug Murphy    schedule 25.09.2014

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

# 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
person Lukasz Dynowski    schedule 09.01.2017

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

person rudyt    schedule 29.09.2018

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

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

person kasravnd    schedule 29.08.2014

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

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

person zhihong    schedule 03.10.2016

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

person Davide Andrea    schedule 28.02.2019

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

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

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

person dpsahoo    schedule 09.11.2019