AttributeError: об’єкт 'module' не має атрибута 'тести'


101

Я виконую цю команду:

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

і це викликає цю помилку:

AttributeError: об’єкт 'module' не має атрибута 'тести'

Нижче - моя структура каталогів. Я також додав 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 *"
Hakan B.

1
+1 врятувало мене від заплутаного повідомлення про помилку. Єдина проблема вашої пропозиції полягає в тому, що ви імпортували зірку смерті . Гаразд у консолі для експериментів, але в коді завжди імпортуйте лише потрібні імена.
Пітер М. - виступає за Моніку

Замість того, щоб побоюватися використання " зірки смерті ", ви не можете використати __all__змінну у кожному файлі? І вказати список імен класів, функцій та змінних для експорту при використанні from package_name.module import *? Мені пощастило з цим малюнком. Я розумію, що потрібно записати __all__біт у верхній частині кожного файлу трохи більше часу . Але імпорт із використанням " зірки смерті ", здається, працює добре.
MikeyE

У мене просто виникло це питання, і він був справді розгублений. Дякую за відповідь. Python тут не робить правильно. Це потребує більш чіткого повідомлення. Зважаючи на це, я припускаю, що ваш "... імпорт *" - це просто перевірити тести, а не означати, що він є частиною тестового бігуна ... Я думаю, що останній був би недоцільним.
rfportilla

35

Використання:

./manage.py shell

слідом за ним

import myapp.tests

щоб знайти характер помилки імпорту.


Я ціную зусилля, і, здається, це працювало для багатьох людей. Але, коли я відкрив інтерактивну оболонку python, використовуючи ./manage.py shellтоді, або один, import myapp.testsі той чи інший from myapp.tests import *працювали без помилок. Але я все-таки отримую помилку, описану ОП.
MikeyE

21

Для мого випадку мені потрібно створити порожній __init__.py у своїй app/testsпапці


6

Приклад Стіва Бредшоу вище працює для помилок імпорту (спасибі Стів).

Інший тип помилок (наприклад, ValueError) також може спричинити

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

щоб побачити, що це за помилки

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

4

У мене була така ж помилка, як у Кріса. Я видалив стару модель, потім запустив test.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 "", встановивши циркулярну посилання на імпорт. У моїх файлах management.py та utils.py кожен був із заявою про імпорт, що вказує один на одного.


1

Згідно з документом django Під час запуску тестів поведінка тестової утиліти за замовчуванням полягає у пошуку всіх тестових випадків (тобто підкласів unittest.TestCase ) у будь-якому файлі, ім'я якого починається з тесту, автоматично будує тестовий набір із ці тестові приклади, і запустіть цей набір.

тому спробуйте це: python manage.py test tests.py


1

Я отримав таку ж помилку, але перевірив усі переліки причин тут, не усунув моєї проблеми.

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


1

У мене була така ж помилка. Це виявилося тому, що я назвав свій модуль common.py, але там вже був якийсь інший модуль common.py. Все, що мені потрібно було зробити, це перейменувати свій модуль.


0

У мене була схожа помилка під час написання unittest.TestCase. Коли я повторно набрав те саме визначення методу, що і є, здавалося, він працює!

Єдиною зміною, яку я помітив на PyCharm, було вдруге спливаюче піктограму "переосмислити", оскільки метод установки (само) потребує змінити оригінальний метод, визначений у TestCase.

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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.