Django находит тесты, но не импортирует их

Я получаю странные ошибки, когда вызов ./manage.py test найдет мои тесты, но жалуется, что они не могут быть импортированы.

Версии

Python 3.4

Django 1.7b4

Моя файловая структура

выглядит так (только соответствующие биты):

 inkasso ├── db.sqlite3 ├── functional_tests │  ├── base.py │  ├── base.pyc │  ├── __init__.py │  ├── __init__.pyc │  ├── __pycache__ │  ├── test_login.py │  └── test_login.pyc ├── __init__.py ├── inkasso │  ├── __init__.py │  ├── __init__.pyc │  ├── migrations │  ├── models.py │  ├── settings.py │  ├── settings.pyc │  ├── urls.py │  └── wsgi.py ├── manage.py ├── static │  ├── ... ├── templates │  ├── ... └── web ├── admins.py ├── tests │  ├── __init__.py │  ├── test_forms.py │  ├── test_models.py │  └── test_views.py ├── urls.py └── views.py 

Трассировка стека

Поэтому, когда я запускаю ./manage.py test я получаю следующий stak-trace:

  $ ./manage.py test Creating test database for alias 'default'... EEEE ====================================================================== ERROR: inkasso.functional_tests.test_login (unittest.loader.ModuleImportFailure) ---------------------------------------------------------------------- Traceback (most recent call last): File "/usr/lib/python3.4/unittest/case.py", line 57, in testPartExecutor yield File "/usr/lib/python3.4/unittest/case.py", line 574, in run testMethod() File "/usr/lib/python3.4/unittest/loader.py", line 32, in testFailure raise exception ImportError: Failed to import test module: inkasso.functional_tests.test_login Traceback (most recent call last): File "/usr/lib/python3.4/unittest/loader.py", line 312, in _find_tests module = self._get_module_from_name(name) File "/usr/lib/python3.4/unittest/loader.py", line 290, in _get_module_from_name __import__(name) ImportError: No module named 'inkasso.functional_tests' ====================================================================== ERROR: inkasso.web.tests.test_forms (unittest.loader.ModuleImportFailure) ---------------------------------------------------------------------- Traceback (most recent call last): File "/usr/lib/python3.4/unittest/case.py", line 57, in testPartExecutor yield File "/usr/lib/python3.4/unittest/case.py", line 574, in run testMethod() File "/usr/lib/python3.4/unittest/loader.py", line 32, in testFailure raise exception ImportError: Failed to import test module: inkasso.web.tests.test_forms Traceback (most recent call last): File "/usr/lib/python3.4/unittest/loader.py", line 312, in _find_tests module = self._get_module_from_name(name) File "/usr/lib/python3.4/unittest/loader.py", line 290, in _get_module_from_name __import__(name) ImportError: No module named 'inkasso.web' ====================================================================== ERROR: inkasso.web.tests.test_models (unittest.loader.ModuleImportFailure) ---------------------------------------------------------------------- Traceback (most recent call last): File "/usr/lib/python3.4/unittest/case.py", line 57, in testPartExecutor yield File "/usr/lib/python3.4/unittest/case.py", line 574, in run testMethod() File "/usr/lib/python3.4/unittest/loader.py", line 32, in testFailure raise exception ImportError: Failed to import test module: inkasso.web.tests.test_models Traceback (most recent call last): File "/usr/lib/python3.4/unittest/loader.py", line 312, in _find_tests module = self._get_module_from_name(name) File "/usr/lib/python3.4/unittest/loader.py", line 290, in _get_module_from_name __import__(name) ImportError: No module named 'inkasso.web' ====================================================================== ERROR: inkasso.web.tests.test_views (unittest.loader.ModuleImportFailure) ---------------------------------------------------------------------- Traceback (most recent call last): File "/usr/lib/python3.4/unittest/case.py", line 57, in testPartExecutor yield File "/usr/lib/python3.4/unittest/case.py", line 574, in run testMethod() File "/usr/lib/python3.4/unittest/loader.py", line 32, in testFailure raise exception ImportError: Failed to import test module: inkasso.web.tests.test_views Traceback (most recent call last): File "/usr/lib/python3.4/unittest/loader.py", line 312, in _find_tests module = self._get_module_from_name(name) File "/usr/lib/python3.4/unittest/loader.py", line 290, in _get_module_from_name __import__(name) ImportError: No module named 'inkasso.web' ---------------------------------------------------------------------- Ran 4 tests in 0.001s FAILED (errors=4) Destroying test database for alias 'default'... 

Таким образом, тестовый бегун находит мои тесты, но по какой-то причине они не импортируются. Я понятия не имею, что происходит. Трассировка стека не очень помогает мне 🙁

Поскольку корневая папка называется inkasso и у нее есть модуль с таким же именем, я попытался поместить print(os.getcwd) и print(sys.path) в manage.py, и все, что было показано, было то, что CWD и путь были установлены чтобы указать на корневую папку, так что все должно быть хорошо, нет? Само приложение работает так, как ожидалось. Это только те тесты, которые не работают.

Для хихиканья я попытался создать пустой модуль «web» в inkasso.inkasso, в результате чего вместо того, чтобы жаловаться, что inkasso.web не существует, он теперь жалуется, что inkasso.web.tests не существует. Таким образом, это показывает, что вместо поиска в корневой папке «inkasso» она выглядит в «inkasso.inkasso». Вот в чем проблема. Как я могу это исправить?

One Solution collect form web for “Django находит тесты, но не импортирует их”

Да … есть проблема с запуском ./manage.py , поскольку он добавляет текущий каталог в PYTHONPATH.

Эта проблема возникает, если вы вставляете __init__.py в корневую папку.

Одним из решений было бы в этом случае никогда не использовать manage.py , а только django-admin.py <commands> --settings=inkasso.inkasso.settings – конечно, это предполагает, что при выполнении этой команды вы, на один уровень вверх, вне вашей корневой папки inkasso , или у вас есть основной пакет, установленный в site-packages .

Например, если полный путь к вашему файлу settings.py/home/user/projects/inkasso/inkasso/settings.py , вы должны быть в /home/user/projects при выполнении этой команды.

Если, однако, у вас есть пакет, установленный внутри ваших пакетов сайтов, это ограничение изменяется: вы можете быть где угодно, кроме /home/user/projects/inkasso или любой из его подпапок или так далее.

Еще одно решение – отредактировать файл manage.py чтобы добавить эту строку:

 if __name__ =='__main__': #line already present #this will make the python interpreter see your packages as inkasso.inkasso.whatever os.chdir('..') # <<<---This is what you want to add os.environ.setdefault("DJANGO_SETTINGS_MODULE", "mvod.dev_settings") .... 
  • Как сделать запрос, который фильтрует строки, в которых один столбец равен другой одной таблице?
  • Ошибка URL-адреса почтового ящика Django
  • Должны видеть видео конференции для разработчиков Python / Django
  • Производительность между Django и raw Python
  • Добавление настраиваемых полей в модель django (без изменений в исходном коде)
  • Условная логика в формах джанго
  • Django уникальный, пустой и пустой CharField, дающий ошибку «уже существует» на странице администратора
  • Django: добавьте поле в модельную форму
  • Python - лучший язык программирования в мире.