Django找到测试但无法导入它们

时间:2014-05-25 11:12:20

标签: python django testing

我遇到了奇怪的错误,调用./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时,我得到以下标记:

 $ ./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'中查找。这就是问题所在。我该如何解决?

1 个答案:

答案 0 :(得分:23)

是的...运行./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")
    ....